java连接mysql执行ddl_Mysql 执行DDL导致Waiting for table metadata lock
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的鎖等待隊列。如果是生產環境的核心表出現了這樣的鎖等待隊列,就會造成災難性的后果,比如電商中的訂單表。
遇到該種情況的解決方法:
1、show processlist
通過show processlist可以看到TableA上有正在進行的操作(包括讀),此時alter table語句無法獲取到metadata 獨占鎖,會進行等待。找到sid, 對應字段為id,直接kill
2、select * from information_schema.innodb_trx\G
通過select * from information_schema.innodb_trx\G
找到未提交的事務的sid, 對應字段為trx_mysql_thread_id, 直接kill
3、select * from performance_schema.events_statements_current;
通過show processlist看不到TableA上有任何操作,在information_schema.innodb_trx中也沒有任何進行中的事務。這很可能是因為在一個顯式的事務中,對TableA進行了一個失敗的操作(比如查詢了一個不存在的字段),這時事務沒有開始,但是失敗語句獲取到的鎖依然有效,沒有釋放。從performance_schema.events_statements_current表中可以查到失敗的語句。
找到sid,對應字段為thread_id, 直接kill
4、lock_wait_timeout
最好的方式是設置過期時間,避免長時間metadata 鎖等待
總結
以上是生活随笔為你收集整理的java连接mysql执行ddl_Mysql 执行DDL导致Waiting for table metadata lock的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么为什么是哪首歌啊?
- 下一篇: mysql更改数据库数据存储目录_MyS