澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

澳门新萄京官方网站:深入解读MySQL8,table导致的

2019-07-27 作者:数据库网络   |   浏览(74)

   MySQL 8.0始发帮助原子数据定义语言(DDL)语句。此成效称为原子DDL。原子DDL语句将与DDL操作关联的数码字典更新,存款和储蓄引擎操作和二进制日志写入组合到单个原子事务中。纵然服务器在操作时期暂停,也会付出业务,并将适用的改变保留到多少字典,存款和储蓄引擎和二进制日志,或许回滚事务。

MySQL 8.0起来接济原子数据定义语言(DDL)语句。此作用称为原子DDL。原子DDL语句将与DDL操作关联的多少字典更新,存储引擎操作和二进制日志写入组合到单个原子事务中。就算服务器在操作时期暂停,也会付出业务,并将适用的更换保留到多少字典,存款和储蓄引擎和二进制日志,也许回滚事务。

在MySQL8.0事先的版本中,由于架构的缘故,mysql在server层使用统一的frm文件来囤积表元数据音讯,这几个音信可见被不一样的积累引擎识别。而其实innodb本人也蕴藏有元数据新闻。那给ddl带来了自然的挑衅,因为这种架构不能到位ddl的原子化,大家在线上临时能够见到数据目录下遗留的有时文件,或然类似server层和innodb层列个数不平等之类的失实。以至有个别ddl大概还遗留元数据在innodb内,而遗失了frm,导致敬敏不谢重新建设构造表…..(大家为了化解那些难题,实现了贰个叫drop table force的作用,去强制做清理….)

前天做多少迁移, 开采专门的学问一时候可以回滚, 一时候不得以回滚, 最后一小点调养开掘中间有段修改表结构的言辞, 最终致使回滚失利。

  希望这本书能像内行专家那样与您实行对话,用简短的标题、例子让您学到须求的文化。为了达成那样的目标,笔者会从每二个细节初始稳步的为大家树立概念,最终会给大家来得十分大的实用例,在念书此前大概大家会以为这一个用例很难,可是只要跟着课程去学,相信不慢就会驾驭。
Conventions and Styles 约定和编制程序风格
  每回自身想要演示实际代码时,作者会对mysql客户端的显示屏就涌出的代码进行调治,将字体制改善成Courier,使他们看起来与日常文书区别样。
  在此地比方:mysql> DROP FUNCTION f;Query OK, 0 rows affected (0.00 sec)
  假如实例相当的大,则须要在有些行和段落间加注释,同不平日间自己会用将“
mysql> CREATE PROCEDURE p ()
-> BEGIN
-> /* This procedure does nothing */  END;//Query OK, 0 rows affected (0.00 sec)
  临时候我会将例子中的"mysql>"和"->"这么些种类来得去掉,你可以间接将代码复制到mysql客户端程序中(若是您今后所读的不是电子版的,能够在mysql.com网址下载相关脚本)所以的事例都早已在Suse 9.2 Linux、Mysql 5.0.3公共版上测量试验通过。
  在你读书本书的时候,Mysql已经有更高的本子,同一时候能协助越来越多OS了,富含Windows,Sparc,HP-UX。因而这里的例子将能符合规律的运作在你的Computer上。但假如运行依然出现故障,能够问问你认知的著名Mysql用户,以获得长期的支撑和增加帮衬。
Why MySQL Statements are Legal in a Procedure Body
  什么MySQL语句在仓库储存进度体中是法定的?
  什么样的SQL语句在Mysql存款和储蓄进程中才是法定的吗?你能够制造一个分包INSERT, UPDATE,DELETE, SELECT, DROP, CREATE, REPLACE等的言辞。你独一须求牢记的是只要代码中包涵MySQL扩展成效,那么代码将不能够移植。在专门的学问SQL语句中:任何数据库定义语言都以法定的,如:

 

   通过在MySQL 8.0中引进MySQL数据字典,能够兑现Atomic DDL。在开始时代的MySQL版本中,元数据存款和储蓄在元数据文件,非事务性表和仓库储存引擎特定的字典中,那须求中间提交。MySQL数据字典提供的集英式事务元数据存款和储蓄消除了这一障碍,使得将DDL语句操作结合为原子事务成为只怕。

(以下有所的评论都假定使用InnoDB存款和储蓄引擎)

 

CREATE PROCEDURE p () DELETE FROM t; //
  SET、COMMIT以及ROLLBACK也是合法的,如:
CREATE PROCEDURE p () SET @x = 5; //
  MySQL的附加成效:任何数据操作语言的言辞都将法定。
澳门新萄京官方网站:深入解读MySQL8,table导致的mysql事务回滚失败。CREATE PROCEDURE p () DROP TABLE t; //
  MySQL扩充功效:直接的SELECT也是法定的:
CREATE PROCEDURE p () SELECT 'a'; //
  顺便提一下,小编将积攒进程中归纳DDL语句的法力称为MySQL附加功用的原由是在SQL标准中把那个概念为非核心的,就可以选组件。
The New SQL Statements 新SQL语句
Variables 变量
  在复合语句中宣示变量的下令是DECLARE。
  (1) Example with two DECLARE statements
  五个DECLARE语句的例证 

   通过在MySQL 8.0中引进MySQL数据字典,能够兑现Atomic DDL。在开始时代的MySQL版本中,元数据存款和储蓄在元数据文件,非事务性表和储存引擎特定的字典中,那须要中间提交。MySQL数据字典提供的集美式事务元数据存款和储蓄化解了这一绊脚石,使得将DDL语句操作结合为原子事务成为也许。

法定文书档案:

到了8.0版本,我们清楚全部的元数据现已合併用InnoDB来进行政管理制,那就给落到实处原子ddl带来了说不定,大致全体的对innodb表,存款和储蓄进程,触发器,视图也许UDF的操作,都能成功原子化:

1.MySQL最常用的五个表类型: InnoDB和MyISAM。MyISAM类型的表强调的是性质,其实施数度比InnoDB类型越来越快,但是不提供业务援助,而InnoDB提供业务帮衬、存款和储蓄进度、视图、行级锁定等等高档数据库作用,若回滚战败,先反省表类型。 

CREATE PROCEDURE p8 ()
BEGIN
DECLARE a INT;
DECLARE b INT;
SET a = 5;
SET b = 5;
INSERT INTO t VALUES (a);
SELECT s1 * a FROM t WHERE s1 >= b;
END; // /* I won't CALL this */
  在进程中定义的变量并非真正的概念,你只是在BEGIN/END块内定义了而已(译注:也便是形参)。
