单表数据量:670W;
删除一个老的索引,新建一个新的索引。
事故原因:
先删除索引,应用访问量大,没有索引自然慢,数据库CPU飚到100%;新索引创建失败。
直接造成交易打烊。
日志:
------[2019-03-26 19:39:48]------
检查Threads_running(运行中的线程数量),它在一定程度上代表了当前数据库的负荷。
[Threads_running : 28 ] 正常。
------[2019-03-26 19:39:48]------
set lock_wait_timeout=10
------[2019-03-26 19:39:48]------
开始执行SQL...
------[2019-03-26 19:39:59]------
Lock wait timeout exceeded; try restarting transaction
------[2019-03-26 19:39:59]------
重试执行第1次...
------[2019-03-26 19:39:59]------
检查Threads_running(运行中的线程数量),它在一定程度上代表了当前数据库的负荷。
------[2019-03-26 19:39:59]------
[Threads_running : 142 ]当前数据库繁忙。暂停5S后将执行第1次重试,请等待...
------[2019-03-26 19:40:04]------
开始重试检查Threads_running。
------[2019-03-26 19:40:04]------
[Threads_running : 143 ]当前数据库繁忙。暂停5S后将执行第2次重试,请等待...
------[2019-03-26 19:40:09]------
开始重试检查Threads_running。
------[2019-03-26 19:40:09]------
[Threads_running : 143 ]当前数据库繁忙。暂停5S后将执行第3次重试,请等待...
------[2019-03-26 19:40:14]------
开始重试检查Threads_running。
------[2019-03-26 19:40:14]------
[Threads_running : 143 ]当前数据库繁忙。暂停5S后将执行第4次重试,请等待...
------[2019-03-26 19:40:19]------
开始重试检查Threads_running。
------[2019-03-26 19:40:19]------
[Threads_running : 143 ]当前数据库繁忙。暂停5S后将执行第5次重试,请等待...
------[2019-03-26 19:40:24]------
开始重试检查Threads_running。
------[2019-03-26 19:40:24]------
[Threads_running : 143 ] 当前数据库繁忙!任务取消执行,请稍后数据库空闲后重试!
处理方案:
下线应用,kill掉CPU链接,等CPU降下来手工创建索引。启动应用,正常。
经验教训:
1、加强DDL语句审核
2、先建索引,再删索引,顺序一定要对,尤其产线。