温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
  • 忘记密码?
登录注册×
获取短信验证码
其他方式登录
点击 登录注册 即表示同意 《亿速云用户服务条款》
  • 服务器
  • 数据库
  • 开发技术
  • 网络安全
  • 互联网科技
登 录 注册有礼
最新更新 网站标签 地图导航
产品
  • 首页 > 
  • 教程 > 
  • 数据库 > 
  • MySQL数据库 > 
  • MySQL & MariaDB Online DDL的详解示例

MySQL & MariaDB Online DDL的详解示例

发布时间:2020-10-29 10:11:38 来源:亿速云 阅读:178 作者:小新 栏目: MySQL数据库

这篇文章主要介绍 MySQL & MariaDB Online DDL的详解示例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

MySQL教程栏目介绍指导MySQL & MariaDB Online DDL。

MySQL & MariaDB Online DDL的详解示例

概述

在早期的 MySQL 版本中,DDL 操作(如创建索引等)通常都需要对数据表加锁,操作过程中 DML 操作都会被阻塞,影响正常业务。MySQL 5.6 和 MariaDB 10.0 开始支持  Online  DDL,可以在执行 DDL 操作的同时,不影响 DML 的正常执行,线上直接执行 DDL 操作对用户基本无感知(部分操作对性能有影响)。

不同版本的数据库对各种 DDL 语句的支持存在一定的差异,本文将会针对 MySQL 和 MariaDB 对 Online DDL 的支持情况做一个汇总,在需要执行 DDL 操作时,可以参考本文的 Online DDL 支持情况 部分。

本文将会持续修正和更新,最新内容请参考我的 GITHUB 上的 程序猿成长计划 项目,欢迎 Star,更多精彩内容请 follow me。

ALTER TABLE 语句中,支持通过 ALGORITHMLOCK 语句来实现 Online  DDL:

  • ALGORITHM -  控制 DDL 操作如何执行,使用哪个算法
  • LOCK - 控制在执行 DDL 时允许对表加锁的级别
ALTER TABLE tab ADD COLUMN c varchar(50), ALGORITHM=INPLACE, LOCK=NONE;复制代码

ALGORITHM 支持的算法

ALGORITHM说明
DEFAULT默认算法,自动使用可用的最高效的算法
COPY最原始的方式,所有的存储引擎都支持,不使用 Online DDL,操作时会创建临时表,执行全表拷贝和重建,过程中会写入 Redo Log 和大量的 Undo Log,需要添加读锁,非常低效
INPLACE尽可能避免表拷贝和重建,更确切的名字应该是 ENGINE 算法,由存储引擎决定如何实现,有些操作是可以立即生效的(比如重命名列,改变列的默认值等),但有些操作依然需要全表或者部分表的拷贝和重建(比如添加删除列、添加主键、改变列为 NULL 等)
NOCOPY该算法是 INPLACE 算法的子集,用于避免聚簇索引(主键索引)的重建造成全表重建,也就说用该算法会禁止任何引起聚簇索引重建的操作
INSTANT用于避免 INPLACE 算法在需要修改数据文件时异常低效的问题,所有涉及到表拷贝和重建的操作都会被禁止

NOCOPY 算法支持:MariaDB 10.3.2+,MySQL 不支持该算法

INSTANT 算法支持:MariaDB 10.3.2+,MySQL 8.0.12+。

算法使用规则:

  • 如果用户指定的算法为 COPY,则 InnoDB 使用 COPY 算法。
  • 如果用户指定的是 COPY 之外的其它算法,则 InnoDB 会按照算法效率,选择最高效的算法,最差的情况下采用用户指定的算法。比如用户指定了 ALOGRITHM = NOCOPY,则 InnoDB 会从 (NOCOPY, INSTANT) 中选择支持的最高效的算法。

MySQL & MariaDB Online DDL的详解示例

