java连接mysql执行ddl_Mysql 执行DDL导致Waiting for table metadata lock
MySQL在進(jìn)行alter table等DDL操作時(shí),有時(shí)會(huì)出現(xiàn)Waiting for table metadata lock的等待場(chǎng)景。而且,一旦alter table TableA的操作停滯在Waiting for table metadata lock的狀態(tài),后續(xù)對(duì)TableA的任何操作(包括讀)都無(wú)法進(jìn)行,因?yàn)樗麄円矔?huì)在Opening tables的階段進(jìn)入到Waiting for table metadata lock的鎖等待隊(duì)列。如果是生產(chǎn)環(huán)境的核心表出現(xiàn)了這樣的鎖等待隊(duì)列,就會(huì)造成災(zāi)難性的后果,比如電商中的訂單表。
遇到該種情況的解決方法:
1、show processlist
通過(guò)show processlist可以看到TableA上有正在進(jìn)行的操作(包括讀),此時(shí)alter table語(yǔ)句無(wú)法獲取到metadata 獨(dú)占鎖,會(huì)進(jìn)行等待。找到sid, 對(duì)應(yīng)字段為id,直接kill
2、select * from information_schema.innodb_trx\G
通過(guò)select * from information_schema.innodb_trx\G
找到未提交的事務(wù)的sid, 對(duì)應(yīng)字段為trx_mysql_thread_id, 直接kill
3、select * from performance_schema.events_statements_current;
通過(guò)show processlist看不到TableA上有任何操作,在information_schema.innodb_trx中也沒(méi)有任何進(jìn)行中的事務(wù)。這很可能是因?yàn)樵谝粋€(gè)顯式的事務(wù)中,對(duì)TableA進(jìn)行了一個(gè)失敗的操作(比如查詢了一個(gè)不存在的字段),這時(shí)事務(wù)沒(méi)有開(kāi)始,但是失敗語(yǔ)句獲取到的鎖依然有效,沒(méi)有釋放。從performance_schema.events_statements_current表中可以查到失敗的語(yǔ)句。
找到sid,對(duì)應(yīng)字段為thread_id, 直接kill
4、lock_wait_timeout
最好的方式是設(shè)置過(guò)期時(shí)間,避免長(zhǎng)時(shí)間metadata 鎖等待
總結(jié)
以上是生活随笔為你收集整理的java连接mysql执行ddl_Mysql 执行DDL导致Waiting for table metadata lock的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 为什么为什么是哪首歌啊?
- 下一篇: 勒巴沟岩画是谁画的啊?