共计 1631 个字符,预计需要花费 5 分钟才能阅读完成。
简介
MySQL 8.0 开始支持原⼦ DDL(atomic DDL),数据字典的更新,存储引擎操作,写⼆进制日志结合成了一个事务。在没有原⼦ DDL 之前,DROP TABLE test1,test2;如遇到 server crash,可能会有 test1 被 drop 了,test2 没有被 drop 掉。下面来看下在 MySQL 8.0 之前和 MySQL 8.0 数据字典的区别。
存储引擎⽀持
查看 error log
原子 DDL 操作步骤
准备:创建所需的对象并将 DDL ⽇志写入 mysql.innodb_ddl_log 表中。DDL 日志定义了如何前滚和回滚 DDL 操作。
执行:执⾏ DDL 操作。例如,为 CREATE TABLE 操作执⾏创建。
提交:更新数据字典并提交数据字典事务。
Post-DDL:重播并从 mysql.innodb_ddl_log 表格中删除 DDL ⽇志。为确保回滚可以安全执⾏⽽不引⼊不⼀致性,在此最后阶段执⾏⽂件操作(如重命名或删除数据文件)。这一阶段还从 mysql.innodb_dynamic_metadata 的数据字典表删除的动态元数据为了 DROP TABLE,TRUNCATE 和其它重建表的 DDL 操作。
⽆论事务是提交还是回滚,DDL 日志都会 mysql.innodb_ddl_log 在 Post-DDL 阶段重播并从表中删除。mysql.innodb_ddl_log 如果服务器在 DDL 操作期间暂停,DDL ⽇志应该只保留在表中。在这种情况下,DDL ⽇志会在恢复后重播并删除。
原⼦ DDL ⽀持类型
• DROP TABLES , all tables dropped or none
• DROP SCHEMA, all entities in the schema are dropped, or none
• Note that atomic DDL statements will be rolled back or committed even in case of crash, e.g. RENAME TABLES
• CREATE TABLE would be successfully committed or rolled back (no orphan ibd left)
• TRUNCATE TABLE (including InnoDB tables with FTS AUX tables) would be successfully committed or rolled back
• RENAME TABLES, all or none
• ALTER TABLE successful or not done
示例
结论
在 MySQL8.0 之前,alter table 操作在 server crash 的情况下,会遗留.frm,.ibd 文件。MySQL8.0 能实现原⼦ DDL(包括 DROP TABLE, DROP SCHEMA, CREATE TABLE, TRUNCATE TABLE, ALTER TABLE),alter table 操作,在 server crash 的情况下,不会遗留.frm,.ibd 临时文件。
: