Oracle用戶會話信息的查詢方法
Oracle用戶會話相信大家都比較了解,下面為您介紹的就是Oracle用戶會話信息的查詢方法,該方法供您參考,如果您感興趣的話,不妨一看。
過V$SESSION視圖,可以查詢Oracle所有Oracle用戶會話信息:
- select sid,logon_time,username,machine from v$session;
通過分組,統(tǒng)計每個不同的用戶或主機打開的Oracle用戶會話總數(shù):
- select username,machine,count(*) from v$session group by username,machine;
根據(jù)SID和SERIAL#可以終止用戶會話:
- ALTER SYSTEM KILL SESSION 'v_sid,v_serial#' immediate;
Oracle用戶會話的SID和SERIAL#可以通過V$SESSION視圖查到:
- SQL> select sid,serial#,username, machine,status from v$session where username like 'PCNSH%';
- SID SERIAL# USERNAME MACHINE STATUS
- -------- ---------- --------------- ------------------------------- --------
- 366 14303 PCNSH197 client197.yourdomain.com INACTIVE
- 369 1745 PCNSH003 server009 INACTIVE
- 370 10165 PCNSH049 client049.yourdomain.com INACTIVE
- 371 18999 PCNSH056 client056 INACTIVE
- 372 6207 PCNSH056 client056 INACTIVE
- 373 7688 PCNSH197 client197.yourdomain.com INACTIVE
- 374 19246 PCNSH003 server009 INACTIVE
- 377 17649 PCNSH003 server009 INACTIVE
在Oracle中終止掉的會話只有在這個進程再次嘗試連接Oracle時才會被pmon清除,在進程再次嘗試連接之前,查詢V$SESSION視圖時還是可以看到該會話。
當(dāng)用戶會話無法響應(yīng)時,上面的方法可能無法終止用戶會話,只好直接殺死系統(tǒng)進程(謹(jǐn)慎)。
用戶會話對應(yīng)的系統(tǒng)進程可以通過V$SESSION和V$PROCESS兩個視圖來查詢,通過會話的SID和SERIAL#可以查詢到系統(tǒng)進程號。
- SQL> select p.spid from v$session s, v$process p
- where p.addr=s.paddr and s.sid=518 and s.serial#=41831;
- SPID
- ------------
- 16782
然后在操作系統(tǒng)中殺死進程:
kill -9 16782
某些軟件會在啟動時打開多個會話,當(dāng)軟件異常退出時,要批量的終止這些會話。存儲過程基于用戶名條件批量終止會話,創(chuàng)建存儲過程腳本kill_user.sql如下:
- create or replace procedure kill_user(v_name in varchar2)
- as
- message varchar2(50);
- cursor loguser is select sid,serial# from v$session where username=upper(v_name);
- v_info loguser%rowtype;
- sql_mgr varchar2(1000);
- i number default 0;
- begin
- open loguser;
- loop
- fetch loguser into v_info;
- exit when loguser%notfound;
- i :=1;
- sql_mgr :='alter system kill session '''||v_info.sid||','||v_info.serial#||''' immediate';
- execute immediate sql_mgr;
- dbms_output.put_line('All the sessions of '||v_name||' have been killed');
- end loop;
- close loguser;
- if i=0 then
- raise_application_error(-20004,'The user '||v_name||' is not login the database currently!');
- end if;
- exception
- when no_data_found then
- raise_application_error(-20004,'The user '||v_name||' is not login the database currently!');
- end;
- /
調(diào)用上面存儲過程,終止用戶所有進程的方法如下:
- SQL> execute kill_user('user_name');
【編輯推薦】