Error Handling 非常管理
  好了,大家前些天要讲的是老大管理
1. Sample Problem: Log Of Failures 难题样例:故障记录
  当INSERT失利时,小编盼望能将其记录在日记文件中大家用来展现出错管理的难点样例是很
平日的。笔者希望赢得错误的记录。当INSERT战败时,作者想在另二个文书中记录那一个错误的
消息,举个例子出错开上下班时间间,出错原因等。小编对插入非常感兴趣的原因是它将违反外键关联的束缚
2. Sample Problem: Log Of Failures (2)
mysql> CREATE TABLE t2
s1 INT, PRIMARY KEY (s1))
engine=innodb;//
mysql> CREATE TABLE t3 (s1 INT, KEY (s1),
FOREIGN KEY (s1) REFERENCES t2 (s1))
engine=innodb;//
mysql> INSERT INTO t3 VALUES (5);//
...
ERROR 1216 (23000): Cannot add or update a child row: a foreign key
constraint fails(这里显得的是系统的失误新闻)
  笔者先河要创制多少个主键表,以及三个外键表。咱们选用的是InnoDB,由另外键关联合检查查是打
开的。然后当作者向外键表中插入非主键表中的值时,动作将会失利。当然这种条件下得以很
快找到错误号1216。
3. Sample Problem: Log Of Failures

 

- 元数据修改,binlog以及innodb的操作都放在一个事务中- 增加了一个内部隐藏的系统表`mysql.innodb_ddl_log`,ddl操作被记录到这个表中,注意对该表的操作产生的redo会fsync到磁盘上,而不会考虑innodb_flush_log_at_trx_commit的配置。当崩溃重启时,会根据事务是否提交来决定通过这张表的记录去回滚或者执行ddl操作- 增加了一个post-ddl的阶段,这也是ddl的最后一个阶段,会去:1. 真正的物理删除或重命名文件; 2. 删除innodb_ddl_log中的记录项; 3.对于一些ddl操作还会去更新其动态元数据信息(存储在`mysql.innodb_dynamic_metadata`,例如corrupt flag, auto_inc值等)- 一个正常运行的ddl结束后,其ddl log也应该被清理,如果这中间崩溃了,重启时会去尝试重放:1.如果已经走到最后一个ddl阶段的,就replay ddl log,把ddl完成掉;2. 如果处于某个中间态,则回滚ddl

SHOW ENGINES 语句能够查阅当前的数据库帮衬的囤积类

CREATE TABLE error_log (error_message
CHAR(80))//
  下一步便是一穷二白一个在做插入动作出错开上下班时间存储错误的表。

官方文书档案:

1、支持的DDL语句

出于引进了atomic ddl, 有些ddl操作的一举一动也时有爆发了扭转:

澳门新萄京官方网站 1

你大概感兴趣的稿子:

  • MySQL存款和储蓄进程例子(满含事务,输出参数,嵌套调用)
  • mysql 存款和储蓄进度中变量的定义与赋值操作
  • MySQL 有输入输出参数的囤积进程实例
  • mysql 动态施行存款和储蓄进程语句
  • mysql 教程 存款和储蓄进程
  • mysql 存款和储蓄进度的难点
  • MySQL 存款和储蓄进度和"Cursor"的使用格局
  • MySQL5成立存款和储蓄进程的亲自过问
  • MySQL与积存进程的连锁材质
  • php调用mysql存款和储蓄进程
  • MySQL 存款和储蓄进度的主干用法介绍

 原子DDL成效辅助表和非表DDL语句。与表相关的DDL操作供给仓储引擎帮忙,而非表DDL操作则不须求。这段时间,唯有InnoDB存款和储蓄引擎辅助原子DDL。

- DROP TABLE: 在之前的版本中,一个drop table语句中如果要删多个表,比如t1,t2, t2不存在时,t1会被删除。但在8.0中,t1和t2都不会被删除,而是抛出错误。因此要注意5.7->8.0的复制问题 (DROP VIEW, CREATE USER也有类似的问题)- DROP DATABASE: 修改元数据和ddl_log先提交事务,而真正的物理删除数据文件放在最后,因此如果在删除文件时崩溃,重启时会根据ddl_log继续执行drop database

 

 

①:受扶助的表DDL语句满含 CREATE,ALTE本田CR-Z和 DROP对数据库,表,表和目录,以及讲话 TRUNCATE TABLE表明。
②:辅助的非表DDL语句富含:
   CREATE和DROP 语句,以及(就算适用)ALTE福特Explorer存储程序,触发器,视图和用户定义函数(UDF)的语句。
   账户管理语句: CREATE,ALTEEvoque, DROP,,如若适用, RENAME报表用户和剧中人物,以及GRANT 和REVOKE报表。

MySQL很密切的加了多个摘取innodb_print_ddl_logs,张开后大家得以从破绽百出日志看到相应的ddl log,上面大家通过这几个来看下一些名列前茅ddl的进程

SHOW CREATE TABLE 表名;可以查看表的开创语句,最终有表的贮存结构

 

1.1、原子DDL效用不支持以下语句:

root@ 11:12:19>SET GLOBAL innodb_print_ddl_logs = 1; Query OK, 0 rows affected root@ 11:12:22>SET GLOBAL log_error_verbosity = 3; Query OK, 0 rows affected 

澳门新萄京官方网站 2

1、支持的DDL语句

①:涉及除存款和储蓄引擎之外的积攒引擎的与表相关的DDL语句InnoDB。
②:INSTALL PLUGIN和 UNINSTALL PLUGIN 陈述。
③:INSTALL COMPONENT和 UNINSTALL COMPONENT 陈述。
④:CREATE SERVER, ALTER SERVER和 DROP SERVER语句。

CREATE DATABASE

mysql> CREATE DATABASE test;Query OK, 1 row affected 

创办数据库语句未有写log_ddl,恐怕感觉那不是几度操作,若是创设database的经过中败诉了,重启后或者必要手动删除目录。

ALTEENCORE TABLE 表名 ENGINE = InnoDB;修改表的仓库储存类型

 原子DDL作用支撑表和非表DDL语句。与表相关的DDL操作必要仓库储存引擎援救,而非表DDL操作则不须求。如今,唯有InnoDB存款和储蓄引擎协助原子DDL。

2、原子DDL特性:

CREATE TABLE

