MySQL 8.0开始支持原子数据定义语言(DDL)语句。此功能称为原子DDL。原子DDL语句将与DDL操作关联的数据字典更新,存储引擎操作和二进制日志写入组合到单个原子事务中。即使服务器在操作期间暂停,也会提交事务,并将适用的更改保留到数据字典,存储引擎和二进制日志,或者回滚事务。

通过在MySQL 8.0中引入MySQL数据字典,可以实现Atomic DDL。在早期的MySQL版本中,元数据存储在元数据文件,非事务性表和存储引擎特定的字典中,这需要中间提交。MySQL数据字典提供的集中式事务元数据存储消除了这一障碍,使得将DDL语句操作重组为原子事务成为可能。

官方文档:

https://dev.mysql.com/doc/refman/8.0/en/atomic-ddl.html

1、支持的DDL语句

原子DDL功能支持表和非表DDL语句。与表相关的DDL操作需要存储引擎支持,而非表DDL操作则不需要。目前,只有InnoDB存储引擎支持原子DDL。

①:受支持的表DDL语句包括 CREATE,ALTER和 DROP对数据库,表,表和索引,以及语句 TRUNCATE TABLE声明。

②:支持的非表DDL语句包括:

CREATE和DROP 语句,以及(如果适用)ALTER 存储程序,触发器,视图和用户定义函数(UDF)的语句。

账户管理语句: CREATE,ALTER, DROP,,如果适用, RENAME报表用户和角色,以及GRANT 和REVOKE报表。

1.1、原子DDL功能不支持以下语句:

①:涉及除存储引擎之外的存储引擎的与表相关的DDL语句InnoDB。

②:INSTALL PLUGIN和 UNINSTALL PLUGIN 陈述。

③:INSTALL COMPONENT和 UNINSTALL COMPONENT 陈述。

④:CREATE SERVER, ALTER SERVER和 DROP SERVER语句。

2、原子DDL特性:

①:元数据更新,二进制日志写入和存储引擎操作(如果适用)将合并为单个事务。

②:在DDL操作期间,SQL层没有中间提交。

③:在适用的情况下:

数据字典,程序,事件和UDF高速缓存的状态与DDL操作的状态一致,这意味着更新高速缓存以反映DDL操作是成功完成还是回滚。

DDL操作中涉及的存储引擎方法不执行中间提交,并且存储引擎将自身注册为DDL事务的一部分。

存储引擎支持DDL操作的重做和回滚,这在DDL操作的 Post-DDL阶段执行。

④:DDL操作的可见行为是原子的,这会更改某些DDL语句的行为

注意:

原子或其他DDL语句隐式结束当前会话中处于活动状态的任何事务,就好像您COMMIT在执行语句之前完成了一样。这意味着DDL语句不能在另一个事务中,在事务控制语句中执行 START TRANSACTION ... COMMIT,或者与同一事务中的其他语句结合使用。

3、DDL语句行为的变化

3.1、DROP TABLE:

如果所有命名表都使用原子DDL支持的存储引擎,则操作是完全原子的。该语句要么成功删除所有表,要么回滚。

DROP TABLE如果命名表不存在,并且未进行任何更改(无论存储引擎如何),则会失败并显示错误。如下所示:

mysql> CREATE TABLE t1 (c1 INT);

mysql> DROP TABLE t1, t2;

ERROR 1051 (42S02): Unknown table 'test.t2'

mysql> SHOW TABLES;

+----------------+

| Tables_in_test |

+----------------+

| t1             |

+----------------+

在引入原子DDL之前, DROP TABLE虽然会报错误表不存在,但是存在的表会被执行成功,如下:

mysql> CREATE TABLE t1 (c1 INT);

mysql> DROP TABLE t1, t2;

ERROR 1051 (42S02): Unknown table 'test.t2'

mysql> SHOW TABLES;

Empty set (0.00 sec)

注意:

由于行为的这种变化,DROP TABLE会在 MySQL 5.7主服务器上的部分完成 语句在MySQL 8.0从服务器上复制时失败。要避免此故障情形,请在DROP TABLE语句中使用IF EXISTS语法以防止对不存在的表发生错误