MySQL 服务主要为 Server 层存储引擎层 两部分组成,Server 层包含了 MySQL 大部分核心功能,所有的内置函数,跨存储引擎的功能如存储过程、触发器、视图等。存储引擎层负责数据的存储和读取,采用了插件式的架构模式。

COPY 算法 作用在 Server 层,其执行过程都是在 Server 层,因此所有存储引擎都支持使用该算法,执行过程如下图

MySQL & MariaDB Online DDL的详解示例

INPLACE 算法 作用于存储引擎层,是 InnoDB 存储引擎特有的 DDL 算法,执行过程如下图所示

MySQL & MariaDB Online DDL的详解示例

LOCK 策略

默认情况下,MySQL/MariaDB 在执行 DDL 期间会使用尽可能少的锁,如果必要,可以通过 LOCK 子句控制在执行 DDL 时允许对表加锁的级别。如果指定的操作所要求的限制级别不满足(EXCLUSIVE > SHARED > NONE),则语句执行失败并报错。

策略说明
DEFAULT使用当前操作支持的粒度最小的锁策略
NONE不获取任何表锁,允许所有的 DML 操作
SHARED对表添加共享锁(读锁),只允许只读的 DML 操作
EXCLUSIVE对表添加排它锁(写锁),不允许任何 DML 操作

为了避免执行 DDL 时,由于锁表导致生产服务不可用,在执行表结构变更语句时,可以添加 LOCK=NONE 子句,如果语句需要获取共享锁或者排它锁,则会直接报错,这样就可以避免意外锁表,造成线上服务不可用了。

Online DDL 执行过程

Online  DDL 操作主要分为三个阶段:

MySQL & MariaDB Online DDL的详解示例

  • 阶段 1:初始化

    在初始化阶段, 服务器会根据存储引擎的能力,操作的语句和用户指定的 ALGORITHMLOCK 选项来决定允许多大程度的并发。在这个阶段会创建一个 可升级的元数据共享锁(SU)来保护表定义。

  • 阶段 2:执行

    这个阶段会 准备执行 DDL 语句,根据 阶段 1 评估的结果来决定是否将元数据锁升级为 排它锁 (X),如果需要升级为排它锁,则只在 DDL 的 准备阶段 短暂的添加排它锁。

  • 阶段 3:提交表定义

    在表定义的提交阶段,元数据锁会升级为排它锁来更新表的定义。独占排它锁的持续时间非常短。

元数据锁(MDL,Metadata Lock)主要用于 DDL 和 DML 操作之间的并发访问控制,保护表结构(表定义)的一致,保证读写的正确性。MDL 不需要显式的使用,在访问表时会自动加上。

MySQL & MariaDB Online DDL的详解示例

由于上面三个阶段中对元数据锁的独占,  Online  DDL 过程必须等待已经持有元数据锁的并发事务提交或者回滚才能继续执行。

注意:当  Online  DDL 操作正在等待元数据锁时,该元数据锁会处于挂起状态,后续的所有事务都会被阻塞。在 MariaDB 10.3 之后,可以通过添加 NO WAIT 或者 WAIT n 来控制等待所得超时时间,超时立即失败。

ALTER TABLE tbl_name [WAIT n|NOWAIT] ...CREATE ... INDEX ON tbl_name (index_col_name, ...) [WAIT n|NOWAIT] ...DROP INDEX ... [WAIT n|NOWAIT]DROP TABLE tbl_name [WAIT n|NOWAIT] ...LOCK TABLE ... [WAIT n|NOWAIT]OPTIMIZE TABLE tbl_name [WAIT n|NOWAIT]RENAME TABLE tbl_name [WAIT n|NOWAIT] ...SELECT ... FOR UPDATE [WAIT n|NOWAIT]SELECT ... LOCK IN SHARE MODE [WAIT n|NOWAIT]TRUNCATE TABLE tbl_name [WAIT n|NOWAIT]复制代码

