加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

MySQL Online DDL,照旧要审慎

发布时间:2019-08-28 18:55:48 所属栏目:编程 来源:佚名
导读:导读 MySQL的Online DDL恒久饱受诟病,8.0之后有没有好一些呢... 本文重点接头常见的几种Online DDL需求: 增进新列(ADD COLUMN) 修改列界说(MODIFY COLUMN) 增进/删除索引(ADD/DROP INDEX) 其他的DDL操纵相比拟力少,以是本文就不接头了。 另外,本文也不

 MySQL Online DDL,照旧要审慎

导读

MySQL的Online DDL恒久饱受诟病,8.0之后有没有好一些呢...

本文重点接头常见的几种Online DDL需求:

  • 增进新列(ADD COLUMN)
  • 修改列界说(MODIFY COLUMN)
  • 增进/删除索引(ADD/DROP INDEX)

其他的DDL操纵相比拟力少,以是本文就不接头了。

另外,本文也不接头非InnoDB引擎以及非平凡索引(如全文索引、空间索引)的场景。

我们先看下ALTER TABLE时ALGORITHM可以指定的几种方法:

  • COPY ,是指DDL时,会天生(姑且)新表,将原表数据逐行拷贝到新表中,在此时代会阻塞DML
  • INPLACE,无需拷贝全表数据到新表,但也许照旧必要IN-PLACE方法(原地,无需天生新的姑且表)重建整表。这种环境下,在DDL的初始筹备和最后竣事两个阶段时凡是必要加排他MDL锁(metadata lock,元数据锁),除另外,DDL时代不会阻塞DML
  • INSTANT,只需修改数据字典中的元数据,无需拷贝数据也无需重建整表,同样,也无需加排他MDL锁,原表数据也不受影响。整个DDL进程险些是刹时完成的,也不会阻塞DML。这个新特征是8.0.12引入的,再次感激腾讯互娱DBA团队的孝顺

执行DDL操纵时,ALGORITHM选项可以不指定,这时辰MySQL凭证INSTANT、INPLACE、COPY的次序自动选择吻合的模式。也可以指定ALGORITHM=DEFAULT,也是同样的结果。假如指定了ALGORITHM选项,但不支持的话,会直接报错。

当回收COPY模式时,这时内外任何的修改数据操纵,DDL城市被阻塞。COPY模式下会天生姑且新表,操纵完成后原表会被删除,新表被重定名为原表名。当DDL开始后,原表上仅能只读,其他的DML操纵也城市被阻塞。COPY进程中,独一会阻塞只读的机缘是在整理旧表布局和表界说缓存时。

1、以下是支持INPLACE模式的几种环境:

  • 自己是InnoDB表支持的online DDL操纵
  • 表重定名
  • 以下几种只修改表元数据而不修改表数据的操纵
    • 字段范例为CHAR、VARCHAR、TEXT、ENUM
    • 字符集从UTF8MB3酿成UTF8MB4,可能从其他任何字符集改成binary
    • 修改字符集的字段上没有索引
    • 字段重定名
    • 修改字段默认值
    • 索引重定名
    • 新增、删除帮助索引
    • 修改索引的可见性
    • ENUM/SET范例字段追加新值,譬喻('a','b')后头增进'c',酿成('a','b','c')
    • 从8.0.14开始,下面几种只修改字符集的环境
    • 从8.0.14开始,InnoDB表假造列(generated column)上不修改界说范例、表达式、是否应承为NULL束缚,譬喻只修改字段备注内容(特么的这有卵用啊)
    • 修改字段的默认值,且该字段不包括在天生假造列的表达式内,譬喻只修改字段的NULL属性

2、以下是支持INSTANT模式的几种环境:

  • 在表最后新增一个字段
  • 新增或删除假造列
  • 新增或删除字段默认值
  • 修改ENUM/SET字段界说,上面也有提到过
  • 修改索引范例
  • 表重定名

3、几种必要用COPY模式的环境

当执行ALTER TABLE ADD COLUMN、CHANGE COLUMN、MODIFY COLUMN、ADD INDEX、FORCE 等操纵时,会将5.5版本之前的时刻范例相干字段逼迫进级到高版本,这个进级必要重建整个表,只能用COPY方法。这时假如指定 ALGORITHM=INPLACE 就会报错了。

当有连系索引并用于表分区时,假如修改了连系索引列次序的话,也必要用COPY模式。

4、最后用一个表格声名几种常见操纵的模式

最后有两个提示

一样平常DDL操纵最好都回收pt-osc或gh-ost这样的器材来实验,而且实验之前务须要先搜查当前线针表上是否有事宜或大查询未竣事,停止严峻的MDL锁守候

除了8.0以上版本,除了追加式新增列、表更名、新增假造列这三种支持INSTANT的操纵可以直接跑DDL,别的的都完好回收pt-osc/gh-osc器材,相对更不轻易出状

执行ALTER TABLE DDL时,不要画蛇添足指定ALGORITHM=?, LOCK=?选项,由于MySQL会自行判定该回收哪种方法。原来可以INPLACE的,也许不警惕给指定成COPY就悲剧了

【编辑保举】

  1. MySQL数据库目次下面的db.opt是干什么用的?
  2. MySQL导入导出呼吁-mysqldump
  3. 怎样删除MySQL用户帐户
  4. 图解MySQL里的各类 JOIN,看完不懂来找我!
  5. 浅谈MySQL集群高可用架构
【责任编辑:庞桂玉 TEL:(010)68476606】
点赞 0

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读