Oracle 阻塞(blocking blocked),blocking

來源:互聯網
上載者:User

Oracle 阻塞(blocking blocked),blocking

   阻塞是DBA經常碰到的情形,尤其是不良的應用程式設計的阻塞將導致效能嚴重下降直至資料庫崩潰。對DBA而言,有必要知道如何定位到當前系統有哪些阻塞,到底誰是阻塞者,誰是被阻塞者。本文對此給出了描述並做了相關示範。

 

1、阻塞及其類型
a、什麼是阻塞
   一個會話持有某個資源的鎖,而另一個會話在請求這個資源,就會出現阻塞(blocking)。也就是說新的會話會被掛起,直到持有鎖的會話放棄鎖定資源。大多數情況下,在一個互動式應用中被嚴重阻塞,即可表明應用邏輯有問題,這才是阻塞的根源。
b、阻塞得類型
   資料庫中有5條常見的DML語句可能會阻塞,即:INSERT、UPDATE、DELETE、MERGE 和SELECT FOR UPDATE。

 

2、幾種不同類型阻塞的處理辦法
a、INSERT阻塞主要是由於有一個帶主鍵的表,或者表上有惟一的約束,在兩個會話試圖用同樣的值插入一行時引發阻塞。多表通過參考完整性約束相互連結時,在其依賴的父表正在建立或刪除期間,對子表的插入可能會阻塞。對於該類情形建議使用序列來產生主鍵/惟一列值。
b、對於UPDATE、DELETE、MERGE 和SELECT FOR UPDATE阻塞,只要有任一session使用這些操作已經鎖定行,其餘的必須處於等待狀態。直到當前鎖定行上的鎖(獨佔鎖定)釋放。對於該類情形,建議儘可能快速提交事務,或採用批量SQL方式提交。
c、對於一個阻塞的SELECT FOR UPDATE,解決方案很簡單:只需增加NOWAIT 子句,它就不會阻塞了。

 

3、示範阻塞

--更新表,注,提示符scott@CNMMBO表明使用者為scott的session,使用者名稱不同,session不同。scott@CNMMBO> update emp set sal=sal*1.1 where empno=7788;1 row updated.scott@CNMMBO> @my_envSPID                SID    SERIAL# USERNAME        PROGRAM------------ ---------- ---------- --------------- ------------------------------------------------11205              1073       4642 robin           oracle@SZDB (TNS V1-V3)--另起兩個session更新同樣的行,這兩個session都會處於等待,直到第一個session提交或復原leshami@CNMMBO> update scott.emp set sal=sal+100 where empno=7788;goex_admin@CNMMBO> update scott.emp set sal=sal-50 where empno=7788;--下面在第一個session 查詢阻塞情況scott@CNMMBO> @blocker BLOCK_MSG                                               BLOCK-------------------------------------------------- ----------pts/5 ('1073,4642') is blocking 1067,10438                  1pts/5 ('1073,4642') is blocking 1065,4464                   1--上面的結果表明session 1073,4642 阻塞了後面的2個--即session 1073,4642是阻塞者,後面2個session是被阻塞者--Author : Leshami--Blog   : http://blog.csdn.net/leshami--下面查詢正在阻塞的session id,SQL語句以及被阻塞的時間scott@CNMMBO> @blocking_session_detail.sql'SID='||A.SID||'WAITCLASS='||A.WAIT_CLASS||'TIME='||A.SECONDS_IN_WAIT||CHR(10)||'QUERY='||B.SQL_TEXT-------------------------------------------------------------------------------------------------------sid=1067 Wait Class=Application Time=5995 Query=update scott.emp set sal=sal+100 where empno=7788sid=1065 Wait Class=Application Time=225 Query=update scott.emp set sal=sal-50 where empno=7788--下面的查詢阻塞時鎖的持有情況 scott@CNMMBO> @request_lock_typeUSERNAME                              SID TY LMODE       REQUEST            ID1        ID2------------------------------ ---------- -- ----------- ----------- ---------- ----------SCOTT                                1073 TX Exclusive   None            524319      27412LESHAMI                              1067 TX None        Exclusive       524319      27412GOEX_ADMIN                           1065 TX None        Exclusive       524319      27412--可以看到LESHAMI,GOEX_ADMIN 2個使用者都在請求524319/27412上的Exclusive鎖,而此時已經被SCOTT加了Exclusive鎖--查詢阻塞時鎖的持有詳細資料scott@CNMMBO> @request_lock_detail       SID USERNAME             OSUSER          TERMINAL                  OBJECT_NAME          TY Lock Mode   Req_Mode---------- -------------------- --------------- ------------------------- -------------------- -- ----------- --------------------      1065 GOEX_ADMIN           robin           pts/1                     EMP                  TM Row Excl      1065 GOEX_ADMIN           robin           pts/1                     Trans-524319         TX --Waiting-- Exclusive      1067 LESHAMI              robin           pts/0                     EMP                  TM Row Excl      1067 LESHAMI              robin           pts/0                     Trans-524319         TX --Waiting-- Exclusive      1073 SCOTT                robin           pts/5                     EMP                  TM Row Excl      1073 SCOTT                robin           pts/5                     Trans-524319         TX Exclusive 

文中涉及到的相關指令碼下載:http://download.csdn.net/detail/robinson_0612/7607033    

更多參考

DML Error Logging 特性 

PL/SQL --> 遊標

PL/SQL --> 隱式遊標(SQL%FOUND)

批量SQL之 FORALL 語句

批量SQL之 BULK COLLECT 子句

PL/SQL 集合的初始化與賦值

PL/SQL 聯合數組與巢狀表格
PL/SQL 變長數組
PL/SQL --> PL/SQL記錄

SQL tuning 步驟

高效SQL語句必殺技

父遊標、子遊標及共用遊標

綁定變數及其優缺點

dbms_xplan之display_cursor函數的使用

dbms_xplan之display函數的使用

執行計畫中各欄位各模組描述

使用 EXPLAIN PLAN 擷取SQL語句執行計畫


如何查看oracle資料庫中哪些session異常阻塞了系統?時候需要找出造成異常阻塞session並清除oracle session通常具有三特徵:(1)session能阻塞多session;(2)session多被session阻塞;(3)session阻塞關係會形成環路(環路即死結oracle能自動解除)因此session阻塞關係棵樹進而DB系統所有sessionBLOCK阻塞關係由若干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系統所有sessionBLOCK阻塞關係由若干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

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.