本文主要对Mariadb和MySQL对Online DDL的支持情况做一个对比,方便读者随时参考。MariaDB 10.8引入了Lag Free Alter这个新特性,该特性主要是为了降低DDL引起的复制延迟,本文也给出了MariaDB 对不同DDL,lag free alter的支持情况。
Mariadb Online DDL
当用户通过ALGORITHM 参数为DDL指定执行算法时,如果用户指定算法为COPY,那么则使用COPY算法,如果用户指定其他算法,则MariaDB认为用户指定的算法是用户期待的最低有效性算法,MariaDB会选择支持该DDL操作的最有效算法来执行,如果MariaDB无法满足用户的有效性需求,则报错;如果用户选择DEFAULT,则MariaDB会选择支持该DDL操作的最有效算法来执行。
NO COPY和INSTANCE是在MariaDB10.3.7中引入的。
四种算法有效性从低到高:
-
COPY:一定重建表,其操作大致分为四步,创建临时表,从原表向临时表拷贝数据,废弃原表,rename临时表;临时表和原表保存在同一个目录下,命名方式为sql${PID}_${THREAD_ID}_${TMP_TABLE_COUNT}。
-
INPLACE:有的操作需要重建表,一些操作不需要,取决于存储引擎;INPLACE大致操作为,创建临时文件;拷贝原表,过程中发生的DML操作写row log;数据拷贝完成后应用row log到临时文件;删除原表;用临时文件代替原表。
-
NOCOPY:对于需要重建聚簇索引的DDL,则需要重建表,NOCOPY不支持所有需要重建聚簇索引的操作,MariaDB 10.3.7开始支持。
-
INSTANT:INSTANT不支持所有需要更改数据文件的操作,除了更新元数据,MariaDB 10.3.7开始支持。具体细节可以参考文章 http://mysql.taobao.org/monthly/2020/03/01/
对比
下表给出的是Mariadb最新版和MySQL8.0最新版本的比较,MySQL不支持NO COPY操作,因此NO COPY不参与比较,但是下表列出了MariaDB的支持情况。Lag Free为mariadb引入的新特性,主要目的是为了降低DDL引起的复制延迟问题,具体可以参考Lag Free Alter On Slave。
操作 |
INSTANT |
NO COPY |
INPLACE |
重建表 |
并发 DML |
仅修改元数据 |
和MySQL是否一致 |
是否支持lag free |
列操作 |
||||||||
添加列 |
MariaDB 10.4及以后 yes |
MariaDB 10.4及以后 yes |
yes |
inplace需要重建表 |
添加自增列不允许 |
yes |
一致 |
yes |
删除列 |
MariaDB 10.4及以后 yes |
MariaDB 10.4及以后 yes |
yes |
inplace需要重建表 |
yes |
yes |
一致 |
yes |
调整列顺序 |
MariaDB 10.4及以后 yes |
MariaDB 10.4及以后 yes |
yes |
inplace需要重建表 |
yes |
yes |
不一致,MariaDB 10.4及以后支持INSTANT和NO COPY |
yes |
修改列数据类型 |
no |
no |
no |
yes |
no |
yes |
一致 |
yes |
扩展 VARCHAR 长度 |
MariaDB 10.4.3及以后yes |
MariaDB 10.4.3及以后yes |
MariaDB 10.4.3及以后yes |
no |
yes |
yes |
不一致,MariaDB支持ROW_FORMAT为特定取值下算法为INSTANT和NO COPY |
yes |
修改列为空 |
MariaDB 10.4.3及以后yes |
MariaDB 10.4.3及以后yes |
yes |
inplace需要重建表 |
yes |
不一致,MariaDB支持ROW_FORMAT取值为REDUNDANT下算法为INSTANT和NO COPY |
yes |
|
修改列为非空 |
no |
no |
yes |
yes |
yes |
no |
一致 |
yes |
添加新ENUM选项 |
yes |
yes |
yes |
no |
yes |
yes |
一致 |
yes |
添加新的SET选项 |
yes |
yes |
yes |
no |
yes |
yes |
一致 |
yes |
修改列默认值 |
yes |
yes |
yes |
no |
yes |
yes |
一致 |
yes |
删除列默认值 |
yes |
yes |
yes |
no |
yes |
yes |
一致 |
yes |
重命名列 |
yes |
yes |
yes |
no |
yes |
yes |
一致 |
yes |
索引操作 |
||||||||
添加主键 |
no |
no |
yes |
yes |
yes |
no |
一致 |
yes |
删除主键 |
no |
no |
no |
yes |
no |
no |
一致 |
yes |
重建主键 |
no |
no |
yes |
yes |
yes |
no |
一致 |
yes |
二级索引 |
||||||||
创建二级索引 |
no |
yes |
yes |
no |
yes |
no |
一致 |
yes |
创建全文索引 |
no |
yes |
yes |
一些情况下不需要重建表 |
允许只读DML并发执行 |
no |
一致 |
yes |
创建空间索引 |
no |
yes |
yes |
no |
允许只读DML并发执行 |
no |
一致 |
yes |
删除二级索引 |
no |
yes |
yes |
no |
yes |
yes |
一致 |
yes |
添加外键 |
no |
yes |
yes |
no |
yes |
yes |
一致 |
yes |
删除外键 |
yes |
yes |
yes |
no |
yes |
yes |
不一致,MySQL不支持INSTANT |
yes |
表操作 |
||||||||
修改自增值 |
yes |
yes |
yes |
no |
yes |
yes |
不一致,MySQL不支持INSTANT,且不只修改元数据 |
yes |
修改ROW_FORMAT |
no |
no |
yes |
yes |
yes |
no |
一致 |
yes |
修改KEY_BLOCK_SIZE |
no |
no |
yes |
yes |
yes |
no |
一致 |
yes |
使用force选项重建表 |
no |
no |
yes |
yes |
yes |
no |
不一致,MySQL不支持有全文索引的表使用INPLACE重建 |
yes |
重建表 |
no |
no |
yes |
yes |
yes |
no |
不一致,MySQL不支持有全文索引的表使用INPLACE重建 |
yes |
optimize表 |
no |
no |
yes |
yes |
yes |
no |
不一致,MySQL不支持有全文索引的表使用INPLACE重建 |
no |
重命名表 |
yes |
yes |
yes |
no |
no |
yes |
一致 |
no |
从上表可以看出,MariaDB和MySQL对于Online DDL的支持情况大体相同。MariaDB对重建表的相关操作在全文索引方面做了更多的工作,在row_format设置为特定值的情况下,也支持用INSTANT方式扩展VARCHAR操作和修改列值为空操作。同时MariaDB引入了lag free alter,是解决DDL引入的复制延迟的一次有益探索。
参考文档
https://mariadb.com/kb/en/innodb-online-ddl-overview/
https://mariadb.com/kb/en/innodb-online-ddl-operations-with-the-inplace-alter-algorithm/
https://mariadb.com/kb/en/innodb-online-ddl-operations-with-the-nocopy-alter-algorithm/
https://mariadb.com/kb/en/innodb-online-ddl-operations-with-the-instant-alter-algorithm/
https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html
https://z.itpub.net/article/detail/CA30E7600D9E096E3601E6D68469E5AD