關系數據庫MySQL版元數據鎖MDL導致無法操作數據庫的解決方法
更新時間 2023-12-14 11:23:26
最近更新時間: 2023-12-14 11:23:26
分享文章
本文主要介紹元數據鎖MDL導致無法操作數據庫的解決方法以及如何避免元數據鎖阻塞。
MetaData Lock主要為了保證元數據的一致性,用于處理不同線程操作同一數據對象的同步與互斥問題。MySQL 5.5版本開始,引入了MDL鎖,MDL鎖是表級別的鎖,有些類型的MDL鎖會導致讀寫操作都無法進行,導致SQL的阻塞。
操作步驟
- 連接MySQL實例。具體操作請參見實例連接方式介紹,通過內網和公網連接實例。
- 在SQL窗口執行如下SQL查看數據庫所有線程狀態。
show full processlist

- 查看State列是否出現大量Waiting for table metadata lock,即表示出現阻塞,在對應的Info列可以查看到對應表的操作,找到正在對該表進行操作的會話Id。
- 在SQL窗口執行如下命令解鎖MDL鎖。
kill id

如何避免元數據鎖阻塞
MDL 鎖一旦發生會對業務造成極大影響,因為后續所有對該表的訪問都會被阻塞,造成連接積壓。所以日常要盡量避免 MDL 鎖阻塞的發生,下面給出幾點優化建議可供參考:
- 開啟 metadata_locks 表記錄 MDL 鎖。
- 設置參數 lock_wait_timeout 為較小值,使被阻塞端主動停止。
- 規范使用事務,及時提交事務,避免使用大事務。
- DDL 操作及備份操作放在業務低峰期執行。