MySQL 中在运行一个 DDL , 此时我们对这个 DDL 进行 kill , 那这个 DDL 多久会被 kill 掉?...(想知道应该在哪个函数打断点, 可以寻求开发同学的帮助)
当 gdb 运行到这个断点时, 我们让 gdb 打印当时的堆栈, 以及一条分割线, 这样我们就能看到是哪个流程调用了这个函数
然后开启 gdb...综合以上实验, 我们得出初步结论:
对于本实验中的 DDL , MySQL 在以下几处检查了当前线程是否被 kill:
从旧表中 读取聚簇索引的过程
向新表中 写入索引的过程
重建索引时, 刷盘后进行检查...翻一下官方文档, 对 kill 行为的描述如下:
可以看到 对于大批数据操作, MySQL 会在一部分数据处理后检查线程是否被 kill
我们的实验结论中, 1/2/4三个过程都涉及了大量数据的操作,...MySQL 将其分为若干部分, 在处理每一部分后进行检查也十分合理
需要注意的是: 对 DDL 进行 kill , 并不总能在合理的时间内触发: 比如对数据的处理变慢, 或者在堆栈3中 flush 变慢