DDL什么时候会被kill
- Mysql不是你kill掉DDL他就立马停止的, 他是通过一段时间去判断某个kill的标志;
- kill有时候会变得很慢, 可能因为IO的问题, 对数据的处理变慢, 或者在堆栈3中 flush 变慢, 此时只能等到检查点才会进行检查.
- 所以在线上的时候, 可能你执行kill, 但是它不会立马停止的, 如果立马停止, 也只是说明你执行的数据量少, 或者刚好到了检查的点;
以下步骤时, 会判断
- 从旧表中 读取聚簇索引的过程
- 向新表中 写入索引的过程
- 重建索引时, 刷盘后进行检查
- 将 online DDL log 回放到新表的过程
- 如果在这四个过程中, 发生了 kill , 那 DDL 操作很快就会开始回滚.
思考
- 实际上,在程序或者线程中,中断或者打断必须是一个安全的过程,也就是必须是到达一个safepoint才能停止,ddl也是一样,所以kill的时候相当于打了个标志,等到ddl执行过程中,阶段性暂停的时候,会去看这个标志是否被中断,中断的话,才走中断的流程。
- DDL前做好充分的时间测试和空间预估非常重要,如果需要支持并发DML,请一定要在alter语句中指定Lock算法