DDL Online是什么?

为什么在线?

DDL联机的方法

官方自有DDL

pt-在线模式更改工具

Gh-ost工具

摘要

DDL Online是什么?

在线DDL:在线执行DDL语句,即在线修改表结构。Online是指在DDL语句执行过程中,表仍然可以不中断地提供正常的读写服务。

这就像在空给飞机加油而不降落的操作。

你可能觉得我快速执行一个DDL语句,不会导致表正常读写吧?那是因为你操作的表是数据量小的表,或者不是经常被访问的业务表。对于这些表,DDL语句确实很快,不会对业务产生很大影响。但是如果在一个几百万甚至几千万的大表上修改DDL语句,这个DDL语句的执行过程可能会持续几十秒甚至几分钟,这个时候的进程不会像操作一个小表那么快。

为什么在线?

在生产环境中,我们不可避免地会遇到表结构的修改。此时,在线表正在为后端请求访问提供各种服务。如果此时直接改变表结构,后端SQL请求可能会被阻塞,无法正常访问,导致服务异常或不可用。因此,我们应该特别注意在线表上的DDL操作。选择正确的方式和时间去做,尽量避免这些问题。

那么为什么向表中添加一个字段会导致表被锁定呢?

当我们向一个表中添加字段时,需要获取这个表的MDL元数据锁(写锁也叫X锁,读锁也叫S锁)。只有获取了这个MDL的X锁之后,才能修改这个表的结构,否则就会被阻塞。

DDL联机的方法

到目前为止,MySQL中DDL Online的方式主要有以下几种。

MySQL的官方DDL在线功能

Percona提供的Percona工具包

Github开源gh-ost工具

主从切换模式

脸书证券委员会

LHM

下面就这些方式逐一做个总结吧。

官方DDL在线

MySQL以后的版本已经支持DDL在线操作。使用时,在我们的DDL语句中显示了指定关键字算法和锁的参数值。例子如下:

/*推荐该参数组合*/alter table t add column col varchar(32), ALGORITHM=INPLACE, LOCK=NONE;alter table t add c佳人olumn 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=NON-jiawenshe百科e是重点,这里需要分别为ALGORITHM和LOCK两个参数指定值。

算法该参数的值可以是就地、复制和默认。原地:其原理是基于原表直接操作DDL,此时可以支持DML操作。COPY:其原理是复制一个与原表结构相同的表,然后基于这个新复制的表进行DDL操作。然后用这个复制的新表替换原来的表。在DDL执行期间,原始表不支持DML操作,因为数据已被复制到新表中。如果仍然在原始表中执行DML操作,这些操作将不会与复制的新表同步。默认值:默认值。根据DDL语句的类型,会自动选择就地或复制选项。如果可以使用INPLACE,则不使用COPY。注意:这个复制操作要求磁盘的空空间足够,因为它会复制一个与原表相同的表,会再次占用与原表相同的磁盘空空间,同时会增加IO的负载。所以一般情况下,我们用INPLACE作为算法参数的值,只有在某些DDL语句不支持ALGORITHM=INPLACE参数时,才选择ALGORITHM=COPY这个选项。

锁定参数的取值范围可以是无、共享、默认和独占。无:表示没有锁定。在DDL语句执行过程中,表仍然可以执行select和DML操作,这正是我们DDL Online真正想实现的。共享:可以执行select操作,但不能执行DML操作。默认:根据不同的DDL语句,采用所需的最小锁。EXCLUSIVE:在DDL语句执行期间,不能执行select操作,也不能执行DM文佳百科全书L操作。整个表完全无法读取并被锁定。

MySQL自带的DDL Online的参数概要如下:

图片参考:https://blog.csdn.net/finalkof1983/article/details/88355314

虽然MySQL已经正式支持DDL的在线操作,但是这种操作是有限制的,并不是所有的DDL语句都能真正在线执行。有些DDL语句,虽然我们显示应该在线执行,但是当MySQL实际执行的时候,如果发现无法在线,就会给出错误提示,让我们修改相应的显示参数离线执行。这里有很多不同的DDL语句,比如修改字段类型、添加主键、删除主键、添加索引、删除索引、更改索引名、添加字段、删除字段、修改字段长度等。根据不同类型的DDL语句,参数ALGORITHM和LOCK的范围不能任意组合。这个要看情况,具体场景分析。详情参考以下图片:

图片参考:https://blog.csdn.net/finalkof1983/article/details/88355314

另外,对于主从架构的场景使用官方DDL Online语句时,即使主节点可以在线执行,在从数据库中也会执行相同的DDL语句,在从数据库中执行DDL语句的对应表中会阻塞DML语句,造成主从延迟。一般流程如下:

在主节点的表上执行DDL语句。此时,表的DML仍然可以支持并行执行。

在执行该DDL语句之前,该操作不会通过binlog同步到从节点。DDL语句只有在主节点执行时,才会同步到从节点执行。

从节点开始执行从主节点同步的DDL时,从主节点同步的DML语句不能同时执行,同步的DML语句只能在从节点上的DDL语句完成后执行。

在这一点上,从站有一个延迟。

所以官方在线的DDL方法有一定的局限性。基本上我们不用这种方法。而是使用第三方工具实现表结构的在线修改。

pt-在线模式更改工具

Pt-online-schema-change是Percona提供的众多工具之一,是Percona Toolkit中的命令之一。这个工具箱的安装也比较简单,有多种安装方式。如果不想编译安装,可以下载编译好的二进制压缩包,开箱即用。解压后就可以进入bin目录使用了。下载地址:https://www.percona.com/downloads/percona-toolkit/LATEST/

Pt-online-schema-change可以实现在线DDL语句。其原理是基于触发器在线改变表结构。其实现过程大致如下:

首先,创建一个临时表。这个临时表的表结构与原始表的表结构不同,因为它已经应用了我们的DDL语句。

慢慢地将数据从原始表导入到这个临时表中。

当执行步骤2中的导入操作时,如果原始表上仍有DML语句,也应该记录这些操作,然后同步到临时表。

确保临时表中的数据与原始表中的数据完全同步后,用临时表替换原始表。

pt-osc工具的第三步是在原始表上创建插入、更新和删除触发器。通过这些触发器,将数据导入临时表的过程中对原始表的DML操作被同步到临时表。这种方法的大问题是增加了原表的压力,对原表中一些东西的操作会因为增加了触发器操作的临时表而导致东西变长。

声明:
本站部分内容转载于互联网,转载文章是出于传递更多信息之目的。若有来源标注错误或侵犯了您的合法权益,请与本网联系(runpll@foxmail.com),我们将及时更正、删除,谢谢。