zoukankan      html  css  js  c++  java
  • MySQL8.0 原子DDL

     

    MySQL8.0 原子DDL

    简介

      MySQL8.0 开始支持原子 DDL(atomic DDL),数据字典的更新,存储引擎操作,写二进制日志结合成了一个事务。在没有原子DDL之前,DROP TABLE test1,test2;如遇到server crash,可能会有test1被drop了,test2没有被drop掉。下面来看下在MySQL8.0之前和MySQL8.0 数据字典的区别

     

     

      在MySQL8.0 之前,Data Dictionary除了存在与.FRM, .TRG, .OPT 文件外,还存在于系统表中(MyISAM 非事务引擎表中),在MySQL8.0 ,Data Dictionary 全部存在于Data Dictionary Storage Engine(即 InnoDB表中),这使crash recovery 维持原子性成为了可能

     

    存储引擎支持

      目前,只有InnoDB存储引擎支持原子DDL,为了实现原子DDL,Innodb要写DDL logs 到mysql.innodb_ddl_log 表,这是一个隐藏在mysql.ibd 数据字典表空间里的数据字典表。要看mysql.innodb_ddl_log 中的内容,需要

    SET GLOBAL LOG_ERROR_VERBOSITY=3;(MySQL 8.0 默认为2,error log 记录Errors and warnings,不记录notes)
    SET GLOBAL innodb_print_ddl_logs=1;
    CREATE TABLE t1 (c1 INT) ENGINE = InnoDB;

    查看error log

    [Note] [MY-011066] InnoDB: DDL log insert : [DDL record: DELETE SPACE, id=30, thread_id=25, space_id=9, old_file_path=./test/t1.ibd]
    [Note] [MY-011066] InnoDB: DDL log delete : by id 30
    [Note] [MY-011066] InnoDB: DDL log insert : [DDL record: REMOVE CACHE, id=31, thread_id=25, table_id=1066, new_file_path=test/t1]
    [Note] [MY-011066] InnoDB: DDL log delete : by id 31
    [Note] [MY-011066] InnoDB: DDL log insert : [DDL record: FREE, id=32, thread_id=25, space_id=9, index_id=143, page_no=4]
    [Note] [MY-011066] InnoDB: DDL log delete : by id 32
    [Note] [MY-011066] InnoDB: DDL log post ddl : begin for thread id : 25
    [Note] [MY-011066] InnoDB: DDL log post ddl : end for thread id : 25

    原子DDL 操作步骤

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

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

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

    4.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事务。如果在重做日志和二进制日志中存在DDL操作的提交阶段期间执行的数据字典事务,则该操作被认为是成功的并且被前滚。否则,在InnoDB重放数据字典重做日志时回滚不完整的数据字典事务 ,并且回滚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临时文件。让我们一起期待MySQL8.0 GA的到来吧!

    参考: 
    https://www.youtube.com/watch?v=jM53hSU9L70 
    https://dev.mysql.com/doc/refman/8.0/en/atomic-ddl.html

     

     

  • 相关阅读:
    Android ListView嵌套Button,Button事件覆盖item事件解决办法
    android 再按一次退出程序(实现代码)
    Android 带checkbox的listView 实现多选,全选,反选
    Android调用第三方应用
    Android输入法界面管理(打开/关闭/状态获取)
    ViewPager的使用方法和实现过程
    安装pycharm 2018.3 Professional Edition
    layui和jquery冲突:Syntax error, unrecognized expression: +
    解决因为本地代码和远程代码冲突,导致git pull无法拉取远程代码的问题(转载)
    Object.assign()
  • 原文地址:https://www.cnblogs.com/YangJiaXin/p/8776915.html
Copyright © 2011-2022 走看看