评估 Online DDL 操作的性能

Online DDL 操作的性能取决于是否发生了表的重建。在对大表执行 DDL 操作之前,为了避免影响正常业务操作,最好是先评估一下 DDL 语句的性能再选择如何操作。

  1. 复制表结构,创建一个新的表
  2. 在新创建的表中插入少量数据
  3. 在新表上面执行 DDL 操作
  4. 检查执行操作后返回的 rows affected 是否是 0。如果该值非 0,则意味着需要拷贝表数据,此时对 DDL 的上线需要慎重考虑,周密计划

比如

  • 修改某一列的默认值(快速,不会影响到表数据)

    Query OK, 0 rows affected (0.07 sec)复制代码
  • 添加索引(需要花费一些时间,但是 0 rows affected 说明没有发生表拷贝)

    Query OK, 0 rows affected (21.42 sec)复制代码
  • 修改列的数据类型(需要花费很长时间,并且重建表)

    Query OK, 1671168 rows affected (1 min 35.54 sec)复制代码

由于在执行  Online  DDL 过程中需要记录并发执行的 DML 操作发生的变更,然后在执行完 DDL 操作之后再应用这些变更,因此使用  Online  DDL 操作花费的时间比不使用 Online 模式执行要更长一些。

Online  DDL 支持情况

INSTANT 算法支持:MariaDB 10.3.2+,MySQL 8.0.12+。NOCOPY 只支持 MariaDB 10.3.2 以上版本,不支持 MySQL,这里就暂且忽略了。

重点关注是否 重建表支持并发 DML:不需要重建表,支持并发 DML 最佳。

MySQL & MariaDB Online DDL的详解示例

二级索引

操作INSTANTINPLACE重建表并发 DML只修改元数据
创建或者添加二级索引
删除索引
重命名索引 (⚠️MySQL 5.7+,MariaDB 10.5.2+)
添加 FULLTEXT 索引✅ ①❌ ①
添加 SPATIAL 索引(⚠️MySQL 5.7+,MariaDB 10.2.2+)
修改索引类型

说明:

  • ① 第一次添加全文索引字段时需要重建表,之后就不需要了

主键

操作INSTANTINPLACE重建表并发 DML只修改元数据
添加主键✅ ②✅ ②
删除主键
删除一个主键同时添加一个新的

说明:

  • 重建聚簇索引总是需要拷贝表数据(InnoDB 是“索引组织表”),所以最好是在创建表的时候就定义好主键
  • 如果创建表是没有指定主键,InnoDB 会选择第一个 NOT NULLUNIQUE 索引作为主键,或者使用系统生成的 KEY
  • ② 对聚簇索引来说,使用 INPLACE 模式比 COPY 模式要高效一些:不会产生 undo logredo log,二级索引是有序的,所以可以按顺序加载,不需要使用变更缓冲区

普通列

操作INSTANTINPLACE重建表并发 DML只修改元数据
列添加✅ ③❌ ③✅ ③
列删除❌ ④
列重命名✅ ⑤
改变列的顺序❌ ⑫
设置默认值
修改数据类型
扩展 VARCHAR 长度(⚠️MySQL 5.7+, MariaDB 10.2.2+)❌ ⑬❌ ⑥
删除列的默认值
改变自增值❌ ⑦
设置列为 NULL✅ ⑧
设置列为 NOT NULL✅ ⑨✅ ⑨
修改 ENUMSET 列的定义❌ ⑩

