如何殺掉(kill)Oracle中的會話(Session)


Oracle中造成一些表被死鎖或者會話異常退出,如執行了更新記錄操作后,既沒有commit也沒有rollback,網絡就斷開了,也會造表或記錄被鎖住,待到超時后才會被解開,那樣都會造成應用操作被阻塞。

可以以Oralce管理員權限用戶登錄Oracle數據,查詢到被鎖的對象,然后殺除指定的會話。

用下面的語句查詢被鎖的對象,可以帶上更多約束條件,如schemaname等更精確的匹配。

    SELECT  a.object_id, a.session_id, b.object_name, c.*   

    FROM  v$locked_object a, dba_objects b, v$session c  

    WHERE  a.object_id = b.object_id  

    AND  a.SESSION_ID = c.sid(+)   


殺Seesion的SQL語句語法如下:

    alter system kill session 'sid, serial#'   

如上面查出來的一條記錄的sid是53, serial#為663,就執行以下的語句

    alter system kill session '53,663'   

如果要一次性殺死多個會話,一個一個填寫sid和serial#十分的繁瑣,應該在查詢被鎖對象的同時拼湊出多條的殺會話語句,以分號分隔,一起復制下來,然后就可以批量的執行了。

拼湊kill語句的方式如下,下面加了一個過濾條件和一個排序,殺除真正關心的表,並且着重注意超時時間過長的會話。

 
SELECT 'alter system kill session ''' || c.sid || '' || ',' || c.serial# ||''';',
       a.object_id, a.session_id, b.object_name, c.*
  FROM v$locked_object a, dba_objects b, v$session c
 WHERE a.object_id = b.object_id
   AND a.SESSION_ID = c.sid(+)
   AND schemaname = 'Unmi'
 ORDER BY logon_time


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM