
以下分两种情况来讨论,如上图所示:
- 如果插入 DDL log 之后,DDL 的各个步骤都成功执行,最后事务trx成功提交,那么innodb_ddl_log并没有该 DDL 的记录,因此在后续的post_ddl中什么也不做(post_ddl 在后面会描述)。
- 如果插入 DDL log 之后,DDL 的某个步骤失败,则 DDL 所在的事务trx会回滚。此时,上图中delete [DELETE SPACE, id=20]这个动作也会回滚。最后,innodb_ddl_log中就会存在DELETE SPACE这条记录,后续执行post_ddl进行 Replay(重演), 从而删除这次失败的create table的 DDL 已经创建的表空间。你可以发现,create table的 DDL 创建表空间,就一定会以这样的机制往innodb_ddl_log中插入一条相反的动作DELETE SPACE的日志记录,所以也被称为反向操作日志。
其它 DDL log 记录的操作如REMOVE CACHE、FREE日志记录的写入也是类似的逻辑。复杂的 DDL,不光是会插入反向操作日志记录,也会插入清理操作日志。比如TRUNCATE表操作会将原有的表空间重命名为一个零时表空间,当 DDL 成功之后,需要通过post_ddlReplay DDL log 记录,将临时表空间删除。如果失败,又需要post_ddl重演 DDL log,执行反向操作,将临时表空间重命名为原来的表空间。如果是反向操作日志,则使用background trx插入并提交,然后使用trx删除;如果是清理日志,则使用trx插入即可。
注意:innodb_ddl_log表与其他 InnoDB 表一样,对该表所有操作 InnoDB 引擎都会产生 Redo 日志与 Undo 记录,所以不要将 DDL log 表中反向操作记录看作 Undo log,这两者不在同一个抽象层次上。而且反向操作在另一个事务中执行,而回滚时,Undo log 则是在原有同一个事务上执行。
需要探讨的几个问题
DDL 是否有必要日志刷盘?
我们知道 MySQL 有一个
innodb_flush_log_at_trx_commit参数,当设置为 0 时,提交时并不会立刻将 Redo log 刷入持久存储中。虽然能提高性能,但在掉电或者停机时会有一定概率丢失已经提交的事务。对于 DML 操作来说,这样仅仅是丢失事务,但对于 DDL 来说,丢失 DDL 的事务,就会导致数据库元数据与其他数据不一致,以至数据库系统无法正常工作。
所以,在trx_commit会根据该事务是否为 DDL 操作,进行特殊处理:
无论
innodb_flush_log_at_trx_commit参数如何设置,与 DDL 有关的事务,提交时必须日志刷盘!
DDL log 的写入时机
在理解了 DDL log 的机制之后,笔者问大家一个问题,对于create table来说,是先执行write_delete_space_log还是先创建表空间呢?
我们先假设是先创建表空间(A 动作),再写反向操作日志(B 动作)。如果 A 执行结束后出现掉的情况,此时 B 还未执行,此时create table动作并没有完成,而innodb_ddl_log不存在DELETE SPACE这样的 DDL 反向日志记录,数据库崩溃恢复后,数据库系统会将系统表数据回滚,但是 A 创建的表空间却没有删除,由于存在中间状态,此时create table就不是原子 DDL 了。
所以,在 DDL 中每个步骤中,先写入该步骤的反向操作日志记录到innodb_ddl_log,再执行该步骤。也就是说 DDL Log 写入时机在执行步骤之前。如果create table已经写入了 DDL log, 但是没有创建表空间就出现掉电情况呢?这并不要紧,在post_ddl做 Replay 的时候,会进行处理。
Replay 的调用逻辑
在 DDL 操作完成之后,无论 DDL 的事务提交还是回滚,都会调用post_ddl函数,post_ddl则会调用replay函数进行 Replay。此外,MySQL 8.0 数据库崩溃恢复过程中,与 MySQL 5.7 相比,也多了ha_post_recover的过程,它会调用log_ddl->recover将innodb_ddl_log所有的日志记录进行 Replay。
在post_ddl调用的是replay_by_thread_id,崩溃恢复中ha_post_recover调用的是replay_all,其逻辑如下描述:
- 依据传入的thread_id为索引(thread_id与trx是可以一一对应的),以逆序方式将所有记录获取出来,然后根据记录的内容,依次执行 Replay 动作,最后删除已经重演的记录。
- replay_all将innodb_ddl_log所有记录逆序方式获取出来,依次执行 Replay 动作,最后删除已经重演的记录。
可以看到,以上两个函数都有将记录逆序的获取的过程,为什么要逆序呢?
逆函数
1、反向操作
我们如果将 DDL 中每个步骤看做一个函数,参数为数据库系统。假设第 i 个步骤函数为,那么 个步骤就是 n 个函数的复合函数:

