[草稿]mysql回滚为啥这么久
故障描述
- MySQL中使用kill命令去杀死连接时,如果使用
show processlist;
会发现线程会处于killed状态一段时间,而不是立即杀掉 - 一些情况下,killed状态可能会存在很久,甚至可能会一直存在直到发送第二次kill命令才能杀掉连接
发生原因
- 超大事务执行期间被kill触发回滚:回滚操作需要对事物期间生成的所有数据版本做回收操作,耗时比较长
- 大查询回滚需要清理临时表:查询过程中生成比较大的临时文件需要删除,如果此时文件系统压力很大,删除临时文件需要等待IO资源
- DDL执行到最后阶段被kill:需要删除中间过程的临时文件,可能受IO资源影响耗时较久
解决办法
- 场景1:2023.04.19,超大事务
insert into
执行7天被kill导致回滚9天仍未结束,最后重启mysql服务 -> 回滚进程消失,并没有造成处于回滚的sql继续回滚
mysql> show processlist;
+-----+-----------------+-----------------------+--------------+---------+---------+------------------------+----------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+-----------------+-----------------------+--------------+---------+---------+------------------------+----------------------------------------------------------------+
| 4 | event_scheduler | localhost | NULL | Daemon | 1909352 | Waiting on empty queue | NULL |
| 30 | bigdata | 192.168.201.201:28425 | email_notify | Killed | 1829528 | executing | INSERT INTO rk_overtime(project_code, record_date, source_id, |
| 202 | root | 172.18.0.1:58419 | feature_repo | Query | 0 | starting | show processlist |
+-----+-----------------+-----------------------+--------------+---------+---------+------------------------+----------------------------------------------------------------+