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

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

能夠以Oralce管理員權限用戶登陸Oracle數據,查詢到被鎖的對象,而後殺除指定的會話。session

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

    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   it

    AND  a.SESSION_ID = c.sid(+)    io


殺Seesion的SQL語句語法以下:class

    alter system kill session 'sid, serial#'   import

如上面查出來的一條記錄的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
相關文章
相關標籤/搜索