2020-12-03

我们之前介绍过Percona出品的pt-online-schema-change工具,它可以实现在线的DDL,其实MySQL在5.6版本中也加入了online DDL的功能,但是由于当时功能的不健,导致DBA们再使用时非常谨慎,甚至直接放弃了MySQL自带的在线变更功能,随着MySQL5.7的不断优化以及8.0的问世,MySQL自带的online DDL也是越发的完善和稳定,今天我们就一起来了解下。

ALGORITHM

MySQL online DDL的语法举例,比如我们想新增一个主键:

ALTER TABLE tbl_name ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;
其中ALGORITHM有三种算法,分别是copy,inplace,instant。

copy:当MySQL选用这种算法时,整个操作是offline的,在DDL执行期间会阻塞其他DML语句,期间会生产临时表,将原表中的数据拷贝至新表中。

inplace:所有的操作都是在innodb引擎层完成,不需要经过临时表。除了创建fulltext索引和spatial索引外,其他场景都是允许DML并行操作的。该算法又根据是否重建表分为rebuild和no-rebuild。

rebuild涉及表的重建,会在原表路径下生成新的.frm和.ibd文件,同时申请row log空间记录DDL执行期间的DML操作记录,最后再DDL提交阶段重做row log中的内容。

no-rebuild不涉及表的重建,除了创建添加索引会产生二级索引的写入操作外,其余操作只修改元数据信息,不会生成.ibd文件,并且不会申请row log空间,这种场景消耗IO较少,速度较快。

instant:该特性是MySQL8.0.12引入,只修改数据字典的元数据信息,无需拷贝数据也无需重建表,原表数据不受影响。整个DDL过程执行非常快,不会阻塞DML操作。

注意:

在执行DDL操作时,一般不需要我们指定ALGORITHM,MySQL内部会自行判断应该采用哪种方式进行变更。

对于涉及rebuild表的操作,需要关注下原表所在磁盘的使用情况。

对于申请row log空间的操作,需要关注innodb_online_alter_log_max_size的值,该值默认128M,代表row log的最大值,支持动态修改。空间每次申请的大小由innodb_sort_buffer_size决定。

对于24小时业务表,如果你不确定该操作会不会影响线上业务,建议使用pt-osc工具执行变更。

DDL操作场景分类

前面讲了online ddl的各种算法,由于并不是所有的操作是online的,需要我们加![在这里插入图片描述](https://img-blog.csdnimg.cn/20201203133042460.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MjM1ODUyOQ==,size_16,color_FFFFFF,t_70#pic_center)

以区分,针对不同的操作MySQL内部会采用哪种模式进行变更,我进行了分类总结,希望能帮助到你!
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值