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 语句如下:
1) 在 MySQL 5.7 版本中,测试步骤如下:
① 删除数据表 bk1 和数据表 bk2,结果如下:
再次查询数据库中的数据表名称,结果如下:
2) 在 MySQL 9.0 版本中,测试步骤如下:
① 删除数据表 bk1 和数据表 bk2,结果如下:
② 再次查询数据库中的数据表名称,结果如下:
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 并没有被删除,因为执行删除操作时报错了,删除操作被回滚了。