標籤:waiting for table metadata lock
什麼是MDL
MDL,Meta Data lock,中繼資料鎖,一般稱為字典鎖。字典鎖與資料鎖相對應。字典鎖是為了保護資料對象被改變,一般是一些DDL會對字典對象改變,如兩個事物,事物1先查詢表,然後事物2試圖alter,其首先需要等待事物1結束(提交或復原),此時的狀態便是Waiting for table metadata lock,然後才能獲得字典鎖。後續對TableA的任何操作(包括讀)都無法進行,也會在Opening tables的階段進入Waiting for table metadata lock的隊列。如果是線上業務的核心表出現了這樣的鎖等待隊列,就會造成災難性的後果。資料鎖是保護表中的資料,如兩個事物同時更新一行時,先得到row lock的事務會先執行,後者只能等待。
出現的情況:
情境一:
通過show processlist可以看到TableA上有進行中的操作(包括讀),此時alter table語句無法擷取到metadata 獨佔鎖,會進行等待。出現Waiting for table metadata lock
情境二:
通過show processlist看不到TableA上有任何操作,但實際上存在有未提交的事務,可以information_schema.innodb_trx中查看到。在事務沒有完成之前,TableA上的鎖不會釋放,alter table同樣擷取不到metadata的獨佔鎖。
情境三:
通過show processlist看不到TableA上有任何操作,在information_schema.innodb_trx中也沒有任何進行中的事務。這很可能是因為在一個顯式的事務中,對TableA進行了一個失敗的操作(比如查詢了一個不存在的欄位),這時事務沒有開始,但是失敗語句擷取到的鎖依然有效。從performance_schema.events_statements_current表中可以查到失敗的語句。
本文出自 “mysql大資料實戰” 部落格,請務必保留此出處http://277963679.blog.51cto.com/6966371/1976802
mysql 中繼資料鎖 Meta Data lock