MySQL出現Waiting for table metadata lock的原因以及解決方案

來源:互聯網
上載者:User

標籤:

轉自:http://ctripmysqldba.iteye.com/blog/1938150 (有修改)

MySQL在進行alter table等DDL操作時,有時會出現Waiting for table metadata lock的等待情境。而且,一旦alter table TableA的操作停滯在Waiting for table metadata lock的狀態,後續對TableA的任何操作(包括讀)都無法進行,因為他們也會在Opening tables的階段進入到Waiting for table metadata lock的鎖等待隊列。如果是產品環境的核心表出現了這樣的鎖等待隊列,就會造成災難性的後果。

造成alter table產生Waiting for table metadata lock的原因其實很簡單,一般是以下幾個簡單的情境:

情境一:長事物運行,阻塞DDL,繼而阻塞所有同表的後續操作

通過show processlist可以看到TableA上有進行中的操作(包括讀),此時alter table語句無法擷取到metadata 獨佔鎖,會進行等待。

這是最基本的一種情形,這個和mysql 5.6中的online ddl並不衝突。一般alter table的操作過程中(見),在after create步驟會擷取metadata 獨佔鎖,當進行到altering table的過程時(通常是最花時間的步驟),對該表的讀寫都可以正常進行,這就是online ddl的表現,並不會像之前在整個alter table過程中阻塞寫入。(當然,也並不是所有類型的alter操作都能online的,具體可以參見官方手冊:http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.html)
處理方法: kill 掉 DDL所在的session.

 

情境二:未提交事物,阻塞DDL,繼而阻塞所有同表的後續操作

通過show processlist看不到TableA上有任何操作,但實際上存在有未提交的事務,可以在information_schema.innodb_trx中查看到。在事務沒有完成之前,TableA上的鎖不會釋放,alter table同樣擷取不到metadata的獨佔鎖。

處理方法:通過 select * from information_schema.innodb_trx\G, 找到未提交事物的sid, 然後 kill 掉,讓其復原。

 

情境三:

通過show processlist看不到TableA上有任何操作,在information_schema.innodb_trx中也沒有任何進行中的事務。這很可能是因為在一個顯式的事務中,對TableA進行了一個失敗的操作(比如查詢了一個不存在的欄位),這時事務沒有開始,但是失敗語句擷取到的鎖依然有效,沒有釋放。從performance_schema.events_statements_current表中可以查到失敗的語句。

官方手冊上對此的說明如下:

If the server acquires metadata locks for a statement that is syntactically valid but fails during execution, it does not release the locks early. Lock release is still deferred to the end of the transaction because the failed statement is written to the binary log and the locks protect log consistency.

也就是說除了語法錯誤,其他錯誤語句擷取到的鎖在這個事務提交或復原之前,仍然不會釋放掉。because the failed statement is written to the binary log and the locks protect log consistency 但是解釋這一行為的原因很難理解,因為錯誤的語句根本不會被記錄到二進位日誌。

處理方法:通過performance_schema.events_statements_current找到其sid, kill 掉該session. 也可以 kill 掉DDL所在的session.

 

總之,alter table的語句是很危險的(其實他的危險其實是未提交事物或者長事務導致的),在操作之前最好確認對要操作的表沒有任何進行中的操作、沒有未提交事務、也沒有明確交易中的報錯語句。如果有alter table的維護任務,在無人監管的時候運行,最好通過lock_wait_timeout設定好逾時時間,避免長時間的metedata鎖等待。

 

MySQL出現Waiting for table metadata lock的原因以及解決方案

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.