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