最近在執行一個大業務量的預存程序,中間中斷,造成了對某個表的鎖。這時我再想修改預存程序,則因為這個鎖的存在,一直在等待。
在pl/sql developer中將這個session的狀態設定為KILLED,結果等了半天也沒有被PMON給清除掉,一直在那鎖表。參考一些資料,可以用下面的方法解鎖。
--下面這個sql語句,可以列出來各個指令碼,需要錄入sid,這個sid可以從pl/sql developer的session中查到。
SELECT 'alter system kill session ''' || ta.sid || ',' || ta.serial# || ''';',
'alter system disconnect session ''' || ta.sid || ',' || ta.serial# || ''' immediate;',
'host orakill ' || tc.instance_name || ' ' || tb.spid,
'kill -9 ' || tb.spid,
tb.spid,
ta.osuser,
tb.program,
ta.terminal,
ta.program
FROM v$session ta, v$process tb, v$instance tc
WHERE tb.addr = ta.paddr
AND ta.sid = &yoursid;
-- 也可以用這個Metalink提供的指令碼,其中的os thread就是在orakill 時寫的spid
select p.spid "OS Thread", b.name "Name-User", s.osuser, s.program
from v$process p, v$session s, v$bgprocess b
where p.addr = s.paddr
and p.addr = b.paddr UNION ALL
select p.spid "OS Thread", s.username "Name-User", s.osuser, s.program
from v$process p, v$session s
where p.addr = s.paddr
and s.username is not null;
然後執行c:/>orakill oracle_sid os_thread,就可以殺掉killed的進程了。注意要避免殺系統進程,避免資料庫宕機。