Oracle用戶會話相信大家都比較了解,下面為您介紹的就是Oracle用戶會話信息的查詢方法,該方法供您參考,如果您感興趣的話,不妨一看。
過V$SESSION視圖,可以查詢Oracle所有Oracle用戶會話信息:
- select sid,logon_time,username,Machine from v$session;
通過分組,統計每個不同的用戶或主機打開的Oracle用戶會話總數:
- select username,machine,count(*) from v$session group by username,Machine;
根據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視圖時還是可以看到該會話。
當用戶會話無法響應時,上面的方法可能無法終止用戶會話,只好直接殺死系統進程(謹慎)。
用戶會話對應的系統進程可以通過V$SESSION和V$PROCESS兩個視圖來查詢,通過會話的SID和SERIAL#可以查詢到系統進程號。
- 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
然後在操作系統中殺死進程:
kill -9 16782
某些軟件會在啟動時打開多個會話,當軟件異常退出時,要批量的終止這些會話。存儲過程基於用戶名條件批量終止會話,創建存儲過程腳本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;
- /
調用上面存儲過程,終止用戶所有進程的方法如下:
- SQL> execute kill_user('user_name');