mysql 出現了 Waiting for table metadata lock的解決方案

在使用pt進行ddl 的時候需要創建觸發器,然後在創建的過程中,出現了Waiting for table metadata lock, 下面是一些解決辦法,本質是一樣的,這裏總結來說就是:

  1. kill 掉某些事物佔用的鎖,使DDL成功,然後進而不阻塞其他DML操作。
  2. 設置鎖超時短些 lock_wait_timeout

另外可以參考以下鏈接:

文章一:

在網上查詢得知MySQL在進行一些alter table等DDL操作時,如果該表上有未提交的事務則會出現 Waiting for table
metadata lock ,而一旦出現metadata lock,該表上的後續操作都會被阻塞(詳見
http://www.bubuko.com/infodetail-1151112.html
。所以這個問題需從兩方面解決:

  1. 查看未提交事務 從 information_schema.innodb_trx 表中查看當前未提交的事務

sql select trx_state, trx_started, trx_mysql_thread_id, trx_query from information_schema.innodb_trx\G
(\G作爲結束符時,MySQL Client會把結果以列模式展示,對於列比較長的表,展示更直觀)

字段意義:

  • trx_state: 事務狀態,一般爲RUNNING
  • trx_started: 事務執行的起始時間,若時間較長,則要分析該事務是否合理
  • trx_mysql_thread_id: MySQL的線程ID,用於kill
  • trx_query: 事務中的sql 一般只要kill掉這些線程,DDL操作就不會Waiting for table metadata lock。
  1. 調整鎖超時閾值 lock_wait_timeout 表示獲取metadata lock的超時(單位爲秒),允許的值範圍爲1到31536000(1年)。 默認值爲31536000。詳見
    https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_lock_wait_timeout
    。默認值爲一年!!!已哭瞎!將其調整爲30分鐘

sql set session lock_wait_timeout = 1800; set global lock_wait_timeout = 1800;
好讓出現該問題時快速故障(failfast)

另外:一些擴展內容

  • DML(data manipulation language)數據操縱語言:就是我們最經常用到的 SELECT、UPDATE、INSERT、DELETE。 主要用來對數據庫的數據進行一些操作
  • DDL(data definition language)數據庫定義語言:其實就是我們在創建表的時候用到的一些sql,比如說:CREATE、ALTER、DROP等。DDL主要是用在定義或改變表的結構,數據類型,表之間的鏈接和約束等初始化工作上
  • DCL(Data Control Language)數據庫控制語言:是用來設置或更改數據庫用戶或角色權限的語句,包括(grant,deny,revoke等)語句。這個比較少用到
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章