mysql> USE test;Database changedmysql> CREATE TABLE t1 (a INT PRIMARY KEY, b INT);Query OK, 0 rows affected [InnoDB] DDL log insert : [DDL record: DELETE SPACE, id=428, thread_id=7, space_id=76, old_file_path=./test/t1.ibd][InnoDB] DDL log delete : by id 428[InnoDB] DDL log insert : [DDL record: REMOVE CACHE, id=429, thread_id=7, table_id=1102, new_file_path=test/t1][InnoDB] DDL log delete : by id 429[InnoDB] DDL log insert : [DDL record: FREE, id=430, thread_id=7, space_id=76, index_id=190, page_no=4][InnoDB] DDL log delete : by id 430[InnoDB] DDL log post ddl : begin for thread id : 7InnoDB] DDL log post ddl : end for thread id : 7

从日记来看有三类操作,实际上描述了一旦操作退步供给开始展览的三项逆向操作:删除数据文件,释放内部存款和储蓄器中的数额词典消息,删除索引btree。在创造表在此以前,那么些数量被写入到ddl_log中,在成立完表并commit后,再从ddl log中剔除这一个记录。其余上述日志中还应该有DDL log delete日记,其实在历次写入ddl log时是单身事务提交的,但在提交以往,会选取当前作业试行一条delete操作,直到操作结束了才会交到。

 

 

①:元数据更新,二进制日志写入和积存引擎操作(假若适用)将统一为单个事务。
②:在DDL操作期间,SQL层未有中间提交。
③:在适用的意况下:
    数据字典,程序,事件和UDF高速缓存的意况与DDL操作的处境同样,那意味更新高速缓存以展现DDL操作是大功告成做到只怕回滚。
    DDL操作中提到的仓库储存引擎方法不推行中间提交,而且存款和储蓄引擎将本身注册为DDL事务的一有的。
    存款和储蓄引擎辅助DDL操作的重做和回滚,那在DDL操作的 Post-DDL阶段实行。
④:DDL操作的可知行为是原子的,那会改动有个别DDL语句的一坐一起

加列

mysql> ALTER TABLE t1 ADD COLUMN c INT;Query OK, 0 rows affected Records: 0 Duplicates: 0 Warnings: 0[InnoDB] DDL log post ddl : begin for thread id : 7[InnoDB] DDL log post ddl : end for thread id : 7

瞩目这里进行的是Instant ddl, 这是8.0.13新辅助的表征,加列操作能够只修改元数据,由此从ddl log中无需记下数据

 

①:接受帮衬助的表DDL语句包蕴 CREATE,ALTEXC90和 DROP对数据库,表,表和目录,以及讲话 TRUNCATE TABLE注脚。

注意:

删列

