我的编程空间,编程开发者的网络收藏夹
学习永远不晚

新特性解读 | MySQL 8.0 之原子 DDL

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

新特性解读 | MySQL 8.0 之原子 DDL

新特性解读 | MySQL 8.0 之原子 DDL

作者:杨奇龙 网名“北在南方”,8 年 DBA 老兵,目前任职于杭州有赞科技 DBA,主要负责数据库架构设计和运维平台开发工作,擅长数据库性能调优、故障诊断。 本文来源:转载自公众号-yangyidba *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


本文关键字:原子 DDL 、数据字典

原子 DDL

听到原子这个关键字大家是不是联想到事务的 ACID 的原子性?两者相似,事务/语句执行要么全部成功,要么全部失败。MySQL 8.0 之前的版本 DDL 是非原子性的,对于多条 sql 构成的ddl语句比如 rename table t1 to t1_bak,t2 to t2_bak;  执行过程中如果遇到系统异常 crash,有可能出现表 t1 被 rename,但是 t2 没有被 rename 的情况。出现该情况的原因就是 MySQL 不支持原子的 DDL。

MySQL 8.0 之前的数据字典结构图:

从图中我们可以看出,元数据信息在存储于 .FRM .TRG .OPT文件系统,MyISAM 引擎的系统表里,以及 Innodb 存储引擎的系统表。分裂成多处这样的架构导致在系统异常的情况下很容易造成数据的不一致。

MySQL 8.0 的数据字典结构图:

从图中我们明显可以看出 Data Dictionary 全部存在于由 InnoDB 表构成的系统表中 Data Dictionary Table。当遇到 crash recovery 的时候,系统可以安全的进行事务回滚,保障 DDL 语句的原子性。说了这么多,我们动手实践一下 。

案例实践

对比 5.7 vs 8.0 的测试图,MySQL 5.7.22  DDL 操作删除两个表,其中一个 t2 不存在。

MySQL 8.0.20 的原子性操作,

MySQL 8.0 支持原子性,DDL 失败之后 t1 还在,但是5.7 版本中 t1 就被删除了。

原子 DDL 操作步骤

InnoDB 存储引擎执行 DDL 时是分阶段进行的。比如 ALTER TABLE,可能会在执行提交阶段之前多次执行准备阶段和执行阶段的操作。

  • 准备:创建所需的对象,并且将 DDL 日志写入 mysql.innodb_ddl_log 表中。DDL 日志定义了如何前滚和回滚相应的 DDL 操作。
  • 执行:执行 DDL 操作。例如,为 CREATE TABLE 执行创建操作。
  • 提交:更数据字典并提交数据字典事务。
  • Post-DDL:重放并删除 mysql.innodb_ddl_log 表中的 DDL 日志。为了能够安全地执行回滚操作而不会导致不一致性,对于文件的操作,例如重命名数据文件或移动数据文件,放在这个最后的阶段执行。这个阶段还会为 DROP TABLE、TRUNCATE TABLE 以及其他重建表的 DDL 操作删除数据字典表 mysql.innodb_dynamic_metadata 中的动态元数据。

无论事务被提交还是回滚,在 Post-DDL 阶段都会重放并删除 mysql.innodb_ddl_log 表中的 DDL 日志。只有当服务器在执行 DDL 操作的过程中出现故障时,才会在 mysql.innodb_ddl_log 表中保留 DDL 日志。这种情况下,在服务器恢复之后执行 DDL 日志的重放和删除。

对于需要进行恢复的情况,服务器重启之后,可能执行 DDL 事务的提交,也可能执行事务的回滚。如果在提交阶段执行的数据字典事务已经记录在重做日志和二进制日志中,就会认为 DDL 操作已经成功,并且执行前滚操作。否则,当 InnoDB 重放数据字典重做日志的时候,将会回滚不完整的数据字典事务,并且回滚 DDL 事务。

查看 DDL 日志

为了支持 原子 DDL,InnoDB 在执行 DDL 语句时将日志写入隐藏的数据字典表mysql.innodb_ddl_log中,该表存储在 mysql.ibd 数据字典表空间。所谓隐藏数据字典表,就是在不能以正常的方式直接访问,得在调试 debug 模式下访问隐藏表。