3.2、DROP DATABASE:

如果所有表都使用原子DDL支持的存储引擎,则为atomic。该语句要么成功删除所有对象,要么回滚。但是,从文件系统中删除数据库目录是最后一次,并且不是原子事务的一部分。如果由于文件系统错误或服务器暂停而导致数据库目录的删除失败, DROP DATABASE则不会回滚事务。

3.3、对于不使用原子DDL支持的存储引擎的表,表删除发生在原子 DROP TABLE或 DROP DATABASE事务之外。这样的表删除被单独写入二进制日志,这在中断DROP TABLE或 DROP DATABASE操作的情况下将存储引擎,数据字典和二进制日志之间的差异限制为最多一个表 。对于删除多个表的操作,不使用原子DDL支持的存储引擎的表将在执行之前删除。

3.4、CREATE TABLE, ALTER TABLE, RENAME TABLE, TRUNCATE TABLE, CREATE TABLESPACE,和 DROP TABLESPACE对使用原子DDL支持的存储引擎表执行的操作要么完全提交或如果服务器的操作时停止回滚。在早期的MySQL版本中,这些操作的中断可能会导致存储引擎,数据字典和二进制日志之间的差异,或留下孤立文件。RENAME TABLE如果所有命名表都使用原子DDL支持的存储引擎,则操作只是原子操作。

3.5、DROP VIEW:

如果命名视图不存在且未进行任何更改,则会失败。在此示例中演示了行为更改,其中 DROP VIEW语句失败,因为命名视图不存在,如下:

mysql> CREATE VIEW test.viewA AS SELECT * FROM t;

mysql> DROP VIEW test.viewA, test.viewB;

ERROR 1051 (42S02): Unknown table 'test.viewB'

mysql> SHOW FULL TABLES IN test WHERE TABLE_TYPE LIKE 'VIEW';

+----------------+------------+

| Tables_in_test | Table_type |

+----------------+------------+

| viewA          | VIEW       |

+----------------+------------+

在引入原子DDL之前, 使用DROP VIEW删除视图会报错,但是存在的视图会被成功删除:

mysql> CREATE VIEW test.viewA AS SELECT * FROM t;

mysql> DROP VIEW test.viewA, test.viewB;

ERROR 1051 (42S02): Unknown table 'test.viewB'

mysql> SHOW FULL TABLES IN test WHERE TABLE_TYPE LIKE 'VIEW';

Empty set (0.00 sec)

注意:

由于行为的这种变化,DROP VIEW在MySQL 5.7主服务器上的部分完成 操作在MySQL 8.0从服务器上复制时会失败。要避免此故障情形,请在DROP VIEW语句中使用IF EXISTS语法以防止对不存在的视图发生错误。

3.6、不再允许部分执行帐户管理声明。帐户管理语句对所有命名用户成功或回滚,如果发生错误则无效。在早期的MySQL版本中,为多个用户命名的帐户管理语句可能对某些用户成功,而对其他用户则失败。

如下:其中第二个CREATE USER 语句返回错误但失败,因为它无法对所有命名用户成功。

mysql> CREATE USER userA;

mysql> CREATE USER userA, userB;

ERROR 1396 (HY000): Operation CREATE USER failed for 'userA'@'%'

mysql> SELECT User FROM mysql.user WHERE User LIKE 'user%';

+-------+

| User  |

+-------+

| userA |

+-------+

在引入原子DDL之前,第二个 使用CREATE USER语句创建用户会返回一个错误,但是不存在的用户会成功创建,:

mysql> CREATE USER userA;

mysql> CREATE USER userA, userB;

ERROR 1396 (HY000): Operation CREATE USER failed for 'userA'@'%'

mysql> SELECT User FROM mysql.user WHERE User LIKE 'user%';

+-------+

| User  |

+-------+

| userA |

| userB |

+-------+

注意:

