为什么DDL很难被Kill

67 阅读1分钟

DDL什么时候会被kill

  1. Mysql不是你kill掉DDL他就立马停止的, 他是通过一段时间去判断某个kill的标志;
  1. kill有时候会变得很慢, 可能因为IO的问题, 对数据的处理变慢, 或者在堆栈3中 flush 变慢, 此时只能等到检查点才会进行检查.
  1. 所以在线上的时候, 可能你执行kill, 但是它不会立马停止的, 如果立马停止, 也只是说明你执行的数据量少, 或者刚好到了检查的点;

以下步骤时, 会判断

  1. 从旧表中 读取聚簇索引的过程
  1. 向新表中 写入索引的过程
  1. 重建索引时, 刷盘后进行检查
  1. 将 online DDL log 回放到新表的过程
  1. 如果在这四个过程中, 发生了 kill , 那 DDL 操作很快就会开始回滚.

思考

  • 实际上,在程序或者线程中,中断或者打断必须是一个安全的过程,也就是必须是到达一个safepoint才能停止,ddl也是一样,所以kill的时候相当于打了个标志,等到ddl执行过程中,阶段性暂停的时候,会去看这个标志是否被中断,中断的话,才走中断的流程。
  • DDL前做好充分的时间测试和空间预估非常重要,如果需要支持并发DML,请一定要在alter语句中指定Lock算法