正文引见了“在Oracle RAC情况中定位和中断最后被遏止的对话的本领是什么”的常识。很多人在本质案例的操纵中会遇到如许的艰巨。让边肖率领你进修怎样处置那些情景。蓄意大师刻意观赏,学点货色!

试验情况:

甲骨文RAC 11.2.0.4(2个节点)

1.模仿波折:对话被级联遏止。

2.惯例本领:梳理出结果阻碍的对话。

3.矫正本领:登时找到结果阻碍的对话。

本来我之前也写过一篇关系的作品:

怎样定位Oracle数据库锁定对话的根目次?

1.模仿妨碍:对话被级联阻碍

Oracle RAC环境下定位并杀掉最终阻塞的会话方法是什么 第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;

Oracle RAC环境下定位并杀掉最终阻塞的会话方法是什么 第2张

回滚;功夫点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 

Oracle RAC环境下定位并杀掉最终阻塞的会话方法是什么 第3张

不妨看到范例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,

Oracle RAC环境下定位并杀掉最终阻塞的会话方法是什么 第4张

 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情况下定位并杀掉最后阻碍的对话本领是什么”的实质就引见到这边了,感动大师的观赏。即使想领会更多行业关系的常识不妨关心网站,小编将为大师输入更多高品质的适用作品!