欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL出現Waiting for table metadata lock的原因方法

 更新時間:2019年05月12日 09:59:58   投稿:laozhang  
在本篇內容里小編給大家整理了MySQL出現Waiting for table metadata lock的原因以及解決方法對此有需要的朋友們學習下。

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

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

場景一:長事物運行,阻塞DDL,繼而阻塞所有同表的后續(xù)操作

通過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,繼而阻塞所有同表的后續(xù)操作

通過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的維護任務,在無人監(jiān)管的時候運行,最好通過lock_wait_timeout設置好超時時間,避免長時間的metedata鎖等待。

相關文章

  • MySQL ddl語句的使用

    MySQL ddl語句的使用

    這篇文章主要介紹了MySQL ddl語句的使用,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下
    2020-11-11
  • MySQL數據庫CRUD、常見函數及union查詢詳解

    MySQL數據庫CRUD、常見函數及union查詢詳解

    在MySQL中CRUD是指對數據庫進行增加(Create)、讀取(Retrieve)、更新(Update)和刪除(Delete)這四種基本操作的縮寫,這篇文章主要給大家介紹了關于MySQL數據庫CRUD、常見函數及union查詢的相關資料,需要的朋友可以參考下
    2024-01-01
  • Mysql性能調優(yōu)之max_allowed_packet使用及說明

    Mysql性能調優(yōu)之max_allowed_packet使用及說明

    這篇文章主要介紹了Mysql性能調優(yōu)之max_allowed_packet使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • MySQL連接異常報10061錯誤問題解決

    MySQL連接異常報10061錯誤問題解決

    這篇文章主要介紹了MySQL連接異常報10061錯誤問題解決,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • mysql下完整導出導入實現方法

    mysql下完整導出導入實現方法

    對于大量數據的導入導出,是件挺麻煩的事,需要考慮很多的細節(jié),這類對于需要大量數據導入導出的朋友可以參考下。
    2010-12-12
  • 擁有5星評級數據庫表結構 如何才能更高效的使用?

    擁有5星評級數據庫表結構 如何才能更高效的使用?

    本篇文章介紹了,擁有5星評級數據庫表結構 如何才能更高效的使用的方法。需要的朋友參考下
    2013-04-04
  • SQL常見函數整理之Format將日期、時間和數字值格式化

    SQL常見函數整理之Format將日期、時間和數字值格式化

    最近項目總是寫sql查詢時間,數據庫存的時間有各種格式,下面這篇文章主要給大家介紹了關于SQL常見函數整理之Format將日期、時間和數字值格式化的相關資料,需要的朋友可以參考下
    2024-01-01
  • MYSQL如何自動為查詢數據的結果編上序號詳解

    MYSQL如何自動為查詢數據的結果編上序號詳解

    這篇文章主要給大家介紹了關于MYSQL如何自動為查詢數據的結果編上序號的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用mysql具有一定的參考學習價值,需要的朋友們下面隨著小編來一起看看吧。
    2017-11-11
  • MySQL的鎖機制使用詳解

    MySQL的鎖機制使用詳解

    這篇文章主要介紹了MySQL的鎖機制使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 透徹理解Mysql連接的原理

    透徹理解Mysql連接的原理

    這篇文章主要為大家介紹了Mysql連接原理的深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07

最新評論