Online DDL MySQL&MariaDB

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 本文主要对Mariadb和MySQL对Online DDL的支持情况做一个对比,方便读者随时参考。MariaDB 10.8引入了Lag Free Alter这个新特性,该特性主要是为了降低DDL引起的复制延迟,本文也给出了MariaDB 对不同DDL,lag free alter的支持情况。Mariadb Online DDL当用户通过ALGORITHM 参数为DDL指定执行算法时,如果用户指定算

本文主要对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

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
SQL 关系型数据库 MySQL
|
5月前
|
SQL 关系型数据库 MySQL
MySQL DDL(数据定义语言)深度解析
MySQL DDL(数据定义语言)深度解析
|
2月前
|
SQL 关系型数据库 MySQL
MySQL 更新1000万条数据和DDL执行时间分析
MySQL 更新1000万条数据和DDL执行时间分析
162 4
|
4月前
|
关系型数据库 Java MySQL
Linux安装JDK1.8 & tomcat & MariaDB(MySQL删减版)
本教程提供了在Linux环境下安装JDK1.8、Tomcat和MariaDB的详细步骤。这三个组件的组合为Java Web开发和部署提供了一个强大的基础。通过遵循这些简单的指导步骤,您可以轻松建立起一个稳定、高效的开发和部署环境。希望这个指导对您的开发工作有所帮助。
238 8
|
4月前
|
SQL 存储 关系型数据库
"MySQL增列必锁表?揭秘InnoDB在线DDL,让你的数据库操作飞一般,性能无忧!"
【8月更文挑战第11天】在数据库领域,MySQL凭借其稳定高效的表现深受开发者喜爱。对于是否会在给数据表添加列时锁表的问题,MySQL的行为受版本、存储引擎等因素影响。从5.6版起,InnoDB支持在线DDL,可在改动表结构时保持表的可访问性,避免长时间锁表。而MyISAM等则需锁表完成操作。例如,在使用InnoDB的表上运行`ALTER TABLE users ADD COLUMN email VARCHAR(255);`时,通常不会完全锁表。虽然在线DDL提高了灵活性,但复杂操作或大表变更仍可能暂时影响性能。因此,进行结构变更前应评估其影响并择机执行。
75 6
|
5月前
|
缓存 关系型数据库 MySQL
error: Failed dependencies: mariadb-connector-c-config is obsoleted by mysql-community-server-8.0.36-1.el7.x86_64 问题解决
error: Failed dependencies: mariadb-connector-c-config is obsoleted by mysql-community-server-8.0.36-1.el7.x86_64 问题解决
283 19
|
5月前
|
SQL 算法 关系型数据库
Mysql Online DDL
Mysql Online DDL
74 2
|
4月前
|
SQL 关系型数据库 MySQL
如何在 MySQL 或 MariaDB 中导入和导出数据库
如何在 MySQL 或 MariaDB 中导入和导出数据库
614 0
|
4月前
|
SQL Ubuntu 关系型数据库
如何在云服务器上创建和管理 MySQL 和 MariaDB 数据库
如何在云服务器上创建和管理 MySQL 和 MariaDB 数据库
53 0
|
4月前
|
关系型数据库 MySQL 数据库连接
FreeSWITCH通过mod_mariadb原生连接MySQL
FreeSWITCH通过mod_mariadb原生连接MySQL
354 0