要讨论这个问题, 我们需要拆分问题: DDL 多久会被 kill 掉 = DDL 多久会开始 kill + DD L的回滚收尾操作进行了多久
本实验只讨论如何观察: DDL 多久会开始 kill
实验..., 这里使用了我们之前写的脚本:
不需任何操作, 断点已经按我们的脚本添加好了
现在在 MySQL 中触发一个 alter :
找到我们指定的 gdb 日志文件:
可以看到里面密密麻麻的写满了堆栈信息,...综合以上实验, 我们得出初步结论:
对于本实验中的 DDL , MySQL 在以下几处检查了当前线程是否被 kill:
从旧表中 读取聚簇索引的过程
向新表中 写入索引的过程
重建索引时, 刷盘后进行检查...MySQL 将其分为若干部分, 在处理每一部分后进行检查也十分合理
需要注意的是: 对 DDL 进行 kill , 并不总能在合理的时间内触发: 比如对数据的处理变慢, 或者在堆栈3中 flush 变慢...小贴士
本实验中, 进行的 DDL 操作, 其操作类型如图:
对于其他类型的 DDL , 大家可通过实验自行探索.