线上给某个表执行新增索引SQL, 而后整个数据CPU打到100%, 链接数暴增到极限, 最后致使全部访问数据库的应用都奔溃.html
SQL以下:mysql
ALTER TABLE `book` ADD INDEX `idx_sub_title` (`sub_title` ASC);
能看到什么?sql
'10063293', 'root', '10.0.0.1:35252', 'novel', 'Query', '50', 'Waiting for table metadata lock', 'ALTER TABLE `lemon_novel`.`book` \nADD INDEX `idx_sub_title` (`sub_title` ASC)' '10094494', 'root', '172.16.2.112:42808', 'novel', 'Query', '31', 'Waiting for table metadata lock', 'SELECT \n book_trend.book_id AS book_id,
很奇怪, 这两边都在等"Waiting for table metadata lock"数据库
看下来下面的一些结论:ui
后来在阿里云上面还看到过他们特定写过相似的答疑.阿里云
阿里云建议主要是这样操做.spa
select concat('kill ',i.trx_mysql_thread_id,';') from information_schema.innodb_trx i, (select id, time from information_schema.processlist where time = (select max(time) from information_schema.processlist where state = 'Waiting for table metadata lock' and substring(info, 1, 5) in ('alter' , 'optim', 'repai', 'lock ', 'drop ', 'creat'))) p where timestampdiff(second, i.trx_started, now()) > p.time and i.trx_mysql_thread_id not in (connection_id(),p.id);
然而在个人场景, 上面的SQL并无任何的进程输出.code
不过上面给了一些思路, 如今咱们主要是由于有东西占用着 table metadata lock, 致使当前全部的东西都没有执行.orm
show full processlist;htm
看一眼没什么卵用, 处理那两个奇怪的wait lock, 其余的都挺正常的.
那么, 看下如今谁占用着锁?
怎么看呢?
select * from information_schema.innodb_trx;
神奇了, 真有两个东西在占用锁.
那kill 了他们看看.
额, 解决了.
某个奇怪的程序开了查询或者奇怪的操做, lock了 table metadata, 以后链接一直都没有被释放, 致使以上各类问题.
如今的问题来了, 到底是哪一个程序或者哪一个代码致使的呢?
抱歉, 我如今也还不知道...
理论上能够查, 可是上次去查的时候发现数据库显示的host对应机器的端口早就没东西了, 死无对证ing.
全文完.