[草稿]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                                               |
+-----+-----------------+-----------------------+--------------+---------+---------+------------------------+----------------------------------------------------------------+
Copyright © www.sqlfans.cn 2023 All Right Reserved更新时间: 2024-04-19 11:22:37

results matching ""

    No results matching ""