【鎖】Oracle死鎖(DeadLock)的分類及其模擬 1 BLOG文檔結構圖 2 前言部分 2.1 導讀和註意事項 各位技術愛好者,看完本文後,你可以掌握如下的技能,也可以學到一些其它你所不知道的知識,~O(∩_∩)O~: ① 死鎖的概念及其trace文件 ② 死鎖的分類 ③ 行級死鎖的模擬 ④ ...
【鎖】Oracle死鎖(DeadLock)的分類及其模擬
1 BLOG文檔結構圖
2 前言部分
2.1 導讀和註意事項
各位技術愛好者,看完本文後,你可以掌握如下的技能,也可以學到一些其它你所不知道的知識,~O(∩_∩)O~:
① 死鎖的概念及其trace文件
② 死鎖的分類
③ 行級死鎖的模擬
④ ITL的概念、ITL結構
⑤ ITL引發的死鎖處理
⑥ ITL死鎖的模擬
Tips:
① 本文在itpub(http://blog.itpub.net/26736162)、博客園(http://www.cnblogs.com/lhrbest)和微信公眾號(xiaomaimiaolhr)上有同步更新。
② 文章中用到的所有代碼、相關軟體、相關資料及本文的pdf版本都請前往小麥苗的雲盤下載,小麥苗的雲盤地址見:http://blog.itpub.net/26736162/viewspace-1624453/。
③ 若網頁文章代碼格式有錯亂,請嘗試以下辦法:①去博客園地址閱讀,②下載pdf格式的文檔來閱讀。
④ 在本篇BLOG中,代碼輸出部分一般放在一行一列的表格中。其中,需要特別關註的地方我都用灰色背景和粉紅色字體來表示,比如在下邊的例子中,thread 1的最大歸檔日誌號為33,thread 2的最大歸檔日誌號為43是需要特別關註的地方;而命令一般使用黃色背景和紅色字體標註;對代碼或代碼輸出部分的註釋一般採用藍色字體表示。
List of Archived Logs in backup set 11 Thrd Seq Low SCN Low Time Next SCN Next Time ---- ------- ---------- ------------------- ---------- --------- 1 32 1621589 2015-05-29 11:09:52 1625242 2015-05-29 11:15:48 1 33 1625242 2015-05-29 11:15:48 1625293 2015-05-29 11:15:58 2 42 1613951 2015-05-29 10:41:18 1625245 2015-05-29 11:15:49 2 43 1625245 2015-05-29 11:15:49 1625253 2015-05-29 11:15:53 [ZHLHRDB1:root]:/>lsvg -o T_XLHRD_APP1_vg rootvg [ZHLHRDB1:root]:/> 00:27:22 SQL> alter tablespace idxtbs read write; ====》2097152*512/1024/1024/1024=1G |
本文如有錯誤或不完善的地方請大家多多指正,ITPUB留言或QQ皆可,您的批評指正是我寫作的最大動力。
2.2 本文簡介
寫了近大半年的書了,碰到了各種困難,不過幸運的是基本上都一一剋服了。前段時間工作上碰到了一個很奇怪的死鎖問題,由業務發出來的SQL來看是不太可能產生死鎖的,不過的的確確實實在在的產生了,那作者是碰到了哪一類的死鎖呢?ITL死鎖!!有關當時的案例可以參考:http://blog.itpub.net/26736162/viewspace-2124771/和http://blog.itpub.net/26736162/viewspace-2124735/。於是,作者就把死鎖可能出現的情況都分類總結了一下,分享給大家,歡迎大家指出錯誤。本文內容也將寫入作者的新書中,歡迎大家提前訂閱。
第二章 死鎖(DeadLock)的分類及其模擬
1 死鎖簡介
1.1 什麼是死鎖?
所謂死鎖,是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程。Oracle對於“死鎖”是要做處理的,而不是不聞不問。
[ZFLHRDB1:oracle]:/oracle>oerr ora 60 00060, 00000, "deadlock detected while waiting for resource" // *Cause: Transactions deadlocked one another while waiting for resources. // *Action: Look at the trace file to see the transactions and resources // involved. Retry if necessary. |
Cause: Your session and another session are waiting for are source locked by the other. This condition is known AS a deadlock. To resolve the deadlock, one or more statements were rolled back for the other session to continue work.
Action Either: l. Enter arollback statement and re—execute all statements since the last commit or 2. Wait until the lock is released, possibly a few minutes, and then re—execute the rolled back statements.
1.2 死鎖的trace文件
Oracle中產生死鎖的時候會在alert告警日誌文件中記錄死鎖的相關信息,無論單機還是RAC環境都有Deadlock這個關鍵詞,而且當發生死鎖時都會生成一個trace文件,這個文件名在alert文件中都有記載。由於在RAC環境中,是由LMD(Lock Manager Daemon)進程統一管理各個節點之間的鎖資源的,所以,RAC環境中trace文件是由LMD進程來生成的。
在RAC環境中,告警日誌的形式如下所示:
Mon Jun 20 10:10:56 2016 Global Enqueue Services Deadlock detected. More info in file /u01/app/oracle/diag/rdbms/raclhr/raclhr2/trace/raclhr2_lmd0_19923170.trc. |
在單機環境中,告警日誌的形式如下所示:
Mon Jun 20 12:10:56 2016 ORA-00060: Deadlock detected. More info in file /u01/app/oracle/diag/rdbms/dlhr/dlhr/trace/dlhr_ora_16973880.trc. |
通常來講,對於單機環境,當有死鎖發生後,在trace文件中會看到如下的日誌信息:
圖2-1 單機環境下的死鎖
當看到trace文件時,需要確認一下產生鎖的類型,是兩行還是一行,是TX還是TM,如果只有一行那麼說明是同一個SESSION,可能是自治事務引起的死鎖。
對於RAC環境,當有死鎖發生後,在trace文件中會看到如下的日誌信息:
圖2-2 RAC環境下的死鎖
1.3 死鎖的檢測時間
死鎖的監測時間是由隱含參數_lm_dd_interval來控制的,在Oracle 11g中,隱含參數_lm_dd_interval的值預設為10,而在Oracle 10g中該參數預設為60,單位為秒。
SYS@oraLHRDB2> SELECT A.INDX, 2 A.KSPPINM NAME, 3 A.KSPPDESC, 4 B.KSPPSTVL 5 FROM X$KSPPI A, 6 X$KSPPCV B 7 WHERE A.INDX = B.INDX 8 AND LOWER(A.KSPPINM) LIKE LOWER('%&PARAMETER%'); ENTER VALUE FOR PARAMETER: _lm_dd_interval OLD 8: AND LOWER(A.KSPPINM) LIKE LOWER('%&PARAMETER%') NEW 8: AND LOWER(A.KSPPINM) LIKE LOWER('%_LM_DD_INTERVAL%')
INDX NAME KSPPDESC KSPPSTVL ---------- ------------------ ------------------------------ -------------------- 578 _lm_dd_interval dd time interval in seconds 10 |
可以看到該隱含參數的值為10。
2 死鎖的分類
有人的地方就有江湖,有資源阻塞的地方就可能有死鎖。Oralce中最常見的死鎖分為:行級死鎖(Row-Level Deadlock)和塊級死鎖(Block-Level Deadlock),其中,行級死鎖分為①主鍵、唯一索引的死鎖(會話交叉插入相同的主鍵值),②外鍵未加索引,③表上的點陣圖索引遭到併發更新,④