说明:

  • ③ 并发 DML:当插入一个自增列时,不支持并发的 DML 操作,添加自增列时,大量的数据会被重新组织,代价高昂

  • ③ 重建表:添加列时,MySQL 5.7及之前版本需要重建表,MySQL 8.0 当 ALGORITHM=INPLACE 时,需要重建表,ALGORITHM=INSTANT 时不需要重建

  • ③ INSTANT算法:添加列时,使用 INSTANT 算法有下面这些限制

    • 添加列操作不能和其它不支持 INSTANT 算法的操作合并为一条 ALTER TABLE 语句
    • 新增的列只能添加到表的最后,不能放到其它列的前面,在 MariaDB 10.4 之后,支持在任意位置添加
    • 不能将列添加到 ROW_FORMAT=COMPRESSED 的表中
    • 不能将列添加到包含 FULLTEXT 的表中
    • 不能将列添加到临时表中,临时表只支持 ALGORITHM=COPY
    • 不能将列添加到驻留在数据字典表空间中的表中
    • 在添加列的时候不会计算行的大小限制,该限制在执行 DML 操作插入或者更新表时才会被检查
  • ④ 删除列时,大量的数据需要被重新组织,代价高昂,在 MariaDB 10.4 之后,删除列支持 INSTANT 算法

  • ⑤ 重命名列时,确保只改变列名,不改变数据类型,这样才能支持并发的 DML 操作

  • ⑥ 扩展 VARCHAR 长度时,INPLACE 是有条件的,必须保证用于标识字符串长度的长度字节不变(这里说的都是字节,不是 VARCHAR 的字符长度,字节占用与采用的字符集有关,utf8 字符集下,一个字符占 3 个字节, utf8mb4 则 4 个字节)

    • 当 VARCHAR 列长度在 0-255 个字节时,长度标识占用一个字节
    • 当 VARCHAR 列长度大于 255 个字节时,长度标识占用两个字节

    因此,INPLACE 只支持 0-255 个字节之间或者 256 个字节到更大的长度之间的变更。VARCHAR 列长度减小是不支持 INPLACE 的。

  • ⑦ 自增列值变更是修改的内存中的值,不是数据文件

  • ⑧ ⑨ 设置列为 [NOT] NULL 时,大量的数据被重新组织,代价高昂

  • ⑩ 修改 ENUMSET 类型的列定义时,是否需要表拷贝取决于已有元素的个数和插入成员的位置

  • ⑫ 在 MariaDB 10.4 之后,列排序支持 INSTANT 算法

  • ⑬ 在 MariaDB 10.4.3  之后,InnoDB 支持使用 INSTANT 算法增加列的长度,但是也有一些限制,具体参考 Changing the Data Type of a Column

生成列

操作INSTANTINPLACE重建表并发 DML只修改元数据
添加 STORED
修改 STORED 列的排序
删除 STORED
添加 VIRTUAL
修改 VIRTUAL 列的排序
删除 VIRTUAL

外键

操作INSTANTINPLACE重建表并发 DML只修改元数据
添加外键约束✅ ⑭
删除外键约束

说明:

  • ⑭ 添加外键时,只有当 foreign_key_checks 选项被禁用的时候才支持 INPLACE 算法

操作INSTANTINPLACE重建表并发 DML只修改元数据
修改 ROW_FORMAT
修改 KEY_BLOCK_SIZE
设置持久表统计信息
指定字符集✅ ⑮
转换字符集✅ ⑯
优化表✅ ⑰
使用 FORCE 选项重建表✅ ⑱
执行空的重建✅ ⑲
重命名表

说明:

  • ⑮⑯ 当字符集不同时,需要重建表
  • ⑰⑱⑲ 如果表中包含 FULLTEXT 的字段,则不支持 INPLACE

表空间

操作INSTANTINPLACE重建表并发 DML只修改元数据
重命名常规表空间
启用或者禁用常规表空间加密
启用或者禁用 file-per-table 表空间加密

