有時候死鎖時需要殺死的程序有太多,乙個個殺會很麻煩。
因此考慮用語句進行批量殺
這裡要用到的是 單引號與變數拼接,我最初一直卡在這裡。在網上搜到後才解決
最初版:
declare cursor mycur is
select b.username,b.sid,b.serial#,logon_time
from v$locked_object a,v$session b
where a.session_id = b.sid order by b.logon_time;
begin
for cur in mycur
loop
select count(1) into newcount from v$locked_object a,v$session b
where a.session_id = b.sid and b.sid=cur.sid and b.serial#=cur.serial# order by b.logon_time;
execute immediate ( 'alter system kill session '''||cur.sid || ','|| cur.serial# ||''' ');
end loop;
end;
提示會話id不存在,剛開始想不通,後來想通了,應該是select語句查出來的sid,serial#存在重複的情況,前面已經kill掉了以後,後面再對這個sid,serial#進行kill就會提示不存在了,所以考慮每次實時進行查詢是否還存在,在execute前加乙個判斷。
改版:declare cursor mycur is
select b.username,b.sid,b.serial#,logon_time
from v$locked_object a,v$session b
where a.session_id = b.sid order by b.logon_time;
newcount number;
begin
for cur in mycur
loop
select count(1) into newcount from v$locked_object a,v$session b
where a.session_id = b.sid and b.sid=cur.sid and b.serial#=cur.serial# order by b.logon_time;
if newcount>=1 then
execute immediate ( 'alter system kill session '''||cur.sid || ','|| cur.serial# ||''' ');
end if;
end loop;
end;
執行後發現有效果,但是很慢。
所以想到直接避免迴圈中每次再去查詢:
[sql]
view plain
copy
declare
cursor
mycur
isselect
b.sid,b.serial#
from
v$locked_object a,v$session b
where
a.session_id = b.sid
group
byb.sid,b.serial#;
begin
forcur
inmycur
loop
execute
immediate (
'alter system kill session '
''||cur.sid ||
','|| cur.serial# ||
''' '
);
endloop;
end;
Oracle殺死死鎖程序
oracle殺死死鎖程序 先檢視哪些表被鎖住了 select b.object name,a.session id,c.serial a.locked mode from v locked object a,dba objects b,v session c where b.object id a....
Oracle 殺死死鎖程序
oracle 殺死死鎖程序 利用pl sql developer工具可以很容易模擬死鎖現象。用同乙個資料庫的同乙個使用者登入2個pl sql developer。首先,在其中乙個pl sql developer隨便對資料庫的表執行乙個更新操作,不要提交,狀態為 待提交 然後,在另乙個pl sql d...
Oracle 殺死死鎖程序
利用pl sql developer工具可以很容易模擬死鎖現象。用同乙個資料庫的同乙個使用者登入2個pl sql developer。首先,在其中乙個pl sql developer隨便對資料庫的表執行乙個更新操作,不要提交,狀態為 待提交 然後,在另乙個pl sql developer執行同樣的操...