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_logfile0,iblogfile1… 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
可以简单理解 SLN 就是记录从开始到现在已经产生了多少字节的 redo log 值,可以当作 redo log 写入点。
redo log 相关补充
redo log block
redo log block 共有 512 字节,头部 12 个字节+身体 496 字节+尾部 4 字节。并行的事务交替的写入 redo log block 中。