【MySQL】MetaData Lock 之一
一 簡介
和MySQL打交道比較多的朋友,肯定遇到過 "Waiting for table metadata lock"或者由於MDL導致的故障,不過本文介紹MDL鎖之前 我們先看一個著名的 大致情況如下:
s1:
BEGIN;
INSERT INTO t ... ;
COMMIT;
s2:
DROP TABLE t;
然後上面的操作流程在binlog記錄的順序是
DROP TABLE t;
BEGIN;
INSERT INTO t ... ;
COMMIT;
很顯然備庫執行binlog時會先刪除表t,然後執行insert 會報1032 error,導致複製中斷。為了解決該bug,MySQL 在5.5.3引入了MDL鎖。
二 metadata lock是什麼
顧名思義,metadata lock即後設資料鎖。在資料庫中後設資料即資料字典資訊包括db,table,function,procedure,trigger,event等。metadata lock主要為了保證後設資料的一致性,用於處理不同執行緒操作同一資料物件的同步與互斥問題,如:
在以上兩個事務中,s1 s2都會操作表t1,但由於s1首先獲取t1的鎖,而s2在獲得鎖的時候由於互斥,所以只能等待;
其實5.5也有類似保護後設資料的機制,只是沒有明確提出MDL概念而已。但是5.5之前版本(比如5.1)與5.5之後版本在保護後設資料這塊有一個顯著的不同點是,5.1對於後設資料的保護是語句級別的,5.5對於metadata的保護是事務級別的。所謂語句級別,即語句執行完成後,無論事務是否提交或回滾,其表結構可以被其他會話更新;而事務級別則是在事務結束後才釋放MDL。引入MDL後,主要解決2個問題
事務隔離問題,比如在可重複隔離級別下,會話A在2次查詢期間,會話B對錶結構做了修改,兩次查詢結果就會不一致,無法滿足可重複讀的要求.
資料複製問題,比如會話A執行了多條更新語句期間,另外一個會話B做了表結構變更並且先提交,就會導致slave在重做時,先重做alter,再重做update時就會出現複製錯誤的現象。也就是簡介中提到的bug。
三 小結
本文淺顯的介紹MDL的來龍去脈,想比較詳細的瞭解MDL的前生今世的讀者請移步@印風的文章 《》
MySQL引入MDL之後 也會帶來一定的負面影響 比如 “wait for global read lock”或者“wait for table lock”之類的鎖等待,當遇到大查詢,同時遇到一個DDL ,基本能造就一個故障了。後面的文章會深入介紹MDL的實現原理和執行機制,加入一些常見的案例和解決方法。
如果您覺得從這篇文章受益,可以微信支付贊助 北在南方 一瓶飲料 ^_^
和MySQL打交道比較多的朋友,肯定遇到過 "Waiting for table metadata lock"或者由於MDL導致的故障,不過本文介紹MDL鎖之前 我們先看一個著名的 大致情況如下:
s1:
BEGIN;
INSERT INTO t ... ;
COMMIT;
s2:
DROP TABLE t;
然後上面的操作流程在binlog記錄的順序是
DROP TABLE t;
BEGIN;
INSERT INTO t ... ;
COMMIT;
很顯然備庫執行binlog時會先刪除表t,然後執行insert 會報1032 error,導致複製中斷。為了解決該bug,MySQL 在5.5.3引入了MDL鎖。
二 metadata lock是什麼
顧名思義,metadata lock即後設資料鎖。在資料庫中後設資料即資料字典資訊包括db,table,function,procedure,trigger,event等。metadata lock主要為了保證後設資料的一致性,用於處理不同執行緒操作同一資料物件的同步與互斥問題,如:
-
s1: begin select * from t1 for update ...
- s2: begin alter table t1 add column str varchar(30)
其實5.5也有類似保護後設資料的機制,只是沒有明確提出MDL概念而已。但是5.5之前版本(比如5.1)與5.5之後版本在保護後設資料這塊有一個顯著的不同點是,5.1對於後設資料的保護是語句級別的,5.5對於metadata的保護是事務級別的。所謂語句級別,即語句執行完成後,無論事務是否提交或回滾,其表結構可以被其他會話更新;而事務級別則是在事務結束後才釋放MDL。引入MDL後,主要解決2個問題
事務隔離問題,比如在可重複隔離級別下,會話A在2次查詢期間,會話B對錶結構做了修改,兩次查詢結果就會不一致,無法滿足可重複讀的要求.
資料複製問題,比如會話A執行了多條更新語句期間,另外一個會話B做了表結構變更並且先提交,就會導致slave在重做時,先重做alter,再重做update時就會出現複製錯誤的現象。也就是簡介中提到的bug。
三 小結
本文淺顯的介紹MDL的來龍去脈,想比較詳細的瞭解MDL的前生今世的讀者請移步@印風的文章 《》
MySQL引入MDL之後 也會帶來一定的負面影響 比如 “wait for global read lock”或者“wait for table lock”之類的鎖等待,當遇到大查詢,同時遇到一個DDL ,基本能造就一個故障了。後面的文章會深入介紹MDL的實現原理和執行機制,加入一些常見的案例和解決方法。
如果您覺得從這篇文章受益,可以微信支付贊助 北在南方 一瓶飲料 ^_^
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22664653/viewspace-1791569/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【Mysql】metadata lock鎖MySql
- MYSQL 鎖:metadata lockMySql
- 【MySQL】MetaData Lock 之二MySql
- 【MySQL】MetaData Lock 之三MySql
- mysql觀測METADATA LOCK(MDL)鎖MySql
- mysql metadata lock原理與實現MySql
- MySQL 5.6 metadata lock 原始碼解讀MySql原始碼
- mysql innodb lock鎖之record lock之一MySql
- MySQL 5.6 drop database時,table metadata lock等待MySqlDatabase
- MySQL新增索引偶遇waiting for table metadata lockMySql索引AI
- MySQL DDL Waiting for table metadata lock 解決MySqlAI
- Waiting for table metadata lockAI
- mysql metadata lock後設資料鎖之鎖狀態lock_status流轉圖MySql
- MYSQL METADATA LOCK(MDL LOCK)學習(1) 理論知識和加鎖型別測試MySql型別
- MySQL表結構變更引起的Metadata Lock|如何定位DDL被阻塞MySql
- create table if not exists Waiting for table metadata lockAI
- MySQL metadata鎖實驗MySql
- mysql lock操作MySql
- MySQL:理解MDL LockMySql
- MySQL 5.5 -- Metadata Locking Within TransactionsMySql
- mysql snapshot read快照讀及current read當前讀與鎖lock之一MySql
- 【MySQL】select for update 的Row Lock 與Table LockMySql
- 【MySQL】gap lock 淺析MySql
- mysql dead lock detectionMySql
- Mysql提醒之一MySql
- MySQL8.0 binlog_row_metadataMySql
- 【Mysql】FLUSH TABLES WITH READ LOCKMySql
- MySQL Next-Key LockMySql
- mysql表鎖與lock tablesMySql
- 【MySQL】MetaDataLock之一MySql
- 【MySql】 MySql備份工具Xtrabackup之一MySql
- oracle資料庫事務transaction鎖lock模式思考之一Oracle資料庫模式
- MySQL:Innodb 讓MDL LOCK和ROW LOCK 記錄到errlogMySql
- MySQL的GET_LOCK函式MySql函式
- MySQL-lock(鎖)-v2.0MySql
- MySQL:MDL LOCK的“穿越行為”MySql
- MySQL 的next-lock 鎖MySql
- mysql handler語句之一MySql