mysql> ALTER TABLE t1 DROP COLUMN c;Query OK, 0 rows affected Records: 0 Duplicates: 0 Warnings: 0[InnoDB] DDL log insert : [DDL record: DELETE SPACE, id=487, thread_id=7, space_id=83, old_file_path=./test/#sql-ib1108-1917598001.ibd][InnoDB] DDL log delete : by id 487[InnoDB] DDL log insert : [DDL record: REMOVE CACHE, id=488, thread_id=7, table_id=1109, new_file_path=test/#sql-ib1108-1917598001][InnoDB] DDL log delete : by id 488[InnoDB] DDL log insert : [DDL record: FREE, id=489, thread_id=7, space_id=83, index_id=200, page_no=4][InnoDB] DDL log delete : by id 489[InnoDB] DDL log insert : [DDL record: DROP, id=490, thread_id=7, table_id=1108][InnoDB] DDL log insert : [DDL record: RENAME SPACE, id=491, thread_id=7, space_id=82, old_file_path=./test/#sql-ib1109-1917598002.ibd, new_file_path=./test/t1.ibd][InnoDB] DDL log delete : by id 491[InnoDB] DDL log insert : [DDL record: RENAME TABLE, id=492, thread_id=7, table_id=1108, old_file_path=test/#sql-ib1109-1917598002, new_file_path=test/t1][InnoDB] DDL log delete : by id 492[InnoDB] DDL log insert : [DDL record: RENAME SPACE, id=493, thread_id=7, space_id=83, old_file_path=./test/t1.ibd, new_file_path=./test/#sql-ib1108-1917598001.ibd][InnoDB] DDL log delete : by id 493[InnoDB] DDL log insert : [DDL record: RENAME TABLE, id=494, thread_id=7, table_id=1109, old_file_path=test/t1, new_file_path=test/#sql-ib1108-1917598001][InnoDB] DDL log delete : by id 494[InnoDB] DDL log insert : [DDL record: DROP, id=495, thread_id=7, table_id=1108][InnoDB] DDL log insert : [DDL record: DELETE SPACE, id=496, thread_id=7, space_id=82, old_file_path=./test/#sql-ib1109-1917598002.ibd][InnoDB] DDL log post ddl : begin for thread id : 7[InnoDB] DDL log replay : [DDL record: DELETE SPACE, id=496, thread_id=7, space_id=82, old_file_path=./test/#sql-ib1109-1917598002.ibd][InnoDB] DDL log replay : [DDL record: DROP, id=495, thread_id=7, table_id=1108][InnoDB] DDL log replay : [DDL record: DROP, id=490, thread_id=7, table_id=1108][InnoDB] DDL log post ddl : end for thread id : 7

那是个优异的三等第ddl的进度:分为prepare, perform 以及commit八个级次:

  • Prepare: 那个等第会修改元数据,创立一时ibd文件#sql-ib1108-壹玖壹陆598001.ibd, 就算产生极度崩溃,我们须要能把那些一时文件删除掉, 因而和create table类似,也为那些idb写了三条日志:delete space, remove cache,以及free btree

  • Perform: 实行操作,将数据拷贝到上述ibd文件中,(同一时候管理online dmllog), 那有些不涉及log ddl操作

  • Commit: 更新数据词典音讯并付诸业务, 这里会写几条日志:

    • DROP : table_id=1108
    • RENAME SPACE: #sql-ib1109-1917598002.ibd文件被rename成t1.ibd
    • RENAME TABLE: #sql-ib1109-1917598002被rename成t1
    • RENAME SPACE: t1.ibd 被rename成#sql-ib1108-1917598001.ibd
    • RENAME TABLE: t1表被rename成#sql-ib1108-1917598001
    • DROP TABLE: table_id=1108
    • DELETE SPACE: 删除#sql-ib1109-1917598002.ibd

实则这一步写的ddl log描述了commit阶段操作的逆向进程:将t1.ibd rename成#sql-ib1109-一九一九598002, 并将sql-ib1108-壹玖壹玖598001 rename成t1表,最终删除旧表。个中删除旧表的操作这里不实行,而是到post-ddl阶段实施

  • Post-ddl: 在事情提交后,试行最后的操作:replay ddl log, 删除旧文件,清理mysql.innodb_dynamic_metadata中相关新闻

    • DELETE SPACE: #sql-ib1109-1917598002.ibd
    • DROP: table_id=1108
    • DROP: table_id=1108

2.临时有一些SQL语句会发出三个隐式的付出操作,即施行到位这几个话语后,会有四个隐式的COMMIT操作。有以下SQL语句,不用您去“管”:

②:辅助的非表DDL语句包蕴:

  原子或任何DDL语句隐式停止近些日子对话中处于活动状态的别的专门的学问,就就疑似你COMMIT在实行语句在此以前到位了平等。那表示DDL语句不能够在另多少个业务中,在作业调整语句中奉行START TRANSACTION ... COMMIT,或许与同等业务中的其余语句结合使用。

加索引

mysql> ALTER TABLE t1 ADD KEY;Query OK, 0 rows affected Records: 0 Duplicates: 0 Warnings: 0[InnoDB] DDL log insert : [DDL record: FREE, id=431, thread_id=7, space_id=76, index_id=191, page_no=5][InnoDB] DDL log delete : by id 431[InnoDB] DDL log post ddl : begin for thread id : 7[InnoDB] DDL log post ddl : end for thread id : 7

开创索引采取inplace创制的措施,未有有时文件,但假若不行发生的话,还是亟待在发出至极时清理有的时候索引, 由此增添了一条FREE log,用于至极发生时亦可删除一时索引.

  • DDL语句,ALTER DATABASE、ALTER EVENT、ALTER PROCEDURE、ALTER TABLE、ALTER VIEW、CREATE TABLE、DROP TABLE、RENAME TABLE、TRUNCATE TABLE等;
  • 修改MYSQL框架结构的说话,CREATE USEEscort、DROP USEHaval、GRANT、RENAME USE奥迪Q7、REVOKE、SET PASSWOQX56D;
  • 治本语句,ANALYZE TABLE、CACHE INDEX、CHECK TABLE、LOAD INDEX INTO CACHE、OPTIMIZE TABLE、REPAI途睿欧 TABLE等

   CREATE和DROP 语句,以及(假使适用)ALTERubicon存款和储蓄程序,触发器,视图和用户定义函数(UDF)的语句。

3、DDL语句行为的调换

TRUNCATE TABLE

mysql> TRUNCATE TABLE t1;Query OK, 0 rows affected [InnoDB] DDL log insert : [DDL record: RENAME SPACE, id=439, thread_id=7, space_id=77, old_file_path=./test/#sql-ib1103-1917597994.ibd, new_file_path=./test/t1.ibd][InnoDB] DDL log delete : by id 439[InnoDB] DDL log insert : [DDL record: DROP, id=440, thread_id=7, table_id=1103][InnoDB] DDL log insert : [DDL record: DELETE SPACE, id=441, thread_id=7, space_id=77, old_file_path=./test/#sql-ib1103-1917597994.ibd][InnoDB] DDL log insert : [DDL record: DELETE SPACE, id=442, thread_id=7, space_id=78, old_file_path=./test/t1.ibd][InnoDB] DDL log delete : by id 442[InnoDB] DDL log insert : [DDL record: REMOVE CACHE, id=443, thread_id=7, table_id=1104, new_file_path=test/t1][InnoDB] DDL log delete : by id 443[InnoDB] DDL log insert : [DDL record: FREE, id=444, thread_id=7, space_id=78, index_id=194, page_no=4][InnoDB] DDL log delete : by id 444[InnoDB] DDL log insert : [DDL record: FREE, id=445, thread_id=7, space_id=78, index_id=195, page_no=5][InnoDB] DDL log delete : by id 445[InnoDB] DDL log post ddl : begin for thread id : 7[InnoDB] DDL log replay : [DDL record: DELETE SPACE, id=441, thread_id=7, space_id=77, old_file_path=./test/#sql-ib1103-1917597994.ibd][InnoDB] DDL log replay : [DDL record: DROP, id=440, thread_id=7, table_id=1103][InnoDB] DDL log post ddl : end for thread id : 7

Truncate table是个相比有趣的话题,在早期5.6及在此以前的版本中, 是通过删除旧表创造新表的点子来展开的,5.7从此为了保障原子性,改成了原地truncate文件,同一时间扩大了二个truncate log文件,要是在truncate过程中垮台,能够通过那个文件在崩溃苏醒时再度truncate。到了8.0版本,又大张旗鼓成了除去旧表,创设新表的不二秘技,与前面差异的是,8.0本子在崩溃时得以回滚到旧数据,并非再一次实行。以上述为例,首要不外乎多少个步骤:

  • 将表t1.ibd rename成#sql-ib1103-1917597994.ibd
  • 成立新文件t1.ibd
  • post-ddl: 将老文件#sql-ib1103-1917597994.ibd删除

陈设事务时,不应富含那类语句。借使在作业的前部中发表了一个不能够被回滚的讲话,则后部的其余语句会产生错误,在那些处境下,通过揭橥ROLLBACK语句无法回滚事务的漫天效率。

   账户管理语句: CREATE,ALTE途乐, DROP,,假诺适用, RENAME报表用户和剧中人物,以及GRANT 和REVOKE报表。

3.1、DROP TABLE:

RENAME TABLE

mysql> RENAME TABLE t1 TO t2;Query OK, 0 rows affected 

DDL LOG:

[InnoDB] DDL log insert : [DDL record: RENAME SPACE, id=450, thread_id=7, space_id=78, old_file_path=./test/t2.ibd, new_file_path=./test/t1.ibd][InnoDB] DDL log delete : by id 450[InnoDB] DDL log insert : [DDL record: RENAME TABLE, id=451, thread_id=7, table_id=1104, old_file_path=test/t2, new_file_path=test/t1][InnoDB] DDL log delete : by id 451[InnoDB] DDL log post ddl : begin for thread id : 7[InnoDB] DDL log post ddl : end for thread id : 7

其一就相比较简单了,只要求记录rename space 和rename table的逆操作就能够. post-ddl无需狠抓在的操作

 

 

 假使具有命名表都施用原子DDL协助的蕴藏引擎,则操作是全然原子的。该语句要么成功删除全部表,要么回滚。

DROP TABLE

DROP TABLE t2

[InnoDB] DDL log insert : [DDL record: DROP, id=595, thread_id=7, table_id=1119][InnoDB] DDL log insert : [DDL record: DELETE SPACE, id=596, thread_id=7, space_id=93, old_file_path=./test/t2.ibd][InnoDB] DDL log post ddl : begin for thread id : 7[InnoDB] DDL log replay : [DDL record: DELETE SPACE, id=596, thread_id=7, space_id=93, old_file_path=./test/t2.ibd][InnoDB] DDL log replay : [DDL record: DROP, id=595, thread_id=7, table_id=1119][InnoDB] DDL log post ddl : end for thread id : 7

先在ddl log中记录下供给删除的多寡,再交由后,再最终post-ddl阶段实行真正的删除表对象和文件操作

驷不比舌完成代码聚集在文书storage/innobase/log/log0ddl.cc中,富含了向log_ddl表中插入记录以及replay的逻辑。

隐藏的innodb_log_ddl表结构如下

 def->add_field(0, "id", "id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT"); def->add_field(1, "thread_id", "thread_id BIGINT UNSIGNED NOT NULL"); def->add_field(2, "type", "type INT UNSIGNED NOT NULL"); def->add_field(3, "space_id", "space_id INT UNSIGNED"); def->add_field(4, "page_no", "page_no INT UNSIGNED"); def->add_field(5, "index_id", "index_id BIGINT UNSIGNED"); def->add_field(6, "table_id", "table_id BIGINT UNSIGNED"); def->add_field(7, "old_file_path", "old_file_path VARCHAR COLLATE UTF8_BIN"); def->add_field(8, "new_file_path", "new_file_path VARCHAR COLLATE UTF8_BIN"); def->add_index(0, "index_pk", "PRIMARY KEY; def->add_index(1, "index_k_thread_id", "KEY(thread_id)");

 

1.1、原子DDL效率不扶助以下语句:

DROP TABLE假如命名表海市蜃楼,而且未举行其余更动(无论存款和储蓄引擎怎么着),则会战败并体现错误。如下所示:

笔录类型

据他们说不相同的操作类型,能够分成如下几类:

  1. FREE_TREE_LOG目标是释放索引btree,入口函数log_DDL::write_free_tree_log,在开立索引和删除表时会调用到

对此drop table中关系的删索引操作,log ddl的插入操作放到父事务中,一同或许提交要么回滚对于开创索引的case, log ddl就供给单独提交,父事务将记录标识删除,那样前面假如ddl回滚了,也能将残留的index删掉。

  1. DELETE_SPACE_LOG

入口函数:Log_DDL::write_delete_space_log

用来记录删除tablespace操作,一样分为三种情景:

  1. drop table/tablespace, 写入的记录随父事务一同付出,并在post-ddl阶段replay
  2. 创立tablespace, 写入的记录单独提交,并被父事务标志删除,假使父事务回滚,就由此replay删除参预的tablespace
  3. RENAME_SPACE_LOG

入口函数:Log_DDL::write_rename_space_log

用于记录rename操作,比如即便大家把表t1 rename成t2,在里面就记下了逆向操作t2 rename to t1.在函数Fil_shard::space_rename()中,总是先写ddl log, 再压实在的rename操作. 写日记的历程同样是单身业务提交,父事务做未提交的删减操作

  1. DROP_LOG

入口函数: Log_DDL::write_drop_log

用于记录删除表对象操作,这里不关乎文件层操作,写ddl log在父事务中执行

  1. RENAME_TABLE_LOG

入口函数: Log_DDL::write_rename_table_log

用以记录rename table对象的逆操作,和rename space类似,也是单身业务提交ddl log, 父事务标识删除

  1. REMOVE_CACHE_LOG

入口函数: Log_DDL::write_remove_cache_log

用以拍卖内部存款和储蓄器表对象的清理,独立职业提交,父事务标志删除

  1. ALTER_ENCRYPT_TABLESPACE_LOG

入口函数: Log_DDL::write_alter_encrypt_space_log

用以记录对tablespace加密属性的改换,独立事务提交. 在写完ddl log后修改tablespace page0 中的加密标识

综上,在ddl的进度中恐怕会交到多次事情,大约分为三类:

  • 独立工作写ddl log并交给,父事务标志删除, 如若父事务提交了,ddl log也被故意照旧无意删除了,如果父事务回滚了,那将在依附ddl log做逆操作来回滚ddl
  • 单身业务写ddl log 并交给, (这段日子独有ALTEPRADO_ENCRYPT_TABLESPACE_LOG)
  • 选取父事务写ddl log,在ddl截止时提交。须要在post-ddl阶段管理

MySQL 数据表主要支撑三种档次,分别是:BDB、HEAP、ISAM、ME奥迪Q5GE、MYISAM、InnoBDB。

①:涉及除存储引擎之外的仓库储存引擎的与表相关的DDL语句InnoDB。

mysql> CREATE TABLE t1 (c1 INT);
mysql> DROP TABLE t1, t2;
ERROR 1051 (42S02): Unknown table 'test.t2'
mysql> SHOW TABLES;
 ---------------- 
| Tables_in_test |
 ---------------- 
| t1    |
 ---------------- 

post_ddl

总的来说,有个别ddl log是随着父事务一同提交的,某些则在post-ddl阶段再施行, post_ddl发生在父事提交或回滚之后: 若事务回滚,依据ddl log做逆操作,若事务提交,在post-ddl阶段做最终实在不可逆操作

入口函数: Log_DDL::post_ddl -->Log_DDL::replay_by_thread_id

依靠施行ddl的线程thread id通过innodb_log_ddl表上的二级索引,找到log id,再到集中索引上找到其相应的记录项,然后再replay那几个操作,达成ddl后,清理对应记录

那多样又分为两类,一类是“事务安全型”(transaction-safe),满含BDB和InnoDB;别的都属于第二类,称为”非事务安全型”(non-transaction-safe)。

②:INSTALL PLUGIN和 UNINSTALL PLUGIN 陈述。

在引进原子DDL从前, DROP TABLE尽管会报错误表子虚乌有,然而存在的表会被实行成功,如下:

崩溃恢复生机

在崩溃恢复生机甘休后,会调用ha_post_recover接口函数,进而调用innodb内的函数Log_DDL::recover(), 同样的replay当中的记录,并在收尾后去除记录。但ALTEEnclave_ENCRYPT_TABLESPACE_LOG类型并不是在这一步删除,而是参预到贰个数组ts_encrypt_ddl_records中,在之后调用resume_alter_encrypt_tablespace来回复操作,

题目一举成功:

③:INSTALL COMPONENT和 UNINSTALL COMPONENT 陈述。

mysql> CREATE TABLE t1 (c1 INT);
mysql> DROP TABLE t1, t2;
ERROR 1051 (42S02): Unknown table 'test.t2'
mysql> SHOW TABLES;
Empty set (0.00 sec)

参照文书档案

  1. 法定文书档案2. wl#9536: support crash safe ddl

正文笔者:zhaiwx_yinfeng

读书原来的作品

正文为云栖社区原创内容,未经同意不得转发。

  存款和储蓄引擎说白了就是什么样存款和储蓄数据、怎么着为存储的多寡创设目录和怎样创新、查询数据等本事的兑现方式。因为在关乎数据库中数据的仓储是以表的款式积攒的,所以存款和储蓄引擎也得以称之为表类型(即存款和储蓄和操作此表的档案的次序)。

④:CREATE SERVER, ALTER SERVER和 DROP SERVER语句。

注意:

InnoDB 是较新的业务安全型存款和储蓄引擎,用于事务管理应用程序,援助BDB的大约全体特性,并负有众多新特点,包罗ACID事务扶助。

 

   由于表现的这种转变,DROP TABLE会在 MySQL 5.7主服务器上的片段成功 语句在MySQL 8.0从服务器上复制时退步。要幸免此故障意况,请在DROP TABLE语句中动用IF EXISTS语法避防止对不设有的表产生错误

特性:

2、原子DDL特性:

3.2、DROP DATABASE:

事务管理机制 
支撑外链 
崩溃后能及时过来 
支撑外键功用,级联删除 
支撑并发才干 
在硬盘上的存款和储蓄格局:InnoBDB frm

①:元数据更新,二进制日志写入和积存引擎操作(如果适用)将统一为单个事务。

   假使全数表都使用原子DDL扶助的积攒引擎,则为atomic。该语句要么成功删除全数目的,要么回滚。不过,从文件系统中删除数据库目录是最终一回,而且不是原子事务的一有的。若是是因为文件系统错误或服务器暂停而形成数据库目录的删除战败, DROP DATABASE则不会回滚事务。

风行版本的Mysql已经安排移除对BDB的支撑,转而尽心竭力发展InnoDB。InnoDB对Mysql有越来越好的特点支持,并且开垦社区活泼。

②:在DDL操作时期,SQL层未有中间提交。

3.3、对于不接纳原子DDL援助的存款和储蓄引擎的表,表删除发生在原子 DROP TABLE或 DROP DATABASE事务之外。那样的表删除被单独写入二进制日志,那在行车制动器踏板DROP TABLE或 DROP DATABASE操作的情况下将储存引擎,数据字典和二进制日志之间的出入限制为最多二个表 。对于删除多少个表的操作,不采取原子DDL协助的仓库储存引擎的表就要实行以前剔除。

  MyISAM 暗中同意的MySQL插件式存款和储蓄引擎,它是基于ISAM类型,但它增添了大多可行的恢弘,它是在Web、数据存款和储蓄和别的应用情况下最常使用的蕴藏引擎之一。注意,通过退换STORAGE_ENGINE配置变量,可以方便地改动MySQL服务器的私下认可存款和储蓄引擎。 
优点:

③:在适用的情状下:

3.4、CREATE TABLE, ALTERAV4 TABLE, RENAME TABLE, TRUNCATE TABLE, CREATE TABLESPACE,和 DROP TABLESPACE对利用原子DDL协理的积累引擎表实施的操作仍然完全交由或只要服务器的操作时停下回滚。在开始时代的MySQL版本中,这几个操作的中断或者会形成存款和储蓄引擎,数据字典和二进制日志之间的差别,或留下孤立文件。RENAME TABLE借使全部命名表都接纳原子DDL支持的蕴藏引擎,则操作只是原子操作。

1.比ISAM表越来越小,所占能源越来越少 
2.足以在分化平台间二进制移植表的花色在创立表时钦定。

    数据字典,程序,事件和UDF高速缓存的状态与DDL操作的状态同样,那象征更新的高峰速缓存以反映DDL操作是打响做到也许回滚。

3.5、DROP VIEW:

    DDL操作中关系的存款和储蓄引擎方法不推行中间提交,並且存储引擎将小编注册为DDL事务的一部分。

 借任务名视图空中楼阁且未进行其余更换,则会倒闭。在此示例中示范了作为改换,在那之中DROP VIEW语句败北,因为命名视图不设有,如下:

    存款和储蓄引擎辅助DDL操作的重做和回滚,那在DDL操作的 Post-DDL阶段执行。

mysql> CREATE VIEW test.viewA AS SELECT * FROM t;
mysql> DROP VIEW test.viewA, test.viewB;
ERROR 1051 (42S02): Unknown table 'test.viewB'
mysql> SHOW FULL TABLES IN test WHERE TABLE_TYPE LIKE 'VIEW';
 ---------------- ------------ 
| Tables_in_test | Table_type |
 ---------------- ------------ 
| viewA   | VIEW  |
 ---------------- ------------ 

④:DDL操作的可知行为是原子的,那会转移有些DDL语句的一举一动

在引进原子DDL以前, 使用DROP VIEW删除视图会报错,不过存在的视图会被成功删除:

 

mysql> CREATE VIEW test.viewA AS SELECT * FROM t;
mysql> DROP VIEW test.viewA, test.viewB;
ERROR 1051 (42S02): Unknown table 'test.viewB'
mysql> SHOW FULL TABLES IN test WHERE TABLE_TYPE LIKE 'VIEW';
Empty set (0.00 sec)

注意:

注意:

  原子或其余DDL语句隐式截至方今对话中居于活动状态的别的业务,就恍如你COMMIT在实施语句以前变成了一直以来。这象征DDL语句无法在另三个职业中,在作业调控语句中实行START TRANSACTION ... COMMIT,只怕与同等业务中的其余语句结合使用。

   由于作为的这种转换,DROP VIEW在MySQL 5.7主服务器上的一部分形成操作在MySQL 8.0从服务器上复制时会退步。要幸免此故障景况,请在DROP VIEW语句中使用IF EXISTS语法以幸免对海市蜃楼的视图产生错误。

 

3.6、不再允许一些实行帐户管理注脚。帐户管理语句对持有命名用户成功或回滚,假若发生错误则不算。在早先时期的MySQL版本中,为多个用户命名的帐户管理语句只怕对某个用户成功,而对其余用户则失利。

3、DDL语句行为的转移

如下:当中第贰个CREATE USE途观语句重临错误但未果,因为它不可能对富有命名用户成功。

3.1、DROP TABLE:

mysql> CREATE USER userA;
mysql> CREATE USER userA, userB;
ERROR 1396 (HY000): Operation CREATE USER failed for 'userA'@'%'
mysql> SELECT User FROM mysql.user WHERE User LIKE 'user%';
 ------- 
| User |
 ------- 
| userA |
 ------- 

 要是具备命名表都使用原子DDL协理的贮存引擎,则操作是完全原子的。该语句要么成功删除全体表,要么回滚。

在引入原子DDL在此之前,第2个 使用CREATE USEKoleos语句创设用户会回到一个不当,可是不设有的用户会中标开创,:

DROP TABLE如若命名表不真实,並且未实行别的更动(无论存款和储蓄引擎怎么样),则会倒闭并出示错误。如下所示:

mysql> CREATE USER userA;
mysql> CREATE USER userA, userB;
ERROR 1396 (HY000): Operation CREATE USER failed for 'userA'@'%'
mysql> SELECT User FROM mysql.user WHERE User LIKE 'user%';
 ------- 
| User |
 ------- 
| userA |
| userB |
 ------- 

 

注意:

mysql> CREATE TABLE t1 (c1 INT);

   由于表现的这种改换,MySQL 5.7主服务器上部分会成功试行,会在MySQL 8.0从服务器上复制时失利。要防止此故障情形,请在开创用户的指令中动用IF EXISTS或 IF NOT EXISTS语法,以免范与命名用户相关的谬误。

mysql> DROP TABLE t1, t2;

4、存款和储蓄引擎协理:近日独有innodb存款和储蓄引擎支持原子DDL

ERROR 1051 (42S02): Unknown table 'test.t2'

   近年来,唯有InnoDB存款和储蓄引擎协助原子DDL。不扶助原子DDL的蕴藏引擎免于DDL原子性。涉及豁免存款和储蓄引擎的DDL操作依然能够引进操作停顿或仅部分成功时只怕爆发的不等同。
   要帮衬重做和回滚DDL操作, InnoDB请将DDL日志写入 mysql.innodb_ddl_log表,该表是驻留在mysql.ibd数据字典表空间中的隐敝数据字典表 。
要mysql.innodb_ddl_log在DDL操作时期查看写入表的DDL日志 ,请启用 innodb_print_ddl_logs 配置选项。

mysql> SHOW TABLES;

注意:

----------------

mysql.innodb_ddl_log无论innodb_flush_log_at_trx_commit 设置有些,对表的 更动的重做日志 都会应声刷新到磁盘 。立刻刷新重做日志能够幸免DDL操作修改数据文件的情形,不过mysql.innodb_澳门新萄京官方网站,ddl_log由这么些操作产生的对表的改变的重做日志 不会长久保存到磁盘。这种场合可能会在回滚或复苏时期变成错误。

| Tables_in_test |

InnoDB存款和储蓄引擎分品级实施DDL操作。DDL操作 ALTER TABLE能够在Commit阶段在此以前一再实践 Prepare和Perform阶段:

----------------

预备:创设所需对象并将DDL日志写入 mysql.innodb_ddl_log表中。DDL日志定义了哪些前滚和回滚DDL操作。
进行:试行DDL操作。比如,为CREATE TABLE操作实行创设例程。
交给:更新数据字典并交给数据字典事务。
Post-DDL:重放并从mysql.innodb_ddl_log表中删除DDL日志。为了有限支撑能够安枕而卧地实施回滚而不引入区别性,在结尾阶段实践文书操作,例如重命名或删除数据文件。这一品级还从删除的动态元数据 mysql.innodb_dynamic_metadata的数额字典表DROP TABLE,TRUNCATE TABLE和该重新建设构造表别的DDL操作。

| t1             |

注意:

----------------

  无论业务是交给依旧回滚, DDL日志都会在Post-DDL阶段重放并从表中删除 。mysql.innodb_ddl_log假诺服务器在DDL操作时期暂停,则DDL日志应仅保留在表中。在这种情状下,DDL日志将在复苏后回看并剔除。

在引进原子DDL此前, DROP TABLE纵然会报错误表不设有,可是存在的表会被实施成功,如下:

  在平复处境下,能够在再次启航服务器时提交或回滚DDL事务。假若在重做日志和二进制日志中存在在DDL操作的交给阶段之间实践的数量字典事务,则 该操作被视为成功还要前滚。不然,在InnoDB重放数据字典重做日志时回滚不完全的数额字典事务 ,并回滚DDL事务。

mysql> CREATE TABLE t1 (c1 INT);

5、查看DDL日志:

mysql> DROP TABLE t1, t2;

   InnoDB将DDL日志写入 mysql.innodb_ddl_log表以支撑重做和回滚DDL操作。该 mysql.innodb_ddl_log表是藏身在mysql.ibd数据字典表空间中的遮盖数据字典表 。与别的遮盖数据字典表同样,mysql.innodb_ddl_log在非调节和测量试验版本的MySQL中无法直接访问该 表。

ERROR 1051 (42S02): Unknown table 'test.t2'

mysql> SHOW TABLES;

Empty set (0.00 sec)

 

注意:

   由于作为的这种转移,DROP TABLE会在 MySQL 5.7主服务器上的一部分变成语句在MySQL 8.0从服务器上复制时退步。要幸免此故障意况,请在DROP TABLE语句中使用IF EXISTS语法防止止对荒诞不经的表爆发错误

 

3.2、DROP DATABASE:

   尽管持有表都使用原子DDL协理的蕴藏引擎,则为atomic。该语句要么成功删除全体指标,要么回滚。然而,从文件系统中除去数据库目录是最后二次,並且不是原子事务的一片段。假若是因为文件系统错误或服务器暂停而导致数据库目录的去除失利, DROP DATABASE则不会回滚事务。

 

3.3、对于不选拔原子DDL援助的存款和储蓄引擎的表,表删除爆发在原子 DROP TABLE或 DROP DATABASE事务之外。那样的表删除被单独写入二进制日志,这在制动踏板DROP TABLE或 DROP DATABASE操作的情景下将积攒引擎,数据字典和二进制日志之间的出入限制为最多二个表 。对于删除多少个表的操作,不选取原子DDL援助的仓储引擎的表就要推行从前删除。

 

3.4、CREATE TABLE, ALTE福睿斯 TABLE, RENAME TABLE, TRUNCATE TABLE, CREATE TABLESPACE,和 DROP TABLESPACE对使用原子DDL帮助的贮存引擎表试行的操作仍然完全交给或只要服务器的操作时停下回滚。在最初的MySQL版本中,这个操作的间歇也许会招致存款和储蓄引擎,数据字典和二进制日志之间的差距,或留下孤立文件。RENAME TABLE要是全数命名表都应用原子DDL扶助的蕴藏引擎,则操作只是原子操作。

 

3.5、DROP VIEW:

 借职务名视图海市蜃楼且未举行其余改换,则会停业。在此示例中示范了作为改动,在那之中DROP VIEW语句失利,因为命名视图不设有,如下:

mysql> CREATE VIEW test.viewA AS SELECT * FROM t;

mysql> DROP VIEW test.viewA, test.viewB;

ERROR 1051 (42S02): Unknown table 'test.viewB'

mysql> SHOW FULL TABLES IN test WHERE TABLE_TYPE LIKE 'VIEW';

---------------- ------------

| Tables_in_test | Table_type |

---------------- ------------

| viewA          | VIEW       |

---------------- ------------

在引进原子DDL在此之前, 使用DROP VIEW删除视图会报错,不过存在的视图会被成功删除:

mysql> CREATE VIEW test.viewA AS SELECT * FROM t;

mysql> DROP VIEW test.viewA, test.viewB;

ERROR 1051 (42S02): Unknown table 'test.viewB'

mysql> SHOW FULL TABLES IN test WHERE TABLE_TYPE LIKE 'VIEW';

Empty set (0.00 sec)

 

注意:

   由于表现的这种调换,DROP VIEW在MySQL 5.7主服务器上的部分造成操作在MySQL 8.0从服务器上复制时会退步。要制止此故障情状,请在DROP VIEW语句中采用IF EXISTS语法以防卫对不设有的视图产生错误。

 

3.6、不再允许一部分进行帐户管理评释。帐户管理语句对富有命名用户成功或回滚,倘使产生错误则不行。在开始的一段时代的MySQL版本中,为多少个用户命名的帐户管理语句恐怕对少数用户成功,而对其余用户则失利。

一般来讲:当中第三个CREATE USE帕杰罗语句重返错误但未果,因为它不可能对具有命名用户成功。

mysql> CREATE USER userA;

mysql> CREATE USER userA, userB;

ERROR 1396 (HY000): Operation CREATE USER failed for 'userA'@'%'

mysql> SELECT User FROM mysql.user WHERE User LIKE 'user%';

-------

| User  |

-------

| userA |

-------

在引进原子DDL以前,第叁个 使用CREATE USE奥迪Q5语句创设用户会回来二个破绽百出,然而空中楼阁的用户会成功创办,:

mysql> CREATE USER userA;

mysql> CREATE USER userA, userB;

ERROR 1396 (HY000): Operation CREATE USER failed for 'userA'@'%'

mysql> SELECT User FROM mysql.user WHERE User LIKE 'user%';

-------

| User  |

-------

| userA |

| userB |

-------

 

注意:

   由于表现的这种改换,MySQL 5.7主服务器上部分会成功进行,会在MySQL 8.0从服务器上复制时退步。要防止此故障处境,请在开创用户的吩咐中选拔IF EXISTS或 IF NOT EXISTS语法,以幸免与命名用户相关的错误。

 

4、存款和储蓄引擎支持:近些日子唯有innodb存款和储蓄引擎辅助原子DDL

   近来,独有InnoDB存款和储蓄引擎支持原子DDL。不补助原子DDL的囤积引擎免于DDL原子性。涉及豁免存款和储蓄引擎的DDL操作依旧能够引入操作停顿或只有的成功时恐怕爆发的不雷同。

   要帮助重做和回滚DDL操作, InnoDB请将DDL日志写入 mysql.innodb_ddl_log表,该表是驻留在mysql.ibd数据字典表空间中的掩饰数据字典表 。

要mysql.innodb_ddl_log在DDL操作时期查看写入表的DDL日志 ,请启用 innodb_print_ddl_logs 配置选项。

 

注意:

mysql.innodb_ddl_log无论innodb_flush_log_at_trx_commit 设置有个别,对表的 改换的重做日志 都会即时刷新到磁盘 。立刻刷新重做日志可以幸免DDL操作修改数据文件的事态,然而mysql.innodb_ddl_log由那一个操作产生的对表的改换的重做日志 不会持久保存到磁盘。这种境况或者会在回滚或恢复生机时期产生错误。

 

InnoDB存款和储蓄引擎分品级执行DDL操作。DDL操作 ALTER TABLE能够在Commit阶段在此之前反复施行 Prepare和Perform阶段:

 

常备不懈:创设所需对象并将DDL日志写入 mysql.innodb_ddl_log表中。DDL日志定义了怎么前滚和回滚DDL操作。

试行:实行DDL操作。譬喻,为CREATE TABLE操作施行创制例程。

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

Post-DDL:回看并从mysql.innodb_ddl_log表中剔除DDL日志。为了保障可以安全地奉行回滚而不引入不相同性,在后期实施文书操作,举例重命名或删除数据文件。这一等第还从删除的动态元数据 mysql.innodb_dynamic_metadata的数量字典表DROP TABLE,TRUNCATE TABLE和该重新创建表别的DDL操作。

 

注意:

  无论专门的学问是付诸照旧回滚, DDL日志都会在Post-DDL阶段回看并从表中删除 。mysql.innodb_ddl_log假如服务器在DDL操作时期暂停,则DDL日志应仅保留在表中。在这种情景下,DDL日志将要还原后重放并剔除。

 

  在回复景况下,能够在重复起动服务器时提交或回滚DDL事务。假若在重做日志和二进制日志中存在在DDL操作的交给阶段之间施行的数据字典事务,则 该操作被视为成功还要前滚。不然,在InnoDB重播数据字典重做日志时回滚不完整的数目字典事务 ,并回滚DDL事务。

 

5、查看DDL日志:

   InnoDB将DDL日志写入 mysql.innodb_ddl_log表以支撑重做和回滚DDL操作。该 mysql.innodb_ddl_log表是暗藏在mysql.ibd数据字典表空间中的遮蔽数据字典表 。与别的隐藏数据字典表一样,mysql.innodb_ddl_log在非调节和测验版本的MySQL中不可能直接待上访谈该 表。

本文由澳门新萄京官方网站发布于数据库网络,转载请注明出处:澳门新萄京官方网站:深入解读MySQL8,table导致的

关键词: