如何校验MySQL使用INPLACE算法执行DDL时表未被替换重建
关于MySQL 5.7 INPLACE加索引后CREATE_TIME更新的问题解答
首先明确CREATE_TIME字段的含义
MySQL 5.7中INFORMATION_SCHEMA.TABLES的CREATE_TIME字段记录的是表对应的.frm元数据文件的最后修改时间,不是表的首次创建时间。执行INPLACE模式加二级索引操作时,需要修改表的元数据信息更新frm文件,因此该字段值会更新,和表是否被重建没有关联。
确认DDL是否重建表的几个可靠方法
- 看ALTER语句执行返回结果:COPY模式需要全量拷贝原表数据,执行完成后返回结果会显示
Query OK, N rows affected,N等于表的总行数;INPLACE模式加二级索引不会全量拷贝数据,返回结果为Query OK, 0 rows affected。 - 查看InnoDB的表空间ID:DDL执行前后分别执行查询
SELECT space FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE name='库名/表名';
如果两次查询返回的space值完全一致,说明原表空间没有被替换,表没有被重建。如果是COPY模式,会生成新的表空间,space值会发生变化。
- 观察DDL执行过程中的临时文件:COPY模式执行时会生成
#sql-开头的全量临时表文件,大小和原表.ibd文件接近;INPLACE加二级索引只会生成临时排序文件,不会生成和原表大小一致的临时表文件。 - 查看InnoDB引擎状态:DDL执行完成后执行
SHOW ENGINE INNODB STATUS,在最近的DDL记录中会明确标注该操作使用的ALGORITHM模式,可直接确认是否为INPLACE。
补充说明
ALGORITHM=INPLACE模式加二级索引不会重建表,仅会在原表空间中新增对应的索引数据,不会替换原表的行数据存储结构,符合官方文档的描述。
内容的提问来源于stack exchange,提问作者bumsoo
相关产品推荐
相关产品推荐

