天天看點

如何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

本文轉自xiaocao1314051CTO部落格,原文連結:http://blog.51cto.com/xiaocao13140/1932959,如需轉載請自行聯系原作者