程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle中查看引起Session阻塞的2個腳本分享,oraclesession

Oracle中查看引起Session阻塞的2個腳本分享,oraclesession

編輯:Oracle教程

Oracle中查看引起Session阻塞的2個腳本分享,oraclesession


用戶A執行刪除,但是沒有提交。

復制代碼 代碼如下:
SQL> delete from test where object_id<10;

已刪除8行。

用戶B執行刪除或者更新id<10的記錄,則被阻塞。

復制代碼 代碼如下:
SQL> update test set flag='N' where object_id<10;

遇到這種阻塞,首先需要確定問題。可以使用以下腳本。

復制代碼 代碼如下:
select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;

結果如下:

復制代碼 代碼如下:
USERNAME                              SID    SERIAL# LOGON_TIME
------------------------------ ---------- ---------- --------------
LIHUILIN                               14         87 09-11月-13
LIHUILIN                              139        655 09-11月-13

或者使用

復制代碼 代碼如下:
select
(select username from v$session where sid=a.sid) blocker,
a.sid,' is blocking ',
(select username from v$session where sid=b.sid) blockee,
b.sid
from v$lock a,v$lock b
where a.block=1 and b.request>0 and a.id1=b.id1 and a.id2=b.id2;

結果如下:

復制代碼 代碼如下:
BLOCKER                               SID 'ISBLOCKING'  BLOCKEE                               SID
------------------------------ ---------- ------------- ------------------------------ ----------
LIHUILIN                               14  is blocking  LIHUILIN                              139

Kill引起阻塞的Session

復制代碼 代碼如下:
select 'alter system kill session '''||sid||','||serial#||''';' cmd from v$session where username='LIHUILIN' and sid=14;

結果如下:

復制代碼 代碼如下:
CMD
-----------------------------------------
alter system kill session '14,87';

最後執行alter system命令,阻塞解除。


怎查看oracle數據庫中什session異常阻塞了系統?

這時候需要找出造成異常阻塞的session並清除。oracle session通常具有三個特征:(1)一個session可能阻塞多個session;(2)一個session最多被一個session阻塞;(3)session阻塞關系不會形成環路。(環路即死鎖,oracle能自動解除)因此session的阻塞關系為一棵樹,進而DB系統所有session的BLOCK阻塞關系是一個由若干session阻塞關系樹構成的森林,而異常session一定會在故障爆發時成為根(root)。因此,找尋異常鎖表session的過程就是找出異常的root。一般認為異常root有兩個特征:(1)block樹的規模過大,阻塞樹規模即被root層層阻塞的session總數;(2)阻塞的平均等待時間過長。查找異常session的方法一:OEM—> performance—> Blocking Sessions查找異常session的方法二:select r.root_sid, s.serial#,r.blocked_num, r.avg_wait_seconds,s.username,s.status,s.event,s.MACHINE,s.PROGRAM,s.sql_id,s.prev_sql_idfrom (select root_sid, avg(seconds_in_wait) as avg_wait_seconds,count(*) - 1 as blocked_numfrom (select CONNECT_BY_ROOT sid as root_sid, seconds_in_waitfrom v$sessionstart with blocking_session is nullconnect by prior sid = blocking_session)group by root_sidhaving count(*) > 1) r,v$session swhere r.root_sid = s.sidorder by r.blocked_num desc, r.avg_wait_seconds desc;該SQL語句即是根據v$session的字段blocking_session統計阻塞樹根阻塞session的計數以及平均阻塞時間、並進行排序,排名最前的往往是異常session。
 

怎查看oracle數據庫中什session異常阻塞了系統?

Oracle數據庫運維過程中有時會遇到一種異常情況,由於錯誤的操作或代碼BUG造成session異常地持有鎖不釋放,並大量阻塞系統對話。這時候需要找出造成異常阻塞的session並清除。
oracle session通常具有三個特征:
(1)一個session可能阻塞多個session;
(2)一個session最多被一個session阻塞;
(3)session阻塞關系不會形成環路。(環路即死鎖,oracle能自動解除)
因此session的阻塞關系為一棵樹,進而DB系統所有session的BLOCK阻塞關系是一個由若干session阻塞關系樹構成的森林,而異常session一定會在故障爆發時成為根(root)。因此,找尋異常鎖表session的過程就是找出異常的root。
一般認為異常root有兩個特征:(1)block樹的規模過大,阻塞樹規模即被root層層阻塞的session總數;(2)阻塞的平均等待時間過長。
查找異常session的方法一:
OEM—> performance—> Blocking Sessions
查找異常session的方法二:
select r.root_sid, s.serial#,
r.blocked_num, r.avg_wait_seconds,
s.username,s.status,s.event,s.MACHINE,
s.PROGRAM,s.sql_id,s.prev_sql_id
from (select root_sid, avg(seconds_in_wait) as avg_wait_seconds,
count(*) - 1 as blocked_num
from (select CONNECT_BY_ROOT sid as root_sid, seconds_in_wait
from v$session
start with blocking_session is null
connect by prior sid = blocking_session)
group by root_sid
having count(*) > 1) r,
v$session s
where r.root_sid = s.sid
order by r.blocked_num desc, r.avg_wait_seconds desc;
該SQL語句即是根據v$session的字段blocking_session統計阻塞樹根阻塞session的計數以及平均阻塞時間、並進行排序,排名最前的往往是異常session。
另外需要注意的是,持有鎖時間最長、或等待時間最長的session都不一定是造成阻塞的根源session!
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved