在线DDL, MySQL的实现细节共分为三个阶段:
准备阶段
1.纳文创建临时件
2.持有EXCLUSIVE-MDL锁,禁止读写
3 .根据改变类型,确定执行方式(复制、online-rebuild online-norebuild)
4.更新数据字典的内存对象
5.分配row_log对象记录增量
6.生成临时ibd文件
ddl执行阶段
1.降级EXCLUSIVE-MDL锁,允许读写
2.扫描原表的聚簇索引每条记录
3.遍历新表的聚簇索引和二级索引,逐一处理
4.根据记录构造对应的索引项
5.将构造索引项插入sort_buffer块
6.将sort_buffer块插入新的索引
7 .处理ddl执行过程中产生的增量(仅重建类型需要)
提交阶段
1.升级到EXCLUSIVE-MDL锁,禁止读写
2.应用最后row_log中产的日志
3.更新innodb的数据字典表
4 .提交事务(刷事务的重做日志)
5.修改统计信息
6.重命名临时idb文件,纳文件
7.变更完成
准备阶段
1.纳文创建临时件
2.持有EXCLUSIVE-MDL锁,禁止读写
3 .根据改变类型,确定执行方式(复制、online-rebuild online-norebuild)
4.更新数据字典的内存对象
5.分配row_log对象记录增量
6.生成临时ibd文件
ddl执行阶段
1.降级EXCLUSIVE-MDL锁,允许读写
2.扫描原表的聚簇索引每条记录
3.遍历新表的聚簇索引和二级索引,逐一处理
4.根据记录构造对应的索引项
5.将构造索引项插入sort_buffer块
6.将sort_buffer块插入新的索引
7 .处理ddl执行过程中产生的增量(仅重建类型需要)
提交阶段
1.升级到EXCLUSIVE-MDL锁,禁止读写
2.应用最后row_log中产的日志
3.更新innodb的数据字典表
4 .提交事务(刷事务的重做日志)
5.修改统计信息
6.重命名临时idb文件,纳文件
7.变更完成