由于行为的这种变化,MySQL 5.7主服务器上部分会成功执行,会在MySQL 8.0从服务器上复制时失败。要避免此故障情形,请在创建用户的命令中使用IF EXISTS或 IF NOT EXISTS语法,以防止与命名用户相关的错误。

4、存储引擎支持:目前只有innodb存储引擎支持原子DDL

目前,只有InnoDB存储引擎支持原子DDL。不支持原子DDL的存储引擎免于DDL原子性。涉及豁免存储引擎的DDL操作仍然能够引入操作中断或仅部分完成时可能发生的不一致。

要支持重做和回滚DDL操作, InnoDB请将DDL日志写入 mysql.innodb_ddl_log表,该表是驻留在mysql.ibd数据字典表空间中的隐藏数据字典表 。

要mysql.innodb_ddl_log在DDL操作期间查看写入表的DDL日志 ,请启用 innodb_print_ddl_logs 配置选项。

注意:

mysql.innodb_ddl_log无论innodb_flush_log_at_trx_commit 设置多少,对表的 更改的重做日志 都会立即刷新到磁盘 。立即刷新重做日志可以避免DDL操作修改数据文件的情况,但是mysql.innodb_ddl_log由这些操作产生的对表的更改的重做日志 不会持久保存到磁盘。这种情况可能会在回滚或恢复期间导致错误。

InnoDB存储引擎分阶段执行DDL操作。DDL操作 ALTER TABLE可以在Commit阶段之前多次执行 Prepare和Perform阶段:

准备:创建所需对象并将DDL日志写入 mysql.innodb_ddl_log表中。DDL日志定义了如何前滚和回滚DDL操作。

执行:执行DDL操作。例如,为CREATE TABLE操作执行创建例程。

提交:更新数据字典并提交数据字典事务。

Post-DDL:重播并从mysql.innodb_ddl_log表中删除DDL日志。为了确保可以安全地执行回滚而不引入不一致性,在最后阶段执行文件操作,例如重命名或删除数据文件。这一阶段还从删除的动态元数据 mysql.innodb_dynamic_metadata的数据字典表DROP TABLE,TRUNCATE TABLE和该重建表其他DDL操作。

注意:

无论事务是提交还是回滚, DDL日志都会在Post-DDL阶段重播并从表中删除 。mysql.innodb_ddl_log如果服务器在DDL操作期间暂停,则DDL日志应仅保留在表中。在这种情况下,DDL日志将在恢复后重播并删除。

在恢复情况下,可以在重新启动服务器时提交或回滚DDL事务。如果在重做日志和二进制日志中存在在DDL操作的提交阶段期间执行的数据字典事务,则 该操作被视为成功并且前滚。否则,在InnoDB重放数据字典重做日志时回滚不完整的数据字典事务 ,并回滚DDL事务。

5、查看DDL日志:

InnoDB将DDL日志写入 mysql.innodb_ddl_log表以支持重做和回滚DDL操作。该 mysql.innodb_ddl_log表是隐藏在mysql.ibd数据字典表空间中的隐藏数据字典表 。与其他隐藏数据字典表一样,mysql.innodb_ddl_log在非调试版本的MySQL中无法直接访问该 表。

mysql 8.0基于事务ddl_MySQL8.0新特性——支持原子DDL语句相关推荐

  1. MySQL 8.0新特性之原子DDL

    文章来源:爱可生云数据库 简介 MySQL8.0 开始支持原⼦ DDL(atomic DDL),数据字典的更新,存储引擎操作,写⼆进制日志结合成了一个事务.在没有原⼦DDL之前,DROP TABLE ...

  2. android5.0后新特性修改标题头,Android5.0中Material Design的新特性

    Material Design简介 Material Design是谷歌新的设计语言,谷歌希望寄由此来统一各种平台上的用户体验,Material Design的特点是干净的排版和简单的布局,以此来突出 ...

  3. android5.0及以上版本的新特性

    android5.0及以上版本的新特性 Android5.0 Android6.0 Android7.0 Android8.0 Android9.0 Android5.0 Android 5.0 除了 ...

  4. Mysql Connector 5.1 好用的新特性

    Mysql Connector 5.1 好用的新特性 转载自并发编程网 – ifeve.com本文链接地址: Mysql Connector 5.1 好用的新特性 Mysql Connector 5. ...

  5. 关于MySQL 8.0的几个重点新特性及其他版本浅谈

    大家好今天又与大家见面了.IT技术无领域.国界之分,不断学习最新技术走在IT技术前沿一直是我们的目标网站模板下载争取把自己所学的知识,所经历的经验,拿出来与大家分享,共同成长与进步.在当前这个群雄并起 ...

  6. TailwindCSS v3.0 正式发布!一大波新特性来袭!

    作者 | 一只图雀 来源 | 程序员巴士 今天给大家介绍一篇关于 Tailwind 最新发布的 v3.0 相关的内容. 2021 年 12 月 10 日,TailwindCSS 的创始人 Adam W ...

  7. 氢os android 7.0,基于安卓7.0,一加手机3T氢OS公测版发布 支持NFC一卡通

    安卓中国12月28日消息,在12月中旬,一加发布了一加3的氢OS最新公测版,该版本内核是安卓7.0.现在,一加官方在一加社区推出了一加手机3T的基于安卓7.0的氢OS公测第1版.百度云下载链接:htt ...

  8. Spring 6.0 堪称最强!新特性,惊爆了!

    出品 | OSC开源社区(ID:oschina2013) Spring 6.0 发布了首个 RC 版 公告写道,Spring Framework 6.0 作为重大更新 目前 RC1 要求使用 Java ...

  9. 【CSS】1209- TailwindCSS v3.0 正式发布!一大波新特性来袭!

    大家好,我是皮汤.最近一直在研究 TailwindCSS 相关的内容,打算将其用在接下来的各种项目中,之前也写过关于 CSS 工程化方面的文章:2021 年你需要之前的 CSS 工程化技术,今天给大家 ...

最新文章

  1. “假一赔十”的4k 120Hz电视能买吗?研究完我服了,水是真的深
  2. TCP/IP 广播的发送和接收
  3. 敏捷开发与中医理论系列之一:序言及为何中医教材都是千年古籍
  4. ES6新特性_ES6中模块暴露数据语法汇总---JavaScript_ECMAScript_ES6-ES11新特性工作笔记043
  5. 最近素数问题——C语言
  6. 从有限状态机(FSM)到行为树(Behavior Tree)(1)
  7. offset函数的高级用法_数据验证(数据有效性)结合Offset函数 的综合用法
  8. 京东联盟开发(10)——轮询获取数据
  9. mysql里的数据输入窗口是哪个_WINDOWS下使用Mysql 中碰到的问题记录
  10. 阿里矢量图标库字体图标使用(胎教)
  11. Excel可视化:1个思路学会7种变形柱形图
  12. 【8023】产品与营销的合作关系 产品10大败因
  13. 中国在计算机领域取得的成就,厉害了我的国——盘点中国科学近年有哪些成就...
  14. Windows系统 clac命令详解,Windows系统使用命令行打开计算器
  15. mysql数据库中的正则表达式_MYSQL中正则表达式检索数据库
  16. SQL ——窗口函数简介
  17. Pixelmator for Mac v3.9.9 功能强大的图像编辑软件
  18. C++ Boost库:简介和第一个示例程序
  19. 大商创小程序前端_正版授权风暴!大商创商城系统开启免费送授权活动
  20. CRM系统在销售中的应用

热门文章

  1. wps文件没有保存怎么恢复?
  2. 开机 服务 自动 bat regedi_去除2345开机助手
  3. python-docx模块表格部分单元格格式调整
  4. c# Topshelf 搭建 Windows 服务
  5. 让图片在div里居中(三种方法)
  6. ubuntu安装notion软件,并非网页版
  7. 白鹭(egret)工具集介绍二
  8. 测试手机双摄的软件,手机上的双摄像头有啥用
  9. 双十一热潮在即:猫狗大战将一触即发
  10. js原生,省市区三级联动插件