一,undo_log redo_log bin_log | 小册免费学

258 阅读3分钟

一句话描述:

redo_log:重做日志,针对数据页的物理修改,保证事务持久性

undo_log:回滚日志,针对记录行的逻辑日志,保证事务原子性

bin_log: 二进制日志,不同于重做日志,bin log 运行在server层。

redo log

redo log是InnoDB存储引擎层(这代表他运行在server层之上)的日志,用于记录事务操作的变化,记录的是数据修改之后的值,不管事务是否提交都会记录下来。在实例和介质失败(media failure)时,redo log文件就能派上用场,如数据库掉电,InnoDB存储引擎会使用redo log恢复到掉电前的时刻,以此来保证数据的完整性。

在一条更新语句进行执行的时候,InnoDB引擎会把更新记录写到redo log日志中,然后更新内存,此时算是语句执行完了,然后在空闲的时候或者是按照设定的更新策略将redo log中的内容更新到磁盘中。先写日志,再写磁盘

循环链表

redo log日志的缓存本质上是一个循环链表,维护读写两个指针,指针相遇时表示缓冲区慢了,这个时候数据库停止更新语句的执行,转而将redo log日志同步到磁盘中。

undo log

保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读。之后会写文章介。MVCC.

undo log 和 redo log 区别

undo log不是redo log的逆向过程,其实它们都算是用来恢复的日志:

  1. redo log通常是物理日志,记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎样,它用来恢复提交后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位置)。
  2. undo用来回滚行记录到某个版本。undo log一般是逻辑日志,根据每行记录进行记录。

bin log

binlog是属于MySQL Server层面的,又称为归档日志,属于逻辑日志,是以二进制的形式记录的是这个语句的原始逻辑,依靠binlog是没有crash-safe能力的

crash-safe:数据库在任意时间崩溃,重启后之前提交的记录都不会丢失

bin log 和 redo log区别

  • redo log是属于innoDB层面,binlog属于MySQL Server层面的,这样在数据库用别的存储引擎时可以达到一致性的要求。
  • redo log是物理日志,记录该数据页更新的内容;binlog是逻辑日志,记录的是这个更新语句的原始逻辑
  • redo log是循环写,日志空间大小固定;binlog是追加写,是指一份写到一定大小的时候会更换下一个文件,不会覆盖。
  • binlog可以作为恢复数据使用,主从复制搭建,redo log作为异常宕机或者介质故障后的数据恢复使用。

文章末尾请带上以下文字及链接:本文正在参与「掘金小册免费学啦!」活动, 点击查看活动详情