Slave SQL線程與PXB FTWRL死鎖問題分析

来源:https://www.cnblogs.com/greatsql/p/18165043
-Advertisement-
Play Games

1. 問題背景 2.27號凌晨生產環境MySQL備庫在執行備份期間出現因FLUSH TABLES WITH READ LOCK未釋放導致備庫複製延時拉大,慢日誌內看持鎖接近25分鐘未釋放。 版本: MySQL 5.7.21 PXB 2.4.18 慢查詢日誌: 備份腳本中的備份命令: mysql_ki ...


1. 問題背景

2.27號凌晨生產環境MySQL備庫在執行備份期間出現因FLUSH TABLES WITH READ LOCK未釋放導致備庫複製延時拉大,慢日誌內看持鎖接近25分鐘未釋放。

版本:

  • MySQL 5.7.21
  • PXB 2.4.18

慢查詢日誌:

file

備份腳本中的備份命令:

file

mysql_kill.sh的主要邏輯內容:

file

備份參數:

file

2. 問題復現及分析

2.1 問題分析

file

  • 144是SQL線程,並行複製中的Coordinator線程;
  • 145/146是並行複製的worker線程,145/146worker線程隊列中的事務可以並行執行。
  • 162線程是執行innobackup執行的flush tables with read lock;

144 Coordinator線程分發relay log中事務時發現這個事務不能執行,要等待前面的事務完成提交,所以處於waiting for dependent transaction to commit的狀態。145/146線程和備份線程162形成死鎖,145線程等待162線程 global read lock 釋放,162線程占有MDL::global read lock 全局讀鎖,申請全局commit lock的時候阻塞等待146線程,146線程占有MDL:: commit lock,因為從庫設置slave_preserve_commit_order=1,保證從庫binlog提交順序,而146線程執行事務對應的binlog靠後面,所以等待145的事務提交。最終形成了145->162->146->145的死迴圈,形成死鎖。

三個線程相互形成死鎖,還是很少見的。

2.2 相關參數為何未生效

--ftwrl-wait-timeout=60 指的是執行FTWRL之前,如果檢測到存在長SQL,先等待指定時間(秒),如果超時後還存在長SQL,則備份報錯退出。預設為0則表示立即執行。

--ftwrl-wait-threshold=5 指的是執行FTWRL之前,檢測長SQL的方法,如果在執行flush前存在已經運行了超過指定時間(秒)的SQL,則將該SQL定義為長SQL,預設60s。

--kill-long-queries_timeout=0 在執行FTWRL後,如果flush操作被阻塞了N秒,則kill掉阻塞它的線程,預設0的情況就是不kill任何阻塞flush的SQL,直到該SQL執行完成。

從上面各個參數的解釋,不難看出,--ftwrl-wait-*參數是針對執行FTWRL之前的長SQL檢測機制,對於已執行FTWRL時無濟於事,--kill-long-*參數則是設置預設值0,不起任何作用。

3. 結論與建議

  • PXB備份中執行FTWRL加全局讀鎖與SQL線程形成死鎖是導致本次從庫延遲過高的原因。
  • 啟用--kill-long-queries\_type--kill-long-queries\_timeout參數,在檢測到flush被阻塞後執行kill掉相關線程的操作。比較暴力,存在較大的風險,若備庫無業務訪問則可考慮。
  • 啟用--safe-slave-backup參數,執行備份時該參數會停掉SQL線程,從而避免死鎖的產生。僅建議在無業務訪問的備庫上執行。
  • 設置MySQL參數slave\_preserve\_commit\_order=0,關閉從庫binlog的順序提交,關閉該參數只是影響並行複製的事務在從庫的提交順序,對最終的數據一致性並無影響,所以如果無特別要求從庫的binlog順序必須與主庫保持一致,可以考慮設置slave\_preserve\_commit\_order=0避免死鎖的產生。

Enjoy GreatSQL

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一:kvm工具棧 kvm主要的工具棧,從大的類別可以分為libvirt和qemu這2大類,其中libvirt中分為virtual machine manager和virsh ,virtual machine manager中的virt-manager是基於圖形化界面的管理,其他的都是可以在命令直接使 ...
  • 痞子衡嵌入式半月刊: 第 98 期 這裡分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農曆年分二十四節氣,希望在每個交節之日準時發佈一期。 本期刊是開源項目(GitHub: JayHeng/pzh-mcu-bi-weekly),歡迎提交 issue,投稿或推薦你知道的嵌入式那些事兒。 上期回顧 ...
  • 目錄Linux學習大綱命令提示符命令的格式路徑的分類文件的分類目錄的結構一些快捷鍵 Linux學習大綱 命令提示符 通常情況下,我們使用Linux都是在命令行環境下, 所以學習 Linux 的第一步需要瞭解 Linux 的命令提示符。 Linux命令提示符通常由用戶名、主機名和當前工作目錄組成。 [ ...
  • 1、下載必備安裝包 make、gcc(debian中可用build-essential包)、bc、linux-headers-$(uname -r)、dkms sudo apt install build-essential bc sudo apt install linux-headers-$(u ...
  • 目錄一、什麼是MongoDB的副本集二、副本集的架構三、副本集的成員四、部署副本集1、節點劃分2、安裝MongoDB2.1、下載解壓安裝包3、創建主節點3.1、創建存儲數據和日誌的目錄3.2、新建配置文件3.3、啟動節點服務4、創建副本節點4.1、創建存儲數據和日誌的目錄4.2、新建配置文件4.3、 ...
  • 0、首先確認是否安裝過MySQL yum list installed | grep mysql rpm -qa | grep mysql 若果有安裝,需要先刪除舊版本。yum remove mysql 一、通過官網下載tar壓縮包(或者直接下載RPM安裝包) 1.打開MySQL官網下載地址,選擇適 ...
  • 本文介紹基於Microsoft SQL Server軟體,實現資料庫表完整性約束、索引與視圖的創建、編輯與刪除等操作的方法~ ...
  • 前言 序列都是用create sequence命令創建的單行表,常用於為表的行生成唯一的標識符。 相關函數 函數 作用 nextval() 遞增序列並返回新值 currval() 返回最近一次用nextval()函數獲取的指定序列的值 lastval() 返回最近一次用nextval()函數獲取的任 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...