什么是DDLOnline为什么要OnlineDDLOnline的方法官方自带DDLOnlinept-online-schema-change工具gh-ost工具总结什么是DDLOnlineDDLOnline:在线执行DDL语句,也就是在线修改表结构 。所谓在线的意思就是保证在执行DDL语句的过程中,表
- 什么是DDL Online
- 为什么要Online
- DDL Online的方法
- 官方自带DDL
- Onlinept-online-schema-change工具
- gh-ost工具
- 总结
这就像飞机在不降落的情况下,在空中给飞机加油的操作 。
文章插图
你可能会想我执行一个DDL语句很快的呀,不会导致表不能正常读写吧?那是因为你操作的表是一个数据量比较小的表,或者不是一个被频繁访问的业务表,对于这些表,执行DDL语句确实很快,不会对业务造成很大的影响 。但是,你如果对一个几百万、甚至上千万的大表进行DDL语句的修改,这个DDL语句执行的过程,可能会持续几十秒、甚至几分钟,此时的这个过程不会像操作小表那么快 。
为什么要Online我们在生产环境中,难免要遇到对表结构的修改 。而此时线上的表正在为后端提供各种请求访问的服务,如果此时我们直接进行对表结构的更改,可能导致后端的SQL请求被阻塞,不能正常访问,进而导致服务异常或不可用 。所以,在我们对在线的表进百思特网行DDL操作的时候,要格外的注意 。要选择合适的方式、合适的时间进行,尽量避免这些问题的发生 。
那么为什么增加给表增加一个字段会导致锁表呢?
当我们对表增加字段的时候,我们就要获取这个表的MDL元数据锁(meta data lock)写锁(写锁又称为X锁,读锁又称为S锁),只有获取的这个MDL的X锁之后,我们才可以对这个表的结构进行修改,否则不能修改会被阻塞 。
DDL Online的方法目前为止,MySQL的DDL Online的方式主要有以下几种 。
- MySQL官方自带的DDL Online功能
- percona提供的Percona Toolkit
- Github开源的gh-ost工具
- 主从切换的方式
- Facebook的OSC
- LHM
官方自带DDL OnlineMySQL从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), ALGORI百思特网THM=INPLACE, LOCK=DEFAULT;alter table t add column col varchar(32), ALGORITHM=INPLACE, LOCK=EXCLUSIVE;其中的ALGORITHM=INPLACE, LOCK=NONE是关键的地方,这里需要分别为ALGORITHM和LOCK这两个参数指定值 。
- ALGORITHM该参数的值可以为INPLACE、COPY、DEFAULT 。INPLACE:它的原理是基于原来的表直接进行DDL的操作,此时原表可以支持DML操作 。COPY:它的原理是复制出一张和原表的结构一样的表,然后基于这个新复制出来的表进行DDL操作 。然后再用这个复制出来的新表替换掉原表 。在执行DDL期间,原表不支持DML的操作,因为数据已经复制了一个新表中,在原表中如果仍然执行DML操作,将不能把这些操作同步到复制的新表中 。DEFAULT:默认值,根据DDL语句的类型,自动的选择使用INPLACE或者COPY选项,能使用INPLAC百思特网E的不使用COPY 。注意:这个COPY的操作,要求磁盘的空间要充足,因为它会复制出一张和原表一样的表,会再次占用和原表一样的磁盘空间,同时会增加IO的负载 。所以,一般情况下我们都是使用INPLACE作为ALGORITHM参数的值,只有当某些DDL语句,不支持ALGORITHM=INPLACE参数的时候,才选择ALGORITHM=COPY的选项 。
- LOCK参数的取值范围可以有NONE、SHARED、DEFAULT、EXCLUSIVE四种 。NONE:表示不加锁,在DDL语句执行的过程中,表仍然可以进行select和DML的操作,这也正是我们DDL Online的真正所希望实现的效果 。SHARED:可以执行select操作,但是不能执行DML操作 。DEFAULT:根据不同的DDL语句,采用所需要的最小的锁 。EXCLUSIVE:在DDL语句执行的过程中,既不能执行select操作,也不能执行DML操作 。整个表完全不可以读写,被锁住 。
推荐阅读