有些時候,當Client 端不正常結束時,會造成session 殘留在DB裡,為了避免影響到DB的效能,必須手動將這些session kill
1. 找出要kill 的session
kill session 算是一件危險的動作,所以在kill 之前要先確認一下哪些session 是可以kill 的,避免刪除到不該刪除的session, Oracle提供了v$session,gv$session這兩個view 來查詢session
在不是RAC的環境下,只需要查詢v$session 即可
SELECT S.SID, S.SERIAL#, S.USERNAME, S.OSUSER , S.MACHINE, S.PROGRAM , P.SPID FROM V$SESSION S , V$PROCESS P WHERE S.PADDR = P.ADDR AND S.TYPE !='BACKGROUND' AND S.OSUSER !='oracle' SID SERIAL# SPID USERNAME OSUSER MACHINE PROGRAM SPID ----- ---------- -------- --------- ---------------- --------- ---------------- ----- 30 15 3859 TEST Administrator VM JDBC Thin Client 345 23 287 3834 SYS Administrator VM JDBC Thin Client 593
如果是RAC的環境,需要改查gv$session
SELECT S.INST_ID, S.SID, S.SERIAL#, S.USERNAME, S.OSUSER , S.MACHINE, S.PROGRAM , P.SPID FROM GV$SESSION S , GV$PROCESS P WHERE S.PADDR = P.ADDR AND S.TYPE !='BACKGROUND' AND S.OSUSER !='oracle' INST_ID SID SERIAL# SPID USERNAME OSUSER MACHINE PROGRAM SPID --------------- ---------- -------- --------- ---------------- --------- ---------------- ----- 1 30 15 3859 TEST Administrator VM JDBC Thin Client 345 1 23 287 3834 SYS Administrator VM JDBC Thin Client 593
2. Kill Session Syntax
一般環境下kill session syntax如下
SQL> ALTER SYSTEM KILL SESSION 'sid,serial#';
在RAC的環境下kill session 要加上INST_ID
ALTER SYSTEM KILL SESSION 'sid,serial#,@inst_id';
一般情況下kill session 指令並不會真正的刪除session, 而是要求session 自行刪除,但在某些情況session並不會自行刪除,例如session 正在rollback transaction,此時可以透過immediate參數來強制刪除session
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
3. DISCONNECT SESSION Syntax
disconnect session 和 kill ssession 的作用很類似,不同在於disconnect session 刪除server process
ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' POST_TRANSACTION; ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' IMMEDIATE;
POST_TRANSACTION 參數會等待正在執行的transcation執行完畢
IMMEDIATE參數會強制結束server process
4. Kill O.S. process
kill session 之後,有時process 會殘留在O.S.上, 這個時候就需要透過O.S.的指令來刪除殘留的porcess
Windows
C:> orakill ORACLE_SID spid
Unix/Linux
% kill spid % kill -9 spid
留言列表