华为云RDS-更高效轻量级的DDL变更特性:MySQL Online-DDL
【摘要】 1、背景:没有引入Online DDL之前,业务系统的数据表变更要么直接alter table,要么采用不阻塞业务的PT工具执行变更(变更流程较重)。Online DDL从MySql 5.6.7以后,已经有很大的改进,能够支撑多种类型的表结构变更,达到变更不中断业务的诉求。目前华为云mysql rds版本为可支持到5.7.27+,刚好可以很好的引入online ddl(既有能力),优化变更流...
1、背景:
- 没有引入Online DDL之前,业务系统的数据表变更要么直接alter table,要么采用不阻塞业务的PT工具执行变更(变更流程较重)。
- Online DDL从MySql 5.6.7以后,已经有很大的改进,能够支撑多种类型的表结构变更,达到变更不中断业务的诉求。
- 目前华为云mysql rds版本为可支持到5.7.27+,刚好可以很好的引入online ddl(既有能力),优化变更流程。
2、Online DDL语法:
alter table …. , ALGORITHM [=] { INPLACE | COPY | DEFAULT}, LOCK [=] { DEFAULT | NONE | SHARED | EXCLUSIVE }
# 示例
ALTER TABLE table_name algorithm=inplace, add column_name varchar(100) COMMENT '注释';
说明:
ALGORITHM
-
- 包含inplace和copy两种,优先采用inplace,这样可以减少IO/buffer pool资源占用,降低对RDS性能开销,注意:有些DDL不支持inplace,后续会详细阐述!
注意:采用inplace算法时,判断DDL是否修改行记录格式?是:rebuild表,否:no-rebuild表
LOCK DDL加锁的方式
-
NONE
不添加锁,既允许查询操作,也支持数据库变更操作,该模式下并发最好SHARED
对整个表格添加(S锁),允许查询操作,但是不支持修改EXCLUSIVE
对整个表格添加独占锁(X锁),不允许查询和修改DEFAULT
没有指定LOCK的时候,也是默认(优选方案),最小锁原则:首先优先NONE,不能再SHARE,还不能就EXCLUSIVE。
3、Online DDL支持情况:
本章节重点罗列常用的变更语句进行说明,
1
|
DDL
|
并发DML? |
Inplace?
|
Rebuid-Table |
说明
|
---|---|---|---|---|---|
1 | add/drop/rename index | Y | Y | N | 不包含全文索引,drop/rename只用修改元数据 |
2 | add fulltext index | N* | Y | N* | 表格中第一个全文索引要rebuild,增加第2...n个全文索引不用rebuild |
3 | set column默认值 | Y | Y | N | 仅修改元数据 |
4 | add/drop/rename column | Y | N | Y | 数据重组,所以它仍然是一项昂贵的操作。当添加列是auto-increment,不允许DML并发;rename时,允许并发DML,需要保持类型相同 |
5 | drop and add primary key | Y | Y | Y | alter table o_ddl algorithm=inplace, drop primary key, |
6 | drop primary key | N | N | Y | alter table o_ddl algorithm=copy, drop primary key 只支持copy |
7 | add primary key | Y* | Y | Y | 尽管inplace,但是要重组数据--高开销。如果列要转化NOT NULL,则不允许INPLACE |
8 | varchar 长度增加 | Y | Y | N | 扩容非常快 |
9 | varchar 长度减少 | N | N | Y | 只能COPY |
10 | change column DateType | N | N | Y | |
11 | add/drop foreign key constraint | Y | Y | N | foreign_key_checks开启时,add只能是copy |
12 | change auto-increment value | Y | Y | N | 修改自增长步长。 |
13 | add spatial index | N | Y | N | 空间索引,使用点较少 |
14 | optimize table | Y | Y* | Y | 带全文索引不支持inplace |
4、MySQL处理Online DDL原理(了解即可):
Online DDL处理有3个阶段:prepare、execute、commit。
-
- PREPARE
- 创建新的临时frm文件
- 持有EXCLUSIVE_MDL锁,禁止读写
- 根据alter类型,确定执行方式(copy,rebuild,no-rebuild)
- 更新数据字典的内存对象
- 若是需要rebuild,分配row_log记录增量数据,并生成临时ibd文件
- 如果是仅修改元数据:
- 本阶段无操作
- 其他:
- 降低EXCLUSIVE-MDL锁,允许读写(copy 不允许写)
- 记录ddl执行过程中产生的增量row-log(仅rebuild类型需要)
- 扫描old_table的聚集索引每一条记录record
- 遍历新表的聚集索引和二级索引,逐一处理
- 根据record构造对应的索引项
- 将构造索引项插入sort_buffer块
- 将sort_buffer块插入新的索引
- 把row-log中的操作应用到新临时表中,应用到最后一个Block
- 升级到EXECLUSIVE-MDL锁,禁止读写
- 重做最后一部分的row_log增量
- 更新innodb的数据字典表
- 提交事务,写redo日志
- 修改统计信息
- rename 临时的ibd文件、frm文件
- DDL完成
- PREPARE
注意:row-log是记录 DDL在执行过程中表格发生数据变更的操作,这样就可以保证执行DDL表格的并发性,在EXCUTE阶段可以正常提供写服务,不发生堵塞,最后把row-log应用到新的表格上即可。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)