CREATE TABLE mysql.innodb_ddl_log (

各个字段的注释,

id:每条 DDL 日志记录的唯一标识符。

另外就是我们可以通过设置 innodb_print_ddl_logs=1 和 log_error_verbosity=3 在 MySQL 的 系统日志里面查看 DDL log,比如我运行的 MySQL 8.0 是在 docker 中 ,使用 docker logs mysql8.0 。

日志表示执行 create table t2 的 ddl 日志过程。

MySQL 8.0 原子 DDL 使用范围

支持的 ddl 范围

  • 与表相关的原子 DDL 包括:

数据库、表空间、表、索引的 CREATE、ALTER 以及 DROP 语句,以及 TRUNCATE TABLE 语句。

  • 与表无关的原子 DDL 包括:

存储过程、触发器、视图以及用户定义函数 UDF 的 CREATE 和 DROP 语句,以及适用的 ALTER 语句。  

帐户管理语句:用户和角色的 CREATE、ALTER、DROP 语句,以及适用的 RENAME 语句,以及 GRANT 和 REVOKE 语句。

不支持的 ddl 范围

  • 非 InnoDB 存储引擎上的表相关 DDL 语句。
  • INSTALL PLUGIN 和 UNINSTALL PLUGIN 语句。
  • INSTALL COMPONENT 和 UNINSTALL COMPONENT 语句。
  • CREATE SERVER、ALTER SERVER 以及 DROP SERVER 语句。

小结

本文基本就是官方文档加上系统开发团队 blog 内容的二道贩子,理解不正确的,大家可以积极指正。其他的还是推荐看看官方文档。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

新特性解读 | MySQL 8.0 之原子 DDL

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

新特性解读 | MySQL 8.0 之原子 DDL

作者:杨奇龙网名“北在南方”,8 年 DBA 老兵,目前任职于杭州有赞科技 DBA,主要负责数据库架构设计和运维平台开发工作,擅长数据库性能调优、故障诊断。本文来源:转载自公众号-yangyidba*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系
新特性解读 | MySQL 8.0 之原子 DDL
2014-05-18

新特性解读 | mysql 8.0 memcached api 新特性

作者:杨涛涛资深数据库专家,专研 MySQL 十余年。擅长 MySQL、PostgreSQL、MongoDB 等开源数据库相关的备份恢复、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相关技术支持、My
新特性解读 | mysql 8.0 memcached api 新特性
2017-07-06

新特性解读 | MySQL 8.0 新特性-副本集(replicaset)

引言之前,我介绍过一篇《MySQL Innodb Cluster 扫盲篇》。MySQL Innodb Cluster = MySQL Shell + MySQL Router + MySQL Group Replication(MGR)全程由 MySQL Sh
新特性解读 | MySQL 8.0 新特性-副本集(replicaset)
2021-10-20

MySQL 8.0的原子DDL非事务性DDL,绝大多数情况下,原子DDL仍旧是一个然并卵的特性

首先声明一下:MySQL 8.0之后,依旧不支持DDL事务。原子性DDL与其说是一个MySQL8.0下的新特性,倒是不如说是修复了MySQL5.7 DDL 执行失败造成的bug。MySQL 8.0 前后表的物理文件差异在mysql中,对于表的数据文件,在mys
MySQL 8.0的原子DDL非事务性DDL,绝大多数情况下,原子DDL仍旧是一个然并卵的特性
2018-02-20

解析MySQL8.0新特性——事务性数据字典与原子DDL

前言 事务性数据字典与原子DDL,是MySQL 8.0推出的两个非常重要的新特性,之所以将这两个新特性放在一起,是因为两者密切相关,事务性数据字典是前提,原子DDL是一个重要应用场景。 MySQL 8.0之前的数据字典MySQL 8.0之前
2022-05-27

新特性解读 | 从 wireshark 看 MySQL 8.0 加密连接

作者:秦福朗爱可生 DBA 团队成员,负责项目日常问题处理及公司平台问题排查。热爱 IT,喜欢在互联网里畅游,擅长摄影、厨艺,不会厨艺的 DBA 不是好司机,didi~本文来源:原创投稿*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来
新特性解读 | 从 wireshark 看 MySQL 8.0 加密连接
2019-10-02

新特性解读 | 8.0 新增 DML 语句(TABLE & VALUES)

作者:杨涛涛资深数据库专家,专研 MySQL 十余年。擅长 MySQL、PostgreSQL、MongoDB 等开源数据库相关的备份恢复、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相关技术支持、My
新特性解读 | 8.0 新增 DML 语句(TABLE & VALUES)
2015-03-09

MySQL 8.0新特性之集合操作符INTERSECT和EXCEPT

MySQL8.0.31版本开始支持了INTERSECT(交集)和EXCEPT(差集)运算,INTERSECT返回两个结果集中都包含的行,EXCEPT返回左侧结果集存在,右侧不存在的行,这篇文章主要给大家介绍了关于MySQL 8.0新特性之集合操作符INTERSECT和EXCEPT的相关资料,需要的朋友可以参考下
2022-11-13

新特性解读 | MySQL 8.0.19 支持 DNS SRV

MySQL Router 是 InnoDB Cluster 架构的访问入口,在架构部署上,官方给出的建议是 router 与应用端绑定部署,避免 router 单点问题。之前还有客户咨询,能否 router 不与应用端绑定部署,不便于部署,在此之前都需要在 r
新特性解读 | MySQL 8.0.19 支持 DNS SRV
2019-02-10

新特性解读 | MySQL 8 的备份工具该如何选择?

数据备份是数据容灾的最后一道防线,即便有着两地三中心的架构,备份也依然重要。如果备份出问题,备份时影响了交易业务,备份数据无法恢复,这些也是企业难以承受的。所以选择合适的备份工具尤为重要。每个企业级数据库都会有配套的备份工具,MEB(MySQL Enterpr
新特性解读 | MySQL 8 的备份工具该如何选择?
2018-05-04

新特性解读 | MySQL 8 复制延迟观测新方式,更全面更精准

一直以来 MySQL 复制延迟观测是不完善的,既无法观测到真实的主从延迟,也无法支持复杂的复制拓扑环境,常用的 second_behind_master 指标更多是判断是否存在回放延迟,以及趋势变化。你无法直观的观测到事务精确的延迟情况,因为 slave 无法
新特性解读 | MySQL 8 复制延迟观测新方式,更全面更精准
2020-02-25

新特性解读 | 说说 MySQL 8 对于持久化变量的一些修改

作者:姚嵩爱可生南区交付服务部经理,爱好音乐,动漫,电影,游戏,人文,美食,旅游,还有其他。虽然都很菜,但毕竟是爱好。本文来源:原创投稿*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。MySQL 变量存在的介质及意义:MySQL
新特性解读 | 说说 MySQL 8 对于持久化变量的一些修改
2021-07-17

编程热搜

目录