Redolog 概念

redo log(重做日志)是  InnoDB  存储引擎独有的,属于物理日志。当  MySQL  实例挂了或宕机了,重启时,InnoDB  存储引擎会使用  redo log  恢复数据。

MySQL  中数据是以页为单位,你查询一条记录,会从硬盘把一页的数据加载出来,加载出来的数据叫数据页,会放入到  Buffer Pool  中。

后续的查询都是先从  Buffer Pool  中找,没有命中再去硬盘加载,减少硬盘  IO  开销,提升性能。

更新表数据的时候,也是如此,发现  Buffer Pool  里存在要更新的数据,就直接在  Buffer Pool  里更新;没有则从磁盘中将对应数据加载到  Buffer Pool  中。

然后会把“在某个数据页上做了什么修改”记录到重做日志缓存(redo log buffer)里,接着刷盘到  redo log  文件里。

小贴士:每条 redo 记录由“表空间号+数据页号+偏移量+修改数据长度+具体修改的数据”组成。

Redolog 背景

实际上,数据页大小是  16KB,刷盘比较耗时,可能就修改了数据页里的几  Byte  数据,有必要把完整的数据页刷盘吗?

而且数据页刷盘是随机写,因为一个数据页对应的位置可能在硬盘文件的随机位置,所以性能是很差。

如果是写  redo log,一行记录可能就占几十  Byte,只包含表空间号、数据页号、磁盘文件偏移量、更新值,再加上是顺序写,所以刷盘速度很快。

总结:将脏数据的随机写变成了顺序写。

Redolog 作用

  • 前滚操作:具备  crash-safe  能力,提供断电重启时解决事务丢失数据问题。
  • 提高性能:先写 redo log 记录更新。当等到有空闲线程、内存不足、redo log 满了时  刷脏。写 redo log 是顺序写入,刷脏是随机写,节省的是随机写磁盘的 IO 消耗(转成顺序写),所以性能得到提升。此技术称为 WAL 技术:Write-Ahead Logging,它的关键点就是先写日记磁盘,再写数据磁盘。

Redolog 刷盘时机

具体参见: Redolog 刷盘时机

Redolog 两阶段提交

具体参见: MySQL redolog 两阶段提交与容灾恢复

Redolog 磁盘存储形式

Redolog 在磁盘中通过日志文件组的形式存储,具体参考 Redolog 日志文件组

每条 redo 记录由“表空间号+数据页号+偏移量+修改数据长度+具体修改的数据”组成

Redolog 检查点

为了将 Redolog 数据 flush 到数据文件中,Redolog 检查点 用于标记当前数据正常的 point。

Redolog 组提交

具体参见: Redolog 组提交

Redolog 配置

innodb_log_group_home_dir :指定 redo log 文件组所在的路径,默认值为  ./ ,表示在数据库的数据目录下。MySQL 的默认数据目录( var/lib/mysql)下默认有两个名为  ib_logfile0  和  ib_logfile1  的文件,log buffer 中的日志默认情况下就是刷新到这两个磁盘文件中。此 redo 日志文件位置还可以修改。

innodb_log_files_in_group :指明 redo log file 的个数,命名方式如:ib_logfile0iblogfile1… iblogfilen。默认 2 个,最大 100 个。

innodb_flush_log_at_trx_commit:控制 redo log 刷新到磁盘的策略,默认为 1。

innodb_log_file_size :单个 redo log 文件设置大小,默认值为 48M 。最大值为 512G,注意最大值指的是整个 redo log 系列文件之和,即(innodb_log_files_in_group * innodb_log_file_size )不能大于最大值 512G。

Redolog LSN

面试官的灵魂一击:你懂 MySQL 事务日志吗? - 简书

可以简单理解 SLN 就是记录从开始到现在已经产生了多少字节的 redo log 值,可以当作 redo log 写入点。

redo log 相关补充

redo log block

redo log block 共有 512 字节,头部 12 个字节+身体 496 字节+尾部 4 字节。并行的事务交替的写入 redo log block 中。