redo log

redo log,即重做日志,是innodb引擎独有的,主要用于崩溃恢复(crash safe)

Write-Ahead Logging(WAL)

Write-Ahead-Logging,即先写日志,也就是说我们执行一个操作的时候会先将操作写入日志, 然后再写入数据磁盘.
假设我们所需要的数据是分散在不同页的不同扇区中,那么我们去找数据的时候是随机IO操作,而redo log是循环写入的,也就是顺序IO。一句话:
刷盘是随机IO,而记录日志是顺序IO,顺序IO效率高,因此先把修改写入日志,可以延迟刷盘时机,进而提升系统的吞吐
**

redo log是如何刷盘的

Innodb中的redo log是固定大小的,也就是说redo log不会因为文件写入而变大,而是一开始就分配好空间,空间一旦被写满,前面的空间就会被覆盖掉,刷盘的操作是通过check point实现的。如下图:
image.png
check point是当前覆盖的位置,write pos是当前写入的位置。写日志的时候是循环写的,覆盖旧记录前需要把记录更新到数据文件。如果wirte pos和check point重叠,表明redo log已经写满,这时候需要同步redo log刷到磁盘中。

bin log

mysql server层有属于自己的日志,称为bin log(归档日志),也叫做二进制日志。
为什么会有两个日志?
因为一开始的时候,没有innodb引擎,mysql自带的是MyISAM引擎,但是该引擎不支持事务,也没有崩溃恢复的能力,bin log日志只能用于归档。所以就引入了Innodb引擎。

总结bin log和redo log的区别

1、 redo log是Innodb引擎特有的,bin log是mysql server层实现的,所有引擎共有
2、redo log是物理日志,记录的是“在某个数据页上,做了什么修改”;bin log是逻辑日志,记录的是这个语句的原始逻辑,比如“给id=2 这一行的c字段加 1 ”。
3、redo log是循环写入的,空间会固定用完;bin log是可以追加写入的,指文件写到特定大小,会切换到下一个文件写,并不会覆盖之前的日志。