MySQL 5.6 drop database時,table metadata lock等待

jesselyu發表於2015-03-07

 

一個線下庫環境,開發人員不提交DML和查詢事務,導致drop database時,遭遇表的metadata lock(MDL)等待,而不是SCHEMA上。

即會看到 “Waiting for table metadata lock”,而不是”Waiting for schema metadata lock”。這是為什麼呢?

 

經過原始碼分析,原因如下。

我們知道:

select 語句在操作時,需要對錶物件持有MDL_SHARED_READ鎖。

而DML語句在操作時,需要對錶物件持有MDL_SHARED_WRITE鎖。但都不需要SCHEMA級別metadata lock鎖。

另外drop database 時,需要依次獲取以下MDL鎖:

1) MDL_INTENSION_EXCLUSIVE(GLOBAL),STATEMENT 級別

2) MDL_EXCLUSIVE(SCHEMA),TRANSACTION級別

3) MDL_EXCLUSIVE (TABLE),TRANSACTION級別。在此database下的每個物件,需要MDL_EXCLUSIVE鎖。

 

那麼原因就非常明顯了:

這是因為查詢或者DML一張表時,只會獲取這個表的MDL_SHARED_READ或者MDL_SHARED_WRITE鎖;

而drop database 時,會按以上流程獲取相關鎖,因此只在第三步有衝突,前面兩步不會有衝突。

 

示例如下:

1. 起查詢事務

clip_image001

2. 刪除資料庫,此時當前會話hang住。

clip_image002

3. Show processlist結果,看到有”Waiting for table metadata lock”。

image

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30088583/viewspace-1451772/,如需轉載,請註明出處,否則將追究法律責任。

相關文章