![必须了解的mysql三大日志-binlog、redo log和undo log](http://img.jiangsulong.com/220421/010HCQ8-0.jpg)
文章插图
mysql支持三种将redo log buffer写入redo log file的时机,可以通过innodb_flush_log_at_trx_commit参数配置,各参数值含义如下:
![必须了解的mysql三大日志-binlog、redo log和undo log](http://img.jiangsulong.com/220421/010HAL0-1.jpg)
文章插图
![必须了解的mysql三大日志-binlog、redo log和undo log](http://img.jiangsulong.com/220421/010H62195-2.jpg)
文章插图
redo log记录形式前面说过,redo log实际上记录数据页的变更,而这种变更记录是没必要全部保存,因此redo log实现上采用了大小固定,循环写入的方式,当写到结尾时,会回到开头循环写日志 。如下图:
![必须了解的mysql三大日志-binlog、redo log和undo log](http://img.jiangsulong.com/220421/010H610L-3.jpg)
文章插图
同时我们很容易得知,在innodb中,既有redo log需要刷盘,还有数据页也需要刷盘,redo log存在的意义主要就是降低对数据页刷盘的要求 。在上图中,write pos表示redo log当前记录的LSN(逻辑序列号)位置,check point表示数据页更改记录刷盘后对应redo log所处的LSN(逻辑序列号)位置 。write pos到check point之间的部分是redo log空着的部分,用于记录新的记录;check point到write pos之间是redo log待落盘的数据页更改记录 。当write pos追上check point时,会先推动check point向前移动,空出位置再记录新的日志 。
启动innodb的时候,不管上次是正常关闭还是异常关闭,总是会进行恢复操作 。因为redo log记录的是数据页的物理变化,因此恢复的时候速度比逻辑日志(如binlog)要快很多 。重启innodb时,首先会检查磁盘中数据页的LSN,如果数据页的LSN小于日志中的LSN,则会从checkpoint开始恢复 。还有一种情况,在宕机前正处于checkpoint的刷盘过程,且数据页的刷盘进度超过了日志页的刷盘进度,此时会出现数据页中记录的LSN大于日志中的LSN,这时超出日志进度的部分将不会重做,因为这本身就表示已经做过的事情,无需再重做 。
redo log与binlog区别
![必须了解的mysql三大日志-binlog、redo log和undo log](http://img.jiangsulong.com/220421/010HB562-4.jpg)
文章插图
由binlog和redo log的区别可知:binlog日志只用于归档,只依靠binlog是没有crash-safe能力的 。但只有redo log也不行,因为redo log是InnoDB特有的,且日志上的记录落盘后会被覆盖掉 。因此需要binlog和redo log二者同时记录,才能保证当数据库发生宕机重启时,数据不会丢失 。
undo log数据库事务四大特性中有一个是原子性,具体来说就是 原子性是指对数据库的一系列操作,要么全部成功,要么全部失败,不可能出现部分成功的情况 。实际上,原子性底层就是通过undo log实现的 。undo log主要记录了数据的逻辑变化,比如一条INSERT语句,对应一条DELETE的undo log,对于每个UPDATE语句,对应一条相反的UPDATE的undo log,这样在发生错误时,就能回滚到事务之前的数据状态 。同时,undo log也是MVCC(多版本并发控制)实现的关键
作者:六点半起床
链接:https://juejin.im/post/6860252224930070536
来源:掘金
【必须了解的mysql三大日志-binlog、redo log和undo log】
推荐阅读
- 揭秘阿里巴巴的客群画像
- 小程序的api是什么
- 面向对象编程OOP的基本概念
- 三国演义中的陆逊是个咋样的人呢
- 康熙八皇子胤禩是怎么死的?
- 我是如何部署日活几十万的单体应用服务的?
- 金屋藏娇的故事是哪一位皇帝有关
- 古代的当铺相当于现在的什么
- Linux操作系统:文件的逻辑组织
- 使用 PDF Mix Tool 执行常见的 PDF 编辑任务