• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    MySQLDeadLock故障排查全過程記錄

    來源:懂視網 責編:小采 時間:2020-11-09 20:20:57
    文檔

    MySQLDeadLock故障排查全過程記錄

    MySQLDeadLock故障排查全過程記錄:【作者】 劉博:攜程技術保障中心數據庫高級經理,主要關注Sql server和Mysql的運維和故障處理。 【環境】 版本號:5.6.21 隔離級別:REPEATABLE READ 【問題描述】 接到監控報警,有一個線上的應用DeadLock報錯,每15分鐘會準時出現,報錯統計如
    推薦度:
    導讀MySQLDeadLock故障排查全過程記錄:【作者】 劉博:攜程技術保障中心數據庫高級經理,主要關注Sql server和Mysql的運維和故障處理。 【環境】 版本號:5.6.21 隔離級別:REPEATABLE READ 【問題描述】 接到監控報警,有一個線上的應用DeadLock報錯,每15分鐘會準時出現,報錯統計如

    可以看到 EXTRA 列:

    Using intersect(column5_index,idxColumn6)

    從5.1開始,引入了 index merge 優化技術,對同一個表可以使用多個索引分別進行條件掃描。

    相關文檔:http://dev.mysql.com/doc/refman/5.7/en/index-merge-optimization.html

    The Index Merge method is used to retrieve rows with several range scans and to merge their results into one. The merge can produce unions, intersections, or unions-of-intersections of its underlying scans. This access method merges index scans from a single table; it does not merge scans across multiple tables.

    【模擬與驗證】

    根據以上初步分析,猜測應該就是intersect造成的,于是在測試環境模擬驗證,開啟2個session模擬死鎖:

    時間序列 Session1 Session2
    1 Begin;
    2 UPDATE TestTable SET Column2 = sysdate() Column4 = 0 AND Column5 = 47 AND Column6 = 'SEK 
    執行成功,影響7行
    3 Begin;
    4 UPDATE TestTable SET Column2 = sysdate(),Column4 = 0 AND Column5 = 485 AND Column6 = 'SEK';
    被Blocking
    5 UPDATE TestTable SET Column2 = sysdate(),Column4 = 0 AND Column5 = 485 AND Column6 = 'SEK';
    執行成功
    ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

    依據以上信息可以發現Session2雖然被Block了,但也獲取了一些Session1在時間序列5時所需資源的X鎖,可以再開啟一個查詢select count(Column5) from TestTable where Column5 = 485,設置SET TRANSACTION ISOLATION LEVEL SERIALIZABLE,去查詢Column5 = 485的行,觀察鎖等待的信息:
    mysql> SELECT r.trx_id waiting_trx_id, r.trx_mysql_thread_id waiting_thread, r.trx_query waiting_query, b.trx_id

    mysql> SELECT r.trx_id waiting_trx_id, r.trx_mysql_thread_id waiting_thread, r.trx_query waiting_query, b.trx_id blocking_trx_id, b.trx_mysql_thread_id blocking_thread, b.trx_query blocking_query FROM information_schema.innodb_lock_waits w INNER JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id INNER JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id \G;
    
    *************************** 1. row ***************************
    
    waiting_trx_id: 103006
    
    waiting_thread: 36
    
    waiting_query: UPDATE TestTable SET Column1 = 1, Column2 = sysdate(), Column3 = '026' Column4 = 0 AND Column5 = 485 AND Column6 = 'SEK'
    
    blocking_trx_id: 103003
    
    blocking_thread: 37
    
    blocking_query: NULL
    
    *************************** 2. row ***************************
    
    waiting_trx_id: 421500433538672
    
    waiting_thread: 39
    
    waiting_query: select count(Column5) from TestTable where Column5 = 485
    
    blocking_trx_id: 103006
    
    blocking_thread: 36
    
    blocking_query: UPDATE TestTable SET Column1 = 1, Column2 = sysdate(), Column3 = '026' Column4 = 0 AND Column5 = 485 AND Column6 = 'SEK'
    
    2 rows in set, 1 warning (0.00 sec)
    
    mysql> select * from information_schema.innodb_lock_waits \G;
    
    *************************** 1. row ***************************
    
    requesting_trx_id: 103006
    
    requested_lock_id: 103006:417:1493:859
    
    blocking_trx_id: 103003
    
    blocking_lock_id: 103003:417:1493:859
    
    *************************** 2. row ***************************
    
    requesting_trx_id: 421500433538672
    
    requested_lock_id: 421500433538672:417:749:2
    
    blocking_trx_id: 103006
    
    blocking_lock_id: 103006:417:749:2
    
    2 rows in set, 1 warning (0.00 sec)
    mysql> select * from INNODB_LOCKS \G;
    
    *************************** 1. row ***************************
    
    lock_id: 103006:417:1493:859
    
    lock_trx_id: 103006
    
    lock_mode: X
    
    lock_type: RECORD
    
    lock_table: test.TestTable
    
    lock_index: idxColumn6
    
    lock_space: 417
    
    lock_page: 1493
    
    lock_rec: 859
    
    lock_data: 'SEK', 8262738
    
    *************************** 2. row ***************************
    
    lock_id: 103003:417:1493:859
    
    lock_trx_id: 103003
    
    lock_mode: X
    
    lock_type: RECORD
    
    lock_table:test.TestTable
    
    lock_index: idxColumn6
    
    lock_space: 417
    
    lock_page: 1493
    
    lock_rec: 859
    
    lock_data: 'SEK', 8262738
    
    *************************** 3. row ***************************
    
    lock_id: 421500433538672:417:749:2
    
    lock_trx_id: 421500433538672
    
    lock_mode: S
    
    lock_type: RECORD
    
    lock_table: test.TestTable
    
    lock_index: column5_index
    
    lock_space: 417
    
    lock_page: 749
    
    lock_rec: 2
    
    lock_data: 485, 8317620
    
    *************************** 4. row ***************************
    
    lock_id: 103006:417:749:2
    
    lock_trx_id: 103006
    
    lock_mode: X
    
    lock_type: RECORD
    
    lock_table: test.TestTable
    
    lock_index: column5_index
    
    lock_space: 417
    
    lock_page: 749
    
    lock_rec: 2
    
    lock_data: 485, 8317620
    
    4 rows in set, 1 warning (0.00 sec)

    可以看到Session2,trx_id 103006阻塞了trx_id 421500433538672,而trx_id 421500433538672 requested_lock也正好是lock_data: 485, 8317620。由此可見Session2雖然別block了,但是還是獲取到了Index column5_index相關的鎖。被Block是因為intersect的原因,還需要idxColumn6的鎖,至此思路已經清晰,對整個分配鎖的信息簡化一下,如下表格(請求到的鎖用青色表示,需獲取但未獲取到的鎖用紅色表示):

    時間點 Session1 Session2
    1 477 SEK
    2 485 SEK
    3 485 SEK 死鎖發生

    可以看到485 SEK這兩個資源形成了一個環狀,最終發生死鎖。

    【解決方法】

  • 最佳的方法是添加column5和Column6的聯合索引。
  • 我們環境當時的情況發現Column6的篩選度非常低,就刪除了Column6的索引。
    10:55左右刪除索引后,報錯沒有再發生:
  • 總結

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    MySQLDeadLock故障排查全過程記錄

    MySQLDeadLock故障排查全過程記錄:【作者】 劉博:攜程技術保障中心數據庫高級經理,主要關注Sql server和Mysql的運維和故障處理。 【環境】 版本號:5.6.21 隔離級別:REPEATABLE READ 【問題描述】 接到監控報警,有一個線上的應用DeadLock報錯,每15分鐘會準時出現,報錯統計如
    推薦度:
    標簽: 問題 全過程 mysql
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国产高清日韩精品欧美激情| 国产亚洲色婷婷久久99精品91| 久久精品一区二区国产| 精品久久久久久无码人妻热| 500av导航大全精品| 亚洲欧美国产∧v精品综合网| 国产精品美女免费视频观看| 国产精品视频网| 精品久久久久香蕉网| 亚洲国产精品嫩草影院久久| 国产精品亚洲不卡一区二区三区| 久久成人影院精品777| 午夜精品乱人伦小说区| 亚洲AV成人精品日韩一区18p| 国产亚洲精品a在线观看| 最新亚洲精品国自产在线观看| 国产精品99久久99久久久| 四虎国产精品永久免费网址| 婷婷成人国产精品| 久久久久久久久久免免费精品| 精品国产一级在线观看| 精品成人一区二区三区四区| 99久久精品国产一区二区蜜芽| 九九精品免视看国产成人| 99在线精品视频观看免费| 国产精品毛片无遮挡| 国产精品香港三级国产AV| 欧美精品亚洲精品日韩传电影| 欧美精品久久久久久久自慰| 久久亚洲私人国产精品| 乱码精品一区二区三区| 欧美午夜精品久久久久免费视| 色欲久久久天天天综合网精品| 在线观看国产精品普通话对白精品| 日韩经典精品无码一区| 亚洲精品视频久久久| 亚洲av无码国产精品色午夜字幕 | 99热门精品一区二区三区无码| CAOPORM国产精品视频免费| 国产精品日韩欧美制服| 亚洲永久永久永久永久永久精品|