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 *** 作步骤
准备:创建所需的对象并将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事务。如果在重做⽇志和⼆进制日志中存在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的到来吧!
1、auto_increament没滚innodbauto_increament计数器记录前值保存存内 存并存于磁盘mysql server处于运行候计数值随着insert改增随着delete减少mysql server启我需要查询auto_increment计数值mysql便自执行:SELECT MAX(id) FROM 表名 FOR UPDATE语句获前auto_increment列值值放auto_increment计数器所算 Rollback MySQLauto_increament计数器作负运算
2、MySQL事务表 *** 作候否物理 *** 作
MySQL事务redoundoredo *** 作所信息都记录 redo_log说事务做commit *** 作需要先事务 *** 作写redo_log再些 *** 作flush磁盘 现故障需要读取redo_log,再重新flush磁盘行
于undo比较麻烦MySQL处理事务数据共享 表空间申请段叫做segment段用保存undo信息处理rollback完完全全物理undo逻辑undo,说 前 *** 作进行反 *** 作些共享表空间进行收些表空间收需要由mysqlmaster thread进程进行收
如何设置mysql的DDL语句不自动提交首先,要看你的表是MYISAM还是INNODB
MYISAMrollback 是没有用的,因为不支持事务,不能回滚。
INNODBrollback 可以回滚。
还有注意的是,mysql默认的是自动提交的。
所以即使你使用的是innodb,比如delete了一行数据,没有commit(系统自动commit了),你rollback也不回恢复,除非你把自动提交关闭了set autocommit=0。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)