MySQL两大日志模块——redo log(重做日志)和 binlog(归档日志)

前言

在MySQL数据库的使用中,肯定会遇到需要数据恢复到之前的某一时刻的需求,也会遇到数据库异常重启的情况,MySQL都是怎么解决这些问题的呢?

这就需要依赖MySQL的redo log和binlog这两个重要的日志模块了,接下来分别说明这两个模块的作用。

重做日志 redo log

MySQL在做数据更新操作时,如果每次都需要写进磁盘的话,那么需要到磁盘中找到对应的那条记录,然后更新,这样下来,IO成本和查找成本都很高。为了解决这个问题,MySQL用到了WAL(Write-Ahead Logging)技术,它的关键点在于先写日志,再写磁盘,这就用到了redo log。

具体的来说,当有一条记录需要更新的时候,InnoDB引擎先会把记录写到redo log里面,并更新内存,这个时候更新就算完成了。等到系统比较空闲的时候,InnoDB引擎会把这个记录更新到磁盘中。

InnoDB的redo log是固定大小的,可以配置为一组4个文件,每个文件1GB大小,那么总共就可以记录4GB的操作,当写满的时候,会淘汰掉当前最老的记录以得到空闲空间。

redo log是InnoDB引擎特有的日志,可以保证即使数据库发生异常重启,之前提交过的记录也不会丢失,这个能力称为crash-safe

归档日志 binlog

redo log是InnoDB引擎特有的日志,所以它属于引擎层,而Server层也有自己的日志,称为归档日志 binlog。

binlog会记录所有的逻辑操作,并且是采用追加写的形式。主要用于数据库恢复到某一个时刻,当然这样的前提是有这段时间的binlog。

两者区别

  1. redo log是InnoDB引擎特有的;binlog是MySQL的Server层实现的,所有引擎都可以使用。
  2. redo log是物理日志,记录在某个数据页做了什么修改;binlog是逻辑日志,记录这个语句的原始逻辑。
  3. redo log是循环写,空间固定会用完;binlog是可以追加写入的,并不会覆盖以前的日志。

你可能感兴趣的:(MySQL)