9.MySQL --- redo bin 二阶段提交

redo log 和 bin log的区别

  • 适用对象不同

    bin log 是MySQL的Server层实现的,所有引擎都是可以使用的

    redo log 是InnoDB引擎特有的

  • 写入的内容不同

    bin log 是逻辑日志,记录的是这个语句的原始逻辑,比如 “给 id=1 这一行的 age 字段加1”

    redo log 是物理日志,记录的是 “在某个数据页上做了什么修改“

什么是二阶段提交

二阶段提交,其实就是把 redo log 的写入拆分成两个步骤 :prepare 和 commit

所以为什么要这样设计呢?这样的设计怎么就能够实现崩溃恢复呢?

  1. 如果redo log里面的事务时完整的,也就是已经有了commit标识,则直接提交
  2. 如果redo log里面的事务处于prepare状态,则需要判断对应的事务在bin log是否存在并完整
    • 如果bin log存在并完整,则提交事务
    • 如果bin log不完整,则回滚事务

这样我们就保证了主从一致

此时我们的整体架构就变成了
在这里插入图片描述

思考

  1. 二阶段的提交时必要的吗?可不可以redo log先写完(commit),再写binlog?

    假设在redo log写完,bin log还没写完的时候,MySQL崩溃,然而主库中的数据确实已经被修改了,但这时候bin log里面并没有记录这个语句,因此,从库同步的时候就会丢失这个数据,导致出现了主从不一致的情况
    在这里插入图片描述

  2. 二阶段的提交时必要的吗?可不可以bin log先写完,再写redo log(开始写)?

如果在bin log写完,redo log还没写的时候,MySQL崩溃,因为bin log已经写入成功了,这样之后就会被从库同步过去,实际上redo log还没写,主库并没有完成这个操作,所以从库相比主库就会多执行了一个事务,导致主从不一致的情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值