Oracle KILL 會話的三種方式

通常會用ALTER SYSTEM KILL SESSION 'sid,serial#'殺掉指定會話,但有時會發現執行後只是將會話狀態標記爲KILLED,依然會阻塞其它會話,數據庫也不會立即釋放相關資源。網上查資料Oracle KILL 會話有三種方式,下面分別來看:

 

一、 ALTER SYSTEM KILL SESSION

alter system kill session實際上不是真正的殺死會話,它只是將會話標記爲終止。等待PMON進程來清除會話。

當在Oracle中kill session以後,Oracle只是簡單的把相關session的paddr 指向同一個虛擬地址。此時v$process和v$session失去關聯,進程就此中斷。然後Oracle就等待PMON去清除這些Session。所以通常等待一個被標記爲Killed的Session退出需要花費很長的時間。如果此時被Kill的process,重新嘗試執行任務,那麼馬上會收到進程中斷的提示,process退出,此時Oracle會立即啓動PMON來清除該session,這被作爲一次異常中斷處理。

可以使用IMMEDIATE關鍵字 回滾事務、釋放會話持有的鎖、並立即返回當前會話的控制權。

ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
-- kill指定用戶非活躍會話
select 'alter system kill session '''||s.sid||','||s.SERIAL#||''' immediate;' from v$session s where s.status='INACTIVE' and s.USERNAME= upper('xxx');

官方文檔說明如下:

The KILL SESSION clause lets you mark a session as terminated, roll back ongoing transactions, release all session locks, and partially recover session resources. To use this clause, your instance must have the database open. 

If the session is performing some activity that must be completed, such as waiting for a reply from a remote database or rolling back a transaction, then Oracle Database waits for this activity to complete, marks the session as terminated, and then returns control to you. If the waiting lasts a minute, then Oracle Database marks the session to be terminated and returns control to you with a message that the session is marked to be terminated. The PMON background process then marks the session as terminated when the activity is complete.

Specify IMMEDIATE to instruct Oracle Database to roll back ongoing transactions, release all session locks, recover the entire session state, and return control to you immediately.

 

二、 ALTER SYSTEM DISCONNECT SESSION

ALTER SYSTEM DISCONNECT SESSION 等價於從操作系統殺掉進程。有兩個選項:POST_TRANSACTION和IMMEDIATE;POST_TRANSACTION表示等待事務完成後斷開會話,IMMEDIATE表示中斷會話,立即回滾事務。

ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' POST_TRANSACTION;
ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' IMMEDIATE;

 

三、操作系統KILL進程

可以使用下面SQL語句找到對應的操作系統進程SPID,在執行前,一定要謹慎確認。

select SPID from v$process where addr in (SELECT PADDR FROM V$SESSION WHERE USERNAME='xxx');
-- 或者
SET LINESIZE 100
COLUMN spid FORMAT A10
COLUMN username FORMAT A10
COLUMN program FORMAT A45
 
SELECT s.inst_id,
       s.sid,
       s.serial#,
       p.spid,
       s.username,
       s.program
FROM   gv$session s
       JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id
WHERE  s.type != 'BACKGROUND';

操作系統執行

#Linux
KILL -9 SPID

#Windows
orakill ORACLE_SID spid

要在數據庫徹底殺掉一個會話,尤其是大事務會話,最好是使用ALTER SYSTEM DISCONNECT SESSION IMMEDIATE或使用下面步驟(反之亦可):

  • 在操作系統級別Kill掉進程。
  • 在數據庫內部KILL SESSION

 

參考

https://www.cnblogs.com/andy6/p/5778363.html

https://www.cnblogs.com/kerrycode/p/4034231.html

https://www.eygle.com/faq/Kill_Session.htm

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章