mysql 5.7 online ddl_MySQL的Online DDL语句

3c6823694309bb4aed29259c7f55a8fa.png

概念

什么是OnlineDDL?在了解OnlineDDL之前,我们先来了解一下什么是DDL。说DDL,就不得不提一下它的另外两个兄弟:DML和DCL。

他们三者的区别如下:

DDL:data definition language,数据定义语言,用来定义数据的语句。例如我们平时的create table,create index,create function等。DML:data manipulation language,数据修改语言,用来操作数据的语句。例如我们平时的select,insert,update,delete语句。DCL:data control language,数据控制语言,用来定义数据访问控制的语句。例如我们平时的grant,revoke等。而OnlineDDL是指在线的数据定义语言,所谓的在线是指:在数据表在不停止服务的情况下来应用我们的DDL语句,即表在应用DDL语句的时候,仍然可以提供读写的服务。

诉求背景

我们平时所说的在线的DDL操作一般情况是指以下操作:

在表中增加字段在表中增加索引在表中修改字段类型删除表中的字段删除表中的索引如果是一张小表,只有几百行或者几千行的数据表,我们要增加字段或增加索引,基本不用考虑什么,一个字:干,就完了。

但如果是一个大表呢?表中几千万,上亿条数据。怎么办?

我们之所以不敢直接干的原因,大概是担心以下问题的发生,这也是我们经常锁的MySQL的online DDL要格外注意的原因。

表被锁上,不能进行正常的读写或者写。不能写还好一下,最怕是连读都不能读。如果有主从复制架构,担心主从同步出现大幅度的延迟。解决方法

原生支持的方式

在5.5之前的版本,这些都是我们比较担心的问题。但是,在MySQL5.6和5.7版本中,默认情况下,MySQL就是支持online的DDL操作的,在online的DDL语句执行的过程中,MySQL会尽量少使用锁的限制,我们不需要特殊的操作来启用它。

MySQL在选择的时候,尽量少使用锁,但是不排除它会选择使用锁。而如果我担心它选择了锁而导致我们的表不能读也不能写,显然这不是我们想要的结果,我们希望:如果选择了锁就不要执行,直接退出执行;如果没有选择锁就执行。想要达到我们希望的这个效果,该怎么做呢?

可以在执行我们的online DDL语句的时候,使用ALGORITHM和LOCK关键字,这两个关键字在我们的DDL语句的最后面,用逗号隔开即可。示例如下:

ALTER TABLE tbl_name ADD COLUMN col_name col_type, ALGORITHM=INPLACE, LOCK=NONE;

其中的ALGORITHM有如下选项INPLACE:替换:直接在原表上面执行DDL的操作。COPY:复制:使用一种临时表的方式,克隆出一个临时表,在临时表上执行DDL,然后再把数据导入到临时表中,在重命名等。这期间需要多出一倍的磁盘空间来支撑这样的 操作。执行期间,表不允许DML的操作。DEFAULT:默认方式,有MySQL自己选择,优先使用INPLACE的方式。其中的LOCK有如下选项SHARE:共享锁,执行DDL的表可以读,但是不可以写。NONE:没有任何限制,执行DDL的表可读可写。EXCLUSIVE:排它锁,执行DDL的表不可以读,也不可以写。DEFAULT:默认值,也就是在DDL语句中不指定LOCK子句的时候使用的默认值。如果指定LOCK的值为DEFAULT,那就

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值