MySQL实战45讲 第十五讲笔记

两阶段提交

两阶段提交的不同时刻,mysql异常重启会出现什么现象?

写入内存->写入redo log处于prepare阶段-(A时刻)>写binlog-(B时刻)>提交事务,处于commit状态

  • A时刻,写binlog之前发生崩溃,redo log未提交,这时候binlog还没写,所以崩溃回复的时候不会存在
  • B时刻,redo log还没commit,mysql的处理方式
  1. 如果 redo log 里面的事务是完整的,也就是已经有了 commit 标识,则直接提交;
  2. 如果 redo log 里面的事务只有完整的 prepare,则判断对应的事务 binlog 是否存在并完整:
    a. 如果是,则提交事务;
    b. 否则,回滚事务
    崩溃恢复时,扫描redo log 如果prepare+commit直接提交,如果是只有prepare的,就去找binlog.

binlog完整判断

一个事务的 binlog 是有完整格式的:

statement 格式的 binlog,最后会有 COMMIT;
row 格式的 binlog,最后会有一个 XID event。

另外,在 MySQL 5.6.2 版本以后,还引入了 binlog-checksum 参数,用来验证 binlog
内容的正确性。对于 binlog 日志由于磁盘原因,可能会在日志中间出错的情况,MySQL
可以通过校验 checksum 的结果来发现。所以,MySQL 还是有办法验证事务 binlog 的
完整性的。

binlog和redo log关联

共同字段XID关联两种日志.

两阶段提交

两阶段提交是经典的分布式系统问题,并不是mysql独有的.

binlog

binlog并没有记录数据页的更新细节,所以无法替代redo log.
redo log事实上就是binlog优化的结果.

redo log

循环写,无法代替binlog归档的功能.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、日志相关问题: 1、在两阶段提交的不同瞬间,MySQL如果发生异常重启,是怎么保证数据完整性的?   如果在写...
    墨殇染泪阅读 456评论 0 2
  • 之前我们了解了一条查询语句的执行流程,并介绍了执行过程中涉及的处理模块。一条查询语句的执行过程一般是经过连接器、分...
    武培轩阅读 699评论 1 7
  • 2、一条SQL更新语句是如何执行的? 连接器 - 分析器 - 优化器 - 执行器 redo log(异常重启...
    技术灭霸阅读 1,152评论 0 0
  • 怪这月色太迷人 扰乱了心绪 记忆本能的触礁在这座岛屿 中断了这月色演绎的奏鸣曲 吹打海浪的风说把它忘记吧 像忘掉今...
    哎呦笨蓝孩阅读 340评论 1 7
  • 上午和春霞相约去了新城区和盛广场。中午在在大集上采买了做馄饨的食材,邀请春霞海燕来家吃馄饨。还有宝儿子,四个...
    艾阳光的味道阅读 192评论 0 0