溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL中怎么閱讀死鎖日志

發(fā)布時(shí)間:2021-07-24 16:53:25 來源:億速云 閱讀:172 作者:Leah 欄目:MySQL數(shù)據(jù)庫

MySQL中怎么閱讀死鎖日志,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。


MySQL 5.6 事務(wù)隔離級(jí)別為RR

  1. CREATE TABLE `ty` (

  2.   `id` int(11) NOT NULL AUTO_INCREMENT,

  3.   `a` int(11) DEFAULT NULL,

  4.   `b` int(11) DEFAULT NULL,

  5.   PRIMARY KEY (`id`),

  6.   KEY `idxa` (`a`)

  7. ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4

  8. insert into ty(a,b) values(2,3),(5,4),(6,7);

2.2 測試用例

T2

T1

begin;


delete from  ty where  a=5;

begin;


delete from  ty where  a=5;

insert into ty(a,b) values(2,10);



delete from  ty where  a=5;

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

                                                            
2.3 我們通過show engine innodb status 查看的日志是最新一次記錄死鎖的日志。

  1. ------------------------

  2. LATEST DETECTED DEADLOCK

  3. ------------------------

  4. 2017-09-09 22:34:13 7f78eab82700

  5. *** (1) TRANSACTION: #事務(wù)1

  6. TRANSACTION 462308399, ACTIVE 33 sec starting index read

  7. mysql tables in use 1, locked 1

  8. LOCK WAIT 2 lock struct(s), heap size 360, 1 row lock(s)

  9. MySQL thread id 3525577, OS thread handle 0x7f896cc4b700, query id 780039657 localhost root updating

  10. delete from ty where a=5

  11. *** (1) WAITING FOR THIS LOCK TO BE GRANTED:

  12. RECORD LOCKS space id 219 page no 4 n bits 72 index `idxa` of table `test`.`ty` trx id 462308399 lock_mode X waiting

  13. *** (2) TRANSACTION:

  14. TRANSACTION 462308398, ACTIVE 61 sec inserting, thread declared inside InnoDB 5000

  15. mysql tables in use 1, locked 1

  16. 5 lock struct(s), heap size 1184, 4 row lock(s), undo log entries 2

  17. MySQL thread id 3525490, OS thread handle 0x7f78eab82700, query id 780039714 localhost root update

  18. insert into ty(a,b) values(2,10)

  19. *** (2) HOLDS THE LOCK(S):

  20. RECORD LOCKS space id 219 page no 4 n bits 72 index `idxa` of table `test`.`ty` trx id 462308398 lock_mode X

  21. *** (2) WAITING FOR THIS LOCK TO BE GRANTED:

  22. RECORD LOCKS space id 219 page no 4 n bits 72 index `idxa` of table `test`.`ty` trx id 462308398 lock_mode X locks gap before rec insert intention waiting

  23. *** WE ROLL BACK TRANSACTION (1)

2.4 日志分析
*** (1) TRANSACTION: #事務(wù)1
TRANSACTION 462308399, ACTIVE 33 sec starting index read 
事務(wù)編號(hào)為 462308399 ,活躍33秒,starting index read 表示事務(wù)狀態(tài)為根據(jù)索引讀取數(shù)據(jù)。常見的其他狀態(tài):

  1. fetching rows 表示事務(wù)狀態(tài)在row_search_for_mysql中被設(shè)置,表示正在查找記錄。

  2. updating or deleting  表示事務(wù)已經(jīng)真正進(jìn)入了Update/delete的函數(shù)邏輯(row_update_for_mysql)

  3. thread declared inside InnoDB  說明事務(wù)已經(jīng)進(jìn)入innodb層。通常而言 不在innodb層的事務(wù)大部分是會(huì)被回滾的。

mysql tables in use 1, 說明當(dāng)前的事務(wù)使用一個(gè)表。locked 1 表示表上有一個(gè)表鎖,對(duì)于DML語句為LOCK_IX
LOCK WAIT 2 lock struct(s), heap size 360, 1 row lock(s)
LOCK WAIT表示正在等待鎖, 2 lock struct(s) 表示trx->trx_locks鎖鏈表的長度為2,每個(gè)鏈表節(jié)點(diǎn)代表該事務(wù)持有的一個(gè)鎖結(jié)構(gòu),包括表鎖,記錄鎖以及auto_inc鎖等。本案例中2locks 表示IX鎖和lock_mode X(Next-key lock)
heap size 360 表示事務(wù)分配的鎖堆內(nèi)存大小,一般沒有什么具體的用處。
1 row lock(s)表示當(dāng)前事務(wù)持有的行記錄鎖/gap 鎖的個(gè)數(shù)。
delete from ty where a=5 表示事務(wù)1在執(zhí)行的sql ,不過比較悲傷的事情是show engine innodb status 是查看不到完整的事務(wù)的sql 的,通常顯示當(dāng)前正在等待鎖的sql。
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 219 page no 4 n bits 72 index `idxa` of table `test`.`ty` trx id 462308399 lock_mode X waiting
RECORD LOCKS 表示記錄鎖,space id為219,page號(hào)4 ,n bits 72表示這個(gè)聚集索引記錄鎖結(jié)構(gòu)上留有72個(gè)Bit位
表示事務(wù)1 正在等待表 ty 上的 idxa 的 X 鎖本案例中其實(shí)是Next-Key lock
事務(wù)2的log 和上面分析類似,
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 219 page no 4 n bits 72 index `idxa` of table `test`.`ty` trx id 462308398 lock_mode X
顯示了事務(wù)2 insert into ty(a,b) values(2,10)持有了a=5 的Lock mode X |LOCK_GAP ,不過我們從日志里面看不到 事務(wù)2 執(zhí)行的 delete from  ty where  a=5;這點(diǎn)也是造成DBA 僅僅根據(jù)日志難以分析死鎖的問題的根本原因。
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 219 page no 4 n bits 72 index `idxa` of table `test`.`ty` trx id 462308398 lock_mode X locks gap before rec insert intention waiting
表示事務(wù)2的insert 語句正在等待插入意向鎖 lock_mode X locks gap before rec insert intention waiting (LOCK_X + LOCK_REC_GAP )
這里需要各位注意的是鎖組合,類似lock_mode X waiting ,lock_mode X,lock_mode X locks gap before rec insert intention waiting 是我們分析死鎖的核心重點(diǎn)。如何理解鎖組合呢?
首先我們要知道對(duì)于MySQL有兩種常規(guī)鎖模式
LOCK_S(讀鎖,共享鎖)
LOCK_X(寫鎖,排它鎖)
最容易理解的鎖模式,讀加共享鎖,寫加排它鎖.
有如下幾種鎖的屬性
LOCK_REC_NOT_GAP        (鎖記錄)
LOCK_GAP                       (鎖記錄前的GAP)
LOCK_ORDINARY              (同時(shí)鎖記錄+記錄前的GAP 。傳說中的Next Key鎖)
LOCK_INSERT_INTENTION(插入意向鎖,其實(shí)是特殊的GAP鎖)
鎖的屬性可以與鎖模式任意組合。例如.
lock->type_mode 可以是Lock_X 或者Lock_S 
locks gap before rec  表示為gap鎖:lock->type_mode & LOCK_GAP
locks rec but not gap 表示為記錄鎖,非gap鎖:lock->type_mode & LOCK_REC_NOT_GAP
insert intention          表示為插入意向鎖:lock->type_mode & LOCK_INSERT_INTENTION
waiting                       表示鎖等待:lock->type_mode & LOCK_WAIT

看完上述內(nèi)容,你們掌握MySQL中怎么閱讀死鎖日志的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI