首页 > 编程笔记 > MySQL笔记 阅读:10

MySQL DLL原子化操作(附带实例)

MySQL 9.0 支持 DDL(数据定义语言)的原子化。原子化 DDL 是指一个 DDL 操作是不可分割的,要么全成功要么全失败。它确保了在执行 DDL 操作时,如果其中一个操作失败,那么所有其他操作都将被回滚。这在处理复杂的数据库架构和高度可用的系统时尤为重要。

DDL操作回滚日志写入数据字典表 mysql.innodb_ddl_log(该表是隐藏的表,无法通过 SHOW TABLES 看到)中,用于回滚操作。通过设置参数,可将 DDL 操作日志打印输出到 MySQL 错误日志中。

下面通过案例来对比不同版本中 DDL 操作的区别。

分别在 MySQL 5.7 版本和 MySQL 9.0 版本中创建数据库和数据表,SQL 语句如下:
CREATE DATABASE mytest;
USE mytest;

CREATE TABLE bk1
(
bookid             INT NOT NULL,
bookname          VARCHAR(255)
);
mysql> SHOW TABLES;
+------------------+
| Tables_in_mytest |
+------------------+
| bk1              |
+------------------+

1) 在 MySQL 5.7 版本中,测试步骤如下:
① 删除数据表 bk1 和数据表 bk2,结果如下:
mysql> DROP TABLE BK1,BK2;
ERROR 1051 (42S02): Unknown table 'mytest.bk2'

再次查询数据库中的数据表名称,结果如下:
mysql> SHOW TABLES;
Empty set (0.00 sec)
从结果可以看出,虽然执行删除操作时报错了,但是仍然删除了数据表 bk1。

2) 在 MySQL 9.0 版本中,测试步骤如下:
① 删除数据表 bk1 和数据表 bk2,结果如下:
mysql> DROP TABLE bk1,bk2;
ERROR 1051 (42S02): Unknown table 'mytest.bk2'

② 再次查询数据库中的数据表名称,结果如下:
mysql> SHOW TABLES;
+------------------+
| Tables_in_mytest |
+------------------+
| bk1              |
+------------------+
从结果可以看出,数据表 bk1 并没有被删除,因为执行删除操作时报错了,删除操作被回滚了。

相关文章