在线ddl主要包括3个阶段,准备阶段,ddl执行阶段,提交阶段,重建方式比no-rebuild方式实质多了一个ddl执行阶段,准备阶段和提交阶段类似。下面将主要介绍ddl执行过程中三个阶段的流程。
- <李>
<强>准备阶段强>:
李>- <李>
创建新的临纳文时件(与InnoDB无关)
李> <李>持有EXCLUSIVE-MDL锁,禁止读写
李> <李>根据改变类型,确定执行方式(复制、online-rebuild online-norebuild)
假如是添加索引,则选择online-norebuild即原地方式
更新数据字典的内存对象
李> <李>分配row_log对象记录增量(仅重建类型需要)
李> <李>生成新的临时ibd文件(仅重建类型需要)
李>ddl执行阶段:
- <李>
降级EXCLUSIVE-MDL锁,允许读写
李> <李>扫描old_table的聚集索引每一条记录rec
李> <李>遍历新表的聚集索引和二级索引,逐一处理
李> <李>根据rec构造对应的索引项
李> <李>将构造索引项插入sort_buffer块排序
李> <李>将sort_buffer块更新到新的索引上
李> <李>记录ddl执行过程中产生的增量(仅重建类型需要)
李> <李>重放row_log中的操作到新索引上(no-rebuild数据是在原表上更新的)
李> <李>重放row_log间产生dml操作附加到row_log最后一个块
李>- <李>
<强>提交阶段强>:
李>- <李>
当前块为row_log最后一个时,禁止读写,升级到EXCLUSIVE-MDL锁
李> <李>重做row_log中最后一部分增量
李> <李>更新InnoDB的数据字典表
李> <李>提交事务(刷事务的重做日志)
李> <李>修改统计信息
李> <李>rename临时idb文件,纳文件
李> <李>变更完成
李>