redo log与binlog与undo log

综述

binlog二进制日志是mysql-server层的,主要是作主从复制,时间点恢复使用
redo log重作日志是InnoDB存储引擎层的,用来保证事务安全
undo log回滚日志保存了事务发生以前的数据的一个版本,能够用于回滚,同时能够提供多版本并发控制下的读(MVCC),也即非锁定读mysql

主备数据一致性

为了保证master和slave数据一致性,则binlog和redo log保持一致
不然当binlog写完未fsync,主库crash了,备库却执行了,数据会不一致
binlog是mysql内部实现二阶段提交协调者
为每一个事务分配一个XID
一阶段
事务状态为prepare,redo log和undo log已经记录了对应的日志
二阶段sql

  1. binlog 完成write和fsync后,成功,事务必定提交了,不然回滚
  2. 发送commit,清除undo信息,刷redo,设置事务状态为completed

故障恢复是如何作的

当出现crash等问题,经过扫描binlog中全部的xid,告知innodb,innodb回滚其它事务安全

须要保证binlog写入和redo log事务提交顺序一致性

若是不一致,会致使数据不一致
BLGC(Binary Log Group Commit) 解决串行prepare_commit_mutex的问题
引入队列解决,并发

区别

redo log在事务没有提交前,每个修改操做都会记录变动后的数据,保存的是物理日志->数据
防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重作,从而达到事务的持久性这一特性.
redo log只是先写入Innodb_log_buffer,定时fsync到磁盘spa

binlog只会在日志提交后一次性记录执行过的事务中的sql语句以及其反向sql(做为回滚用),保存的是逻辑日志->执行的sql语句
undo log事务开始以前,将当前版本生成undo log,undo 也会产生 redo 来保证undo log的可靠性,保存的是逻辑日志->数据前一个版本3d

  • 基于redo log直接恢复数据的效率 高于 基于binglog sql语句恢复
  • binlog不是循环使用,在写满或者重启以后,会生成新的binlog文件,redo log是循环使用。
  • binlog能够做为恢复数据使用,主从复制搭建,redo log做为异常宕机或者介质故障后的数据恢复使用。



做者:哓晓的故事
连接:https://www.jianshu.com/p/090087c22820
来源:简书
简书著做权归做者全部,任何形式的转载都请联系做者得到受权并注明出处。日志

相关文章
相关标签/搜索