什么是DDLOnline为什么要OnlineDDLOnline的方法官方自带DDLOnlinept-online-schema-change工具gh-ost工具总结什么是DDLOnlineDDLOnline:在线执行DDL语句,也就是在线修改表结构。所谓在线的意思就是保证在执行DDL语句的过程中,表
DDL Online:在线执行DDL语句,也就是在线修改表结构。所谓在线的意思就是保证在执行DDL语句的过程中,表仍然可以提供正常的读写服务,不会中断。
这就像飞机在不降落的情况下,在空中给飞机加油的操作。
你可能会想我执行一个DDL语句很快的呀,不会导致表不能正常读写吧?那是因为你操作的表是一个数据量比较小的表,或者不是一个被频繁访问的业务表,对于这些表,执行DDL语句确实很快,不会对业务造成很大的影响。但是,你如果对一个几百万、甚至上千万的大表进行DDL语句的修改,这个DDL语句执行的过程,可能会持续几十秒、甚至几分钟,此时的这个过程不会像操作小表那么快。
我们在生产环境中,难免要遇到对表结构的修改。而此时线上的表正在为后端提供各种请求访问的服务,如果此时我们直接进行对表结构的更改,可能导致后端的SQL请求被阻塞,不能正常访问,进而导致服务异常或不可用。所以,在我们对在线的表进行DDL操作的时候,要格外的注意。要选择合适的方式、合适的时间进行,尽量避免这些问题的发生。
那么为什么增加给表增加一个字段会导致锁表呢?
当我们对表增加字段的时候,我们就要获取这个表的MDL元数据锁(meta data lock)写锁(写锁又称为X锁,读锁又称为S锁),只有获取的这个MDL的X锁之后,我们才可以对这个表的结构进行修改,否则不能修改会被阻塞。
目前为止,MySQL的DDL Online的方式主要有以下几种。
下面我们分别针对其中的几种方式来一一归纳总结一下。
MySQL从5.6之后的版本已经支持了DDL的Online操作。在使用的时候,就是在我们的DDL语句中,显示去指定关键字ALGORITHM和LOCK的参数值。示例如下:
alter table t add column col varchar(32), ALGORITHM=INPLACE, LOCK=NONE;alter table t add column col varchar(32), ALGORITHM=INPLACE, LOCK=SHARED;alter table t add column col varchar(32), ALGORITHM=INPLACE, LOCK=DEFAULT;alter table t add column col varchar(32), ALGORITHM=INPLACE, LOCK=EXCLUSIVE;
其中的ALGORITHM=INPLACE, LOCK=NONE是关键的地方,这里需要分别为ALGORITHM和LOCK这两个参数指定值。
MySQL自带的DDL Online的参数大纲如下:
图片来源参考:https://blog.csdn.net/finalkof1983/article/details/88355314
MySQL官方虽然已经支持了DDL的Online操作,但是,这个操作比较有局限性,并不是所有的DDL语句都可以真正的Online的去执行。有些DDL语句,虽然我们显示的执行要让其使用online的方式去执行,但是当MySQL真正的去执行的时候,如果它发现不能online的时候,会给出错误提示,让我们修改对应的显示参数去改为offline的方式去执行。这里不同的DDL语句范围很广,例如:修改字段类型、增加主键、删除主键、增加索引、删除索引、更改索引名称、增加字段、删除字段、修改字段长度等等。根据不同类型的DDL语句,参数ALGORITHM和LOCK的取值范围并不是都可以随意组合使用的,这个要视情况而定,具体场景具体分析。具体参考如下图片:
图片来源参考:https://blog.csdn.net/finalkof1983/article/details/88355314
另外,在针对有主从架构的场景时,使用官方自带的这种DDL Online语句,即便是在master主节点可以online的去执行,但是会在从库上会执行同样的DDL语句期间,从库中对应的这个执行DDL语句的表会出现DML语句被阻塞的情况,从而出现主从延迟的现象。大致过程如下:
所以,官方自带的这个在线的DDL方式比较有局限性。我们基本上都不使用这种方式,而是采用第三方的工具来实现在线修改表结构的需求。
pt-online-schema-change是Percona公司提供的众多工具集中的一个,它是工具包Percona Toolkit里面的其中一个命令。而这个工具箱的安装也比较简单,有各种安装方式。如果不想编译安装,可以下载一个编译好的二进制压缩包,开箱即用,解压后进入bin目录既可以使用。下载地址为:https://www.percona.com/downloads/percona-toolkit/LATEST/
pt-online-schema-change可以实现在线的DDL语句。它的原理是基于触发器来实现在线更改表结构。它的实现过程大概如下:
其中的第3步,在pt-osc工具中的实现方式是在原表上创建insert、update、delete触发器,通过这些触发器,把在导入数据到临时表的过程中在对原表的DML操作同步到临时表中去。这种做法比较大的问题就是增加了原表的压力,对原表的一些事物的操作会因为触发器操作临时表的加入而导致事物变长。
本文地址:深圳seo/news/44936.html