Oracle DML和DDL鎖的解決方法
阿新 • • 發佈:2019-02-14
二、DDL鎖解決辦法
假設鎖在會話1上
session1:
create or replace procedure p_test is
begin
dbms_lock.sleep(1000);
end;
call p_test();
系統現在無法完成DML操作,這個時候要人工造成一個鎖等待衝突的現象
session2:
select sid from v$mystat where rownum=1; --134 先查出被堵塞會話id
drop procedure p_test;
排除,解決
session3:
--找到被堵塞會話中,可以看到行鎖的等待事件enq: TX - row lock contention,還可以看到製造堵塞的源頭
select w.EVENT,w.BLOCKING_INSTANCE,w.BLOCKING_SESSION from v$session w where w.sid=134;
EVENT BLOCKING_INSTANCE BLOCKING_SESSION
---------------------------------------------------------------- ----------------- ----------------
library cache pin 1 202
查詢到源頭的會話資訊
select s.INST_ID,s.SID,s.SERIAL# from gv$session s where s.INST_ID =1 and s.SID =202;
INST_ID SID SERIAL#
---------- ---------- ----------
1 202 105
現在例項1上殺會話:
alter system kill session '202,105';
有的時候不一定能殺掉,則需要在作業系統層面上殺:
select spid
from gv$process p, gv$session s
where p.INST_ID = s.INST_ID
and p.INST_ID = 1
and s.SID = 202
and s.SERIAL# = 105
and p.ADDR = s.PADDR;
SPID
-----
27008
登陸例項1執行
kill -9 27008
假設鎖在會話1上
session1:
create or replace procedure p_test is
begin
dbms_lock.sleep(1000);
end;
call p_test();
系統現在無法完成DML操作,這個時候要人工造成一個鎖等待衝突的現象
session2:
select sid from v$mystat where rownum=1; --134 先查出被堵塞會話id
drop procedure p_test;
排除,解決
session3:
--找到被堵塞會話中,可以看到行鎖的等待事件enq: TX - row lock contention,還可以看到製造堵塞的源頭
select w.EVENT,w.BLOCKING_INSTANCE,w.BLOCKING_SESSION from v$session w where w.sid=134;
EVENT BLOCKING_INSTANCE BLOCKING_SESSION
---------------------------------------------------------------- ----------------- ----------------
library cache pin 1 202
查詢到源頭的會話資訊
select s.INST_ID,s.SID,s.SERIAL# from gv$session s where s.INST_ID =1 and s.SID =202;
INST_ID SID SERIAL#
---------- ---------- ----------
1 202 105
現在例項1上殺會話:
alter system kill session '202,105';
有的時候不一定能殺掉,則需要在作業系統層面上殺:
select spid
from gv$process p, gv$session s
where p.INST_ID = s.INST_ID
and p.INST_ID = 1
and s.SID = 202
and s.SERIAL# = 105
and p.ADDR = s.PADDR;
SPID
-----
27008
登陸例項1執行
kill -9 27008