MySQL DDL Online ddl是什么意思( 二 )


MySQL自带的DDL Online的参数大纲如下:

MySQL DDL Online ddl是什么意思

文章插图


【MySQL DDL Online ddl是什么意思】图片来源参考:https://blog.csdn.net/finalkof1983/article/details/88355314
MySQL官方虽然已经支持了DDL的Online操作,但是,这个操作比较有局限性,并不是所有的DDL语句都可以真正的Online的去执行 。有些DDL语句,虽然我们显示的执行要让其使用online的方式去执行,但是当MySQL真正的去执行的时候,如果它发现不能online的时候,会给出错误提示,让我们修改对应的显示参数去改为offline的方式去执行 。这里不同的DDL语句范围很广,例如:修改字段类型、增加主键、删除主键、增加索引、删除索引、更改索引名称、增加字段、删除字段、修改字段长度等等 。根据不同类型的DDL语句,参数ALGORITHM和LOCK的取值范围并不是都可以随意组合使用的,这个要视情况而定,具体场景具体分析 。具体参考如下图片:
MySQL DDL Online ddl是什么意思

文章插图


图片来源参考:https://blog.csdn.net/finalkof1983/article/details/88355314
另外,在针对有主从架构的场景时,使用官方自带的这种DDL Online语句,即便是在master主节点可以online的去执行,但是会在从库上会执行同样的DDL语句期间,从库中对应的这个执行DDL语句的表会出现DML语句被阻塞的情况,从而出现主从延迟的现象 。大致过程如下:
  1. 在master节点上某个表执行DDL语句,此时对表的DML仍然可以支持并行的执行 。
  2. 在这个DDL语句没有执行完成之前,这个操作是不会通过binlog同步到slave节点上去的 。只有当这个DDL语句在master节点执行完成后,才会同步到slave节点去执行 。
  3. 当slave开始执行从master同步过来的DDL的过程中,从master节点同步过来的,对该表的DML语句不能同时执行,需要等待slave上面的DDL语句执行完成后,才可以执行同步过来的DML语句 。
  4. 此时,在slave上就出现了延迟的现象 。
所以,官方自带的这个在线的DDL方式比较有局限性 。我们基本上都不使用这种方式,而是采用第三方的工具来实现在线修改表结构的需求 。


pt-online-schema-change工具pt-online-schema-change是Percona公司提供的众多工具集中的一个,它是工具包Percona Toolkit里面的其中一个命令 。而这个工具箱的安装也比较简单,有各种安装方式 。如果不想编译安装,可以下载一个编译好的二进制压缩包,开箱即用,解压后进入bin目录既可以使用 。下载地址为:https://www.percona.com/downloads/percona-toolkit/LATEST/
pt-online-schema-change可以实现在线的DDL语句 。它的原理是基于触发器来实现在线更改表结构 。它的实现过程大概如下:
  1. 先创建一个临时表,这个临时表的表结构比原表的表结构不同之处就在于它已经应用了我们的DDL语句 。
  2. 把原表中的数据慢慢的导入到这个临时表中 。
  3. 在执行第2步导入操作的时候,如果仍然有对原表的DML语句,这些操作也要记录下来,然后同步到临时表中 。
  4. 在确保临时表中的数据和原表中的数据完全同步之后,用临时表替换原表 。
其中的第3步,在pt-osc工具中的实现方式是在原表上创建insert、update、delete触发器,通过这些触发器,把在导入数据到临时表的过程中在对原表的DML操作同步到临时表中去 。这种做法比较大的问题就是增加了原表的压力,对原表的一些事物的操作会因为触发器操作临时表的加入而导致事物变长 。

推荐阅读