限制

  • 在临时表 TEMPORARY TABLE 上创建索引时会发生表拷贝
  • 如果表上有 ON...CASCADE 或者 ON...SET NULL 约束,则 ALERT TABLE 不支持字句 LOCK=NONE
  • 在 Onlne DDL 操作完成之前,它必须等待相关表已经持有元数据锁的事务提交或者回滚,在这个过程中,相关表的新事务会被阻塞,无法执行
  • 当在大表上执行涉及到表重建的 DDL 时,会存在以下限制
    • 没有任何机制可以暂停 Online DDL操作或限制 Online DDL 操作的 I/O 或CPU使用率
    • 如果操作失败,则回滚 Online DDL操作的代价非常高昂
    • 长时间运行的 Online  DDL 可能会导致复制延迟。 Online  DDL 操作必须在 Master 上执行完成后才能在 Slave 上执行,在这个过程中, 并发处理的 DML 在 Slave 上面必须等待 DDL 操作完成后才会执行。

以上是MySQL & MariaDB Online DDL的详解示例的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节
推荐阅读:
  1. MySQL高可用MMM架构的搭建
  2. MySQL DDL锁表情况分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mysql mariadb online ddl ne
  • 上一篇新闻:
    Redis分片是什么
  • 下一篇新闻:
    php基本算法有哪些

猜你喜欢

  • Bokeh怎么定制化图表和报告
  • Bokeh怎么构建一个实时监控系统
  • Bokeh怎么监控和分析数据
  • Bokeh怎么创建一个追踪仪表板
  • Bokeh怎么实现语言或文本数据的情感分析可视化
  • Bokeh怎么可视化复杂的网络安全威胁数据和攻击模式
  • Bokeh怎么实现时间序列分析的比较视图
  • Bokeh怎么确保敏感数据的可视化不会泄露
  • Bokeh怎么根据用户角色或权限显示不同级别的数据
  • Bokeh怎么构建一个动态的业务指标仪表盘
最新资讯
  • 如何在Haskell中进行分布式编程和计算
  • Haskell中的静态类型检查有哪些好处和潜在的缺点
  • Haskell编程中如何处理和优化大型文集的处理
  • 在Haskell中如何使用正则表达式进行模式匹配和数据提取
  • Haskell中的元编程有哪些方式和应用
  • 在Haskell中如何实现和使用软件事务内存来处理并发问题
  • 如何在Haskell中使用模块和命名空间进行代码组织
  • Haskell中的包依赖管理和解决方案是什么
  • 在Haskell中如何进行科学计算和数值分析
  • Haskell中支持哪些类型的数据库接口和ORM技术
相关推荐
  • 有关MySQL-MMM高可用群集部署详解
  • mysql 5.6 在线DDL
  • MySQL5.7在线DDL相关知识简单介绍
  • MySQL DDL详情揭露
  • MySQL5.7 Online DDL
  • 怎么解决MySQL中的ERROR 1799报错问题
  • Limitations of Online DDL for MySQL
  • Delete mysql表数据后磁盘空间却还是被占用的原因
  • MySQL删除表数据但磁盘空间还一直被占用怎么办
  • MySQL DDL执行方式Online DDL实例分析

相关标签

mysqldump mysql8.0.20 mysql workbench mysql会话临时表空间 mysql备份恢复 mysql 5.7 mysql数据库教程 navicat for mysql 监控mysql mysql 数据库 mysqladmin mysql参数 mysql root密码 重置mysql mysql 8.0.17 mysql5.7.23 mysql multi mysql8.0.12 mysql5.7.25 查询mysql
AI

深圳SEO优化公司光明网站制作广州百搜标王石岩网站推广系统龙岗网站改版宝安企业网站设计南澳网站优化排名福永网站搜索优化坪地网站优化软件丹竹头网站设计西乡seo排名罗湖外贸网站设计松岗网站推广大运设计公司网站龙华网站定制观澜SEO按天扣费塘坑网站推广系统布吉模板制作龙华企业网站制作平湖SEO按天计费荷坳网站设计模板平湖网页制作宝安网站改版布吉网站优化按天收费大芬企业网站改版大鹏网站seo优化木棉湾网站排名优化丹竹头seo优化深圳企业网站设计光明建网站坂田百度网站优化歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化