ddl是什么意思(MySQL DDL Online)

/ 0评 / 0

什么是DDLOnline?为什么要OnlineDDLOnline?官方的DDLOLINEPT-online-schema-change工具gh-ost工具总结了什么是DDLOnlineDDLOnline:在线执行DDL语句,也就是在线修改表结构。在线意味着确保在执行DDL语句的过程中,表

什么是DDL在线

为什么在线

在线学习的方法

官方DDL

在线-在线-模式更改工具

高成本工具

摘要

什么是DDL在线

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

就像飞机在空中加油不着陆。

你可能认为我可以非常快速的执行一个DDL语句,不会导致表不能正常读写?这是因为您操作的表是一个包含少量数据的表,或者它不是一个经常访问的业务表。对于这些表,DDL语句执行的非常快,不会对业务造成很大影响。但是如果在几百万甚至几千万的大表上修改一个DDL语句,这个DDL语句的执行过程可能会持续几十秒甚至几分钟,此时的过程不会像小表的操作那么快。

为什么在线

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

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

当我们向表中添加字段时,我们需要获得MDL元数据锁写锁(写锁也称为X锁,读锁也称为S锁)。只有得到MDL X锁后,才能修改表的结构,否则会被阻塞。

在线学习的方法

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

MySQL官方DDL在线功能

Percona工具包由Percona提供

Github开源gh-ost工具

主从切换模式

脸书民间社会组织

LHM

下面,我们将逐一总结其中的一些方式。

官方DDL在线

MySQL从5.6版开始就支持DDL的Online操作。当使用它时,在我们的DDL语句中,显示了用于指定关键字算法和锁的参数值。例子如下:

/*推荐该参数组合*/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&百思特网nbsp;col varchar(32), ALGORITHM=INPLACE, LOCK=DEFAULT;alter table t add column col varchar(32), ALGORITH(原创www.isoyu.com版权)M=INPLACE, LOCK=EXCLUSIVE;

关键点是算法=就地,锁=无。在这里,您需要分别为算法和锁参数指定值。

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

锁定参数的取值范围可以是无、共享、默认和排除。NONE:表示没有锁,在DDL语句执行过程中,表仍然可以执行select和DML操作,这正是我们DDL Online真正想要实现的。SHARED:可以执行select操作,但不能执行DML操作。默认:根据不同的DDL语句,采用所需的最小锁。EXCLUSIVE:在DDL语句执行过程中,既不能执行select操作,也不能执行DML操作。整张桌子完全不可读,锁死了。

MySQL中包含的DDL Online的参数概要如下:

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

虽然MySQL官方支持DDL的Online操作,但是这个操作是有限制的,并不是所有的DDL语句都可以Online执行。对于一些DDL语句,虽然我们显示应该在线执行,但是MySQL实际执行的时候,如果发现不能在线,就会给出错误提示,让我们修改相应的显示参数离线执行。DDL语句种类繁多,如修改字段类型、添加主键、删除主键、添加索引、删除索引、更改索引名称、添加字段、删除字段、修改字段长度等等。根据DDL语句的不同类型,不能随意组合参数ACQUIRY和LOCK的值范围,这取决于具体情况,并在具体场景中进行分析。详见下图:

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

另外,针对主从架构的场景,使用官方的DDL Online语句,即使主节点可以在线执行,在从库中执行相同DDL语句的期间,DML语句会被阻塞在从库中执行DDL语句的对应表中,造成主从延迟的现象。一般过程如下:

当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操作与临时表同步。这种方法的大问题是增加了原表的压力,对原表中一些东西的操作会因为添加了触发操作临时表而导致东西变长。