在mysql 5.6线DDL

在线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文件,纳文件

<李>

变更完成


在mysql 5.6线DDL