redo log 和 bin log的区别
-
适用对象不同
bin log 是MySQL的Server层实现的,所有引擎都是可以使用的
redo log 是InnoDB引擎特有的
-
写入的内容不同
bin log 是逻辑日志,记录的是这个语句的原始逻辑,比如 “给 id=1 这一行的 age 字段加1”
redo log 是物理日志,记录的是 “在某个数据页上做了什么修改“
什么是二阶段提交
二阶段提交,其实就是把 redo log 的写入拆分成两个步骤 :prepare 和 commit
所以为什么要这样设计呢?这样的设计怎么就能够实现崩溃恢复呢?
- 如果redo log里面的事务时完整的,也就是已经有了commit标识,则直接提交
- 如果redo log里面的事务处于prepare状态,则需要判断对应的事务在bin log是否存在并完整
- 如果bin log存在并完整,则提交事务
- 如果bin log不完整,则回滚事务
这样我们就保证了主从一致
此时我们的整体架构就变成了
思考
-
二阶段的提交时必要的吗?可不可以redo log先写完(commit),再写binlog?
假设在redo log写完,bin log还没写完的时候,MySQL崩溃,然而主库中的数据确实已经被修改了,但这时候bin log里面并没有记录这个语句,因此,从库同步的时候就会丢失这个数据,导致出现了主从不一致的情况
-
二阶段的提交时必要的吗?可不可以bin log先写完,再写redo log(开始写)?
如果在bin log写完,redo log还没写的时候,MySQL崩溃,因为bin log已经写入成功了,这样之后就会被从库同步过去,实际上redo log还没写,主库并没有完成这个操作,所以从库相比主库就会多执行了一个事务,导致主从不一致的情况