09月22日, 2014 145次
正文引见了“在Oracle RAC情况中定位和中断最后被遏止的对话的本领是什么”的常识。很多人在本质案例的操纵中会遇到如许的艰巨。让边肖率领你进修怎样处置那些情景。蓄意大师刻意观赏,学点货色!
试验情况:
甲骨文RAC 11.2.0.4(2个节点)
1.模仿波折:对话被级联遏止。
2.惯例本领:梳理出结果阻碍的对话。
3.矫正本领:登时找到结果阻碍的对话。
本来我之前也写过一篇关系的作品:
怎样定位Oracle数据库锁定对话的根目次?
1.模仿妨碍:对话被级联阻碍
筹备处事:
在这边,我在每个范例中翻开两个对话来模仿负载平稳形式下RAC的交易对话:
示例:对话1,对话2;
示例2:对话3,对话4;
从功夫点1-功夫点2-功夫点3-功夫点4在此功夫轴上实行以次操纵:
功夫点1:
范例1的对话1(INS1-session1)中的实行语句未提交或回滚:
采用* frov $ mystatwhrownum=1;
updateempsetsal=8000 where empno=7788;功夫点2:
实行范例2的对话3(INS2-session3)中的语句:
采用* frov $ mystatwhrownum=1;
deletefromempwhereempno=7839
updateempsetjob= MANAGER where empno=7788;
回滚;功夫点3:
实行范例2的对话4(INS2-session4)中的语句:
采用* frov $ mystatwhrownum=1;
updateempsetsal=15000 where empno=7839;
回滚;功夫点4:
在范例1的对话2(INS1-session2)中实行语句:
采用* frov $ mystatwhrownum=1;
updateempsetjob= CEO where empno=7839;
回滚;这时候不妨看到,接下来三个功夫点操纵的对话都挂了,鲜明是被樊篱了。4节课的局面如次:
那么她们被谁挡住了呢?底下将精细领会。
00-1010,咱们会去GV$SESSION查问blocking_session,而后看这个blocking_ses。
sion有没有又被其余对话阻碍,直到找到基础。
--blocking
set lines 180
col program for a30
col machine for a20
select inst_id,
SID,
SERIAL#,
event,
machine,
sql_id,
blocking_session,
blocking_instance
from gv$session
where blocking_session is not null;
截止如次:
SYS@jyzhao1 --blocking
SYS@jyzhao1 set lines 180
SYS@jyzhao1 col program for a30
SYS@jyzhao1 col machine for a20
SYS@jyzhao1 select inst_id,
2 SID,
3 SERIAL#,
4 event,
5 machine,
6 sql_id,
7 blocking_session,
8 blocking_instance
9 from gv$session
10 where blocking_session is not null;
INST_ID SID SERIAL# EVENT MACHINE SQL_ID BLOCKING_SESSION BLOCKING_INSTANCE
---------- ---------- ---------- ---------------------------------------- -------------------- ------------- ---------------- -----------------
1 146 6283 enq: TX - row lock contention jyrac1 052gy77vp276s 25 2
2 25 10250 enq: TX - row lock contention jyrac2 3t2npbvdcf2d2 150 1
2 145 32069 enq: TX - row lock contention jyrac2 0ct116qw46shq 25 2
SYS@jyzhao1
不妨看到范例1的sid=146的对话以及范例2的sid=145的对话都被范例2的sid=25的对话阻碍,而范例2的sid=25的这个对话又被范例1的sid=150的对话阻碍。这个例子只模仿了几个对话姑且不妨赶快定位,但即使是如实妨碍,很大概受感化的不只这么几个对话,固然也不妨渐渐最后找到来,但究竟会看的扑朔迷离是否。咱们骄气的DBA又如何会甘愿从来去做这种工作呢?
3.矫正本领:登时找到最后阻碍对话
之前我在单范例大概确认交易只跑在某一个节点的情况,从来在用的一个找到最后阻碍对话的剧本:
--cascade blocking
set lines 200 pages 100
col tree for a30
col event for a40
select *
from (select a.sid, a.serial#,
a.sql_id,
a.event,
a.status,
connect_by_isleaf as isleaf,
sys_connect_by_path(SID, - ) tree,
level as tree_level
from v$session a
start with a.blocking_session is not null
connect by nocycle a.sid = prior a.blocking_session)
where isleaf = 1
order by tree_level asc;
这个剧本用到了start with connect by prior 的递归查问用法,特殊简单不妨径直找到最后阻碍的对话;可即使是RAC,交易是负载平衡跑在多个节点的,那上头的这个剧本就不好用了,比方我上头结构的这个例子,就须要精确查出各个对话辨别在哪个范例上,要不你如何确认去何处杀呢,如何办呢?本来也大略,只须要稍加变换下这个剧本即可,改后如次:
--cascade blocking@gv$session
select *
from (select a.inst_id, a.sid, a.serial#,
a.sql_id,
a.event,
a.status,
connect_by_isleaf as isleaf,
sys_connect_by_path(a.SID|| @ ||a.inst_id, - ) tree,
level as tree_level
from gv$session a
start with a.blocking_session is not null
connect by (a.sid|| @ ||a.inst_id) = prior (a.blocking_session|| @ ||a.blocking_instance))
where isleaf = 1
order by tree_level asc;
截止如次:
SYS@jyzhao1 --cascade blocking@gv$session
SYS@jyzhao1 select *
2 from (select a.inst_id, a.sid, a.serial#,
3 a.sql_id,
4 a.event,
5 a.status,
6 connect_by_isleaf as isleaf,
7 sys_connect_by_path(a.SID|| @ ||a.inst_id, - ) tree,
8 level as tree_level
9 from gv$session a
10 start with a.blocking_session is not null
11 connect by (a.sid|| @ ||a.inst_id) = prior (a.blocking_session|| @ ||a.blocking_instance))
12 where isleaf = 1
13 order by tree_level asc;
INST_ID SID SERIAL# SQL_ID EVENT STATUS ISLEAF TREE TREE_LEVEL
---------- ---------- ---------- ------------- ---------------------------------------- -------- ---------- ------------------------------ ----------
1 150 8742 SQL*Net message from client INACTIVE 1 - 25@2 - 150@1 2
1 150 8742 SQL*Net message from client INACTIVE 1 - 145@2 - 25@2 - 150@1 3
1 150 8742 SQL*Net message from client INACTIVE 1 - 146@1 - 25@2 - 150@1 3
SYS@jyzhao1
特殊明显不妨看到最后阻碍其余对话的对话是范例1的sid=150,serial#=8742的对话。那么与关系职员都确认后,就不妨径直杀掉这个最后阻碍对话:
SYS@jyzhao1 alter system kill session 150,8742 immediate;
System altered.
再次查问,回复平常,不复有阻碍了:
SYS@jyzhao1 --cascade blocking@gv$session
SYS@jyzhao1 select *
2 from (select a.inst_id, a.sid, a.serial#,
3 a.sql_id,
4 a.event,
5 a.status,
6 connect_by_isleaf as isleaf,
7 sys_connect_by_path(a.SID|| @ ||a.inst_id, - ) tree,
8 level as tree_level
9 from gv$session a
10 start with a.blocking_session is not null
11 connect by (a.sid|| @ ||a.inst_id) = prior (a.blocking_session|| @ ||a.blocking_instance))
12 where isleaf = 1
13 order by tree_level asc;
no rows selected
SYS@jyzhao1
“Oracle RAC情况下定位并杀掉最后阻碍的对话本领是什么”的实质就引见到这边了,感动大师的观赏。即使想领会更多行业关系的常识不妨关心网站,小编将为大师输入更多高品质的适用作品!