天天看點

mysql表不能通路了_MySQL資料庫之mysql打不開表問題解決方案

本文主要向大家介紹了MySQL資料庫之mysql打不開表問題解決方案 ,通過具體的内容向大家展現,希望對大家學習MySQL資料庫有所幫助。

做開發時候某一表怎麼也打不開,資料也不多,網上查了按下面這篇文章完美解決,但是要記得用root登入mysql:

記一次MySQL中Waiting for table metadata lock的解決方法

最近項目中的資料庫查詢經常挂起,應用程式啟動後也報操作逾時。測試人員就說資料庫又挂了(貌似他們眼中的連接配接失敗,查詢無果都是挂了),通過 show processlist 一看,滿屏都是 Waiting for table metadata lock 狀态的連接配接。第一反應就是kill掉這些連接配接,奈何連接配接實在太多,實在kill不過來,于是重新開機服務,貌似重新開機果真能解決90%的問題,但如果不找到問題原因,問題也肯定會再次出現。

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

1. 檢視未送出事務

從 information_schema.innodb_trx 表中檢視目前未送出的事務

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。

2. 調整鎖逾時門檻值

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分鐘

set session lock_wait_timeout = 1800;

set global lock_wait_timeout = 1800;

好讓出現該問題時快速故障(failfast)

本文由職坐标整理并釋出,希望對同學們學習MySQL有所幫助,更多内容請關注職坐标資料庫MySQL資料庫頻道!