作者:杨奇龙 网名“北在南方”,8 年 DBA 老兵,目前任职于杭州有赞科技 DBA,主要负责数据库架构设计和运维平台开发工作,擅长数据库性能调优、故障诊断。 本文来源:转载自公众号-yangyidba *爱可生开源社区出品,原创内容未经
作者:杨奇龙 网名“北在南方”,8 年 DBA 老兵,目前任职于杭州有赞科技 DBA,主要负责数据库架构设计和运维平台开发工作,擅长数据库性能调优、故障诊断。 本文来源:转载自公众号-yangyidba *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
本文关键字:原子 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。
从图中我们可以看出,元数据信息在存储于 .FRM
.TRG
.OPT
文件系统,MyISAM 引擎的系统表里,以及 Innodb 存储引擎的系统表。分裂成多处这样的架构导致在系统异常的情况下很容易造成数据的不一致。
从图中我们明显可以看出 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 就被删除了。
InnoDB 存储引擎执行 DDL 时是分阶段进行的。比如 ALTER TABLE,可能会在执行提交阶段之前多次执行准备阶段和执行阶段的操作。
无论事务被提交还是回滚,在 Post-DDL 阶段都会重放并删除 mysql.innodb_ddl_log
表中的 DDL 日志。只有当服务器在执行 DDL 操作的过程中出现故障时,才会在 mysql.innodb_ddl_log
表中保留 DDL 日志。这种情况下,在服务器恢复之后执行 DDL 日志的重放和删除。
对于需要进行恢复的情况,服务器重启之后,可能执行 DDL 事务的提交,也可能执行事务的回滚。如果在提交阶段执行的数据字典事务已经记录在重做日志和二进制日志中,就会认为 DDL 操作已经成功,并且执行前滚操作。否则,当 InnoDB 重放数据字典重做日志的时候,将会回滚不完整的数据字典事务,并且回滚 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 日志过程。
数据库、表空间、表、索引的 CREATE、ALTER 以及 DROP 语句,以及 TRUNCATE TABLE 语句。
存储过程、触发器、视图以及用户定义函数 UDF 的 CREATE 和 DROP 语句,以及适用的 ALTER 语句。
帐户管理语句:用户和角色的 CREATE、ALTER、DROP 语句,以及适用的 RENAME 语句,以及 GRANT 和 REVOKE 语句。
本文基本就是官方文档加上系统开发团队 blog 内容的二道贩子,理解不正确的,大家可以积极指正。其他的还是推荐看看官方文档。
--结束END--
本文标题: 新特性解读 | MySQL 8.0 之原子 DDL
本文链接: https://www.lsjlt.com/news/7075.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-05-09
2024-05-09
2024-05-09
2024-05-09
2024-05-08
2024-05-08
2024-05-08
2024-05-08
2024-05-08
2024-05-08
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0