也即,复合函数的逆时所有步骤逆函数的反向复合。所以反向操作需要将 DDL log 逆序进行处理。
2、清理操作
DDL 的清理动作往往没有顺序要求,逆向操作与正向操作效果往往是一样的,所以统一进行逆序处理也没有问题。
幂等性
与 Redo、Undo 类似,每个类型的日志重演均要考虑其幂等性。
所谓幂等性,就是执行多次和执行一次的效果是一样的。特别是在崩溃恢复的时候,在重演反向操作的时候,尚未完成时发生掉电故障,重新进行崩溃恢复。此时某项重演操作可能发生多次。
因此,MySQL 8.0 实现这些重演操作,必须要考虑幂等性。最典型是重演一些删除操作,必须先判断数据库对象是否存在。如果存在,才进行删除,否则什么都不做。
Tips:说到这里,笔者推荐一本书《具体数学:计算机科学基础》此书讲解了许多计算机科学中用到的数学知识及技巧,并特别著墨于算法分析方面。
Server 层的动作
- DDL 开始更新,无论失败与否,table share 都要进行缓存更新,tdc_remove_table;
- DDL 成功之后,执行事务提交,否则执行事务回滚;
- 无论事务提交还是回滚,都要调用post_ddl,post_ddl作用在前面已经描述,用以r Replay 系统表innodb_ddl_log记录的日志;
- 崩溃恢复时候,除了执行 Redo 日志,回滚未提交的事务之后,还需要执执行ha_post_recover,而 InnoDB 的ha_post_recover就是调用post_ddl执行 DDL 的反向操作;
- binglog 处理只有一个原则,就是 DDL 事务成功。并且提交之后,才调用write_bin_log写 binlog。
注意事项
- MySQL 8.0 支持原子 DDL,并不意味着 DDL 可以通过 SQL 语句命令进行回滚。实际上除了 SQLServer 外,几乎所有的数据库系统不支持 DDL 的 SQL 命令进行回滚,DDL 回滚引入的问题远远多于其带来的好处。
- MySQL 8.0 只承诺单个 DDL 语句的原子性,并不能保证多个 DDL 组合也能保持原子性。某大厂为了实现Truncate table flashback,仅仅在 MySQL 的 Server 层将truncate table动作转换为rename table动作,flashback 的时候将表、索引、约束重新以 RENAME DDL 组合执行来实现 flashback,这个是及其危险的,不保证其原子性。笔者也完成过此功能,并没有如此取巧,而是老老实实的从 Server 层、InnoDB 存储引擎、binlog 各方面进行改造,完整保证其原子性。
- MySQL 8.0 用这种方法实现原子 DDL,并不意味着其它数据库也是这种方式实现原子 DDL。
派优网部分新闻资讯、展示的图片素材等内容均为用户自发上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习交流。用户通过本站上传、发布任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请
联系我们一经核实,立即删除。并对发布账号进行封禁。
相关推荐
-
哪里小米质量好?牢记4个产地,营养价值高,煮粥香糯粘稠米油厚 大家好,感谢阅读我分享的文章,这次我要和大家说的是:『哪里小米质量好?牢记4个产地,营养价值高,煮粥香糯粘稠米油厚!』…
-
一个表哥,注册了个个体户,想让我给代账,我没提钱的事,说实在的,他说业务不多,我代账经验少,打算半年内不要钱,以后再说,但我哥说,他办完个体户,给他打电话的代账会计挺多的,一个月2…
-
安装步骤: 1.鼠标右击软件压缩包,选择“解压到 Origin 2018” 2.打开“Origin 2018Origin2018”文件夹,鼠标右击“setup”,选择“以管理员身份…
-
随着网络的发展,手机购买渠道越来越多,林子大了什么鸟都有,有一部分人买了手机以后,使用了一段时间,发现手机有问题,踩雷最多的就是苹果手机,因为苹果手机保值率高,更新慢,系统流畅,所…
-
在某些情况下需要在微信群里提醒群成员共同完成某项事情。有什么方法可以进行群通知呢?下边介绍3种不同的通知方法,适用于不同的场景。 演示环境:小米11,MIUI13,微信8.0.23…
-
40左右岁的女人,正处于职场的黄金阶段,经验丰富,自信成熟,但在穿搭上也需要更多的技巧和灵感,才能更好地展现自己的魅力和风采。下面,就为大家分享几个优雅大方的职场穿搭技巧,让你在工…
-
网上购物已是一种趋势,越来越多的年轻人甚至是中老年人都爱上了网购。网购足不出户就能挑选心仪好物,且不受时间限制,商品种类齐全,是购买好物的不二选择。 目前,各类网购APP也是层出不…
-
天猫盒子,作为阿里巴巴集团旗下的智能硬件产品,为用户提供了丰富的多媒体娱乐体验。本文将详细介绍天猫盒子的定义、功能以及是否存在额外收费情况,以帮助用户更好地了解这一产品。 一、天猫…
-
在当前的电商环境下,天猫店铺作为品牌商家的首选平台,其价值日益凸显。然而,对于许多新手商家而言,开设一家全新的天猫店铺并非易事。因此,天猫店转让成为了一个热门的市场需求。那么,在天…
-
以标题压分可以上的二本院校,哪些学校可以报考?二本院校录取标准详解为中心,按照下面的要求写一篇800汉字左右的文章! 随着高考成绩的公布,许多考生开始关注自己能够报考哪些大学。对于…