title: “redo日志(下)”
createTime: 2022-03-06T15:52:41+08:00
updateTime: 2022-03-06T15:52:41+08:00
draft: false
author: “ggball”
tags: [“mysql”]
categories: [“db”]
description: “”
redo log的刷盘时机
- log buffer 空间不足时(大概一半左右)
- 事务提交时
- 后台线程不停的刷刷刷(大概每秒刷一次)
- 正常关闭服务器时
- 做所谓的 checkpoint
redo日志文件组
磁盘上的 redo 日志文件不只一个,而是以一个 日志文件组 的形式出现的
MySQL 的数据目录(使用 SHOW VARIABLES LIKE ‘datadir’ 查看)下默认有两个名为 ib_logfile0
和ib_logfile1
的文件, log buffer
中的日志默认情况下就是刷新到这两个磁盘文件中。如果我们对默认的redo 日志文件不满意,可以通过下边几个启动参数来调节:
innodb_log_group_home_dir
该参数指定了 redo 日志文件所在的目录,默认值就是当前的数据目录。
innodb_log_file_size
该参数指定了每个 redo 日志文件的大小,在 MySQL 5.7.21 这个版本中的默认值为 48MB
innodb_log_files_in_group
该参数指定 redo 日志文件的个数,默认值为2,最大值为100。
总共的 redo 日志文件大小其实就是: innodb_log_file_size × innodb_log_files_in_group 。
redo日志文件格式
我们前边说过 log buffer 本质上是一片连续的内存空间,被划分成了若干个 512 字节大小的 block 。将logbuffer中的redo日志刷新到磁盘的本质就是把block的镜像写入日志文件中,所以 redo 日志文件其实也是由若干个 512 字节大小的block组成。redo 日志文件组中的每个文件大小都一样,格式也一样,都是由两部分组成:
- 前2048个字节,也就是前4个block是用来存储一些管理信息的。
- 从第2048字节往后是用来存储 log buffer 中的block镜像的。
所以每次一开始写都是重ib_logfile的2048字节处开始写
解释ib_logfile的前4个block
log file header
描述redo日志文件的整体信息。
包括以下属性(有印象就好)
属性名 | 长度(单位:字节) | 描述 |
---|---|---|
LOG_HEADER_FORMAT | 4 | redo 日志的版本,在 MySQL 5.7.21 中该值永远为1 |
LOG_HEADER_START_LSN | 8 | 标记本 redo 日志文件开始的LSN值,也就是文件偏移量为204字节初对应的LSN值(关于什么是LSN我们稍后再看哈,看不懂的先忽略)。 |
LOG_HEADER_CREATOR | 32 | 一个字符串,标记本 redo 日志文件的创建者是谁。正常运行时该值为 MySQL 的版本号,比如: “MySQL 5.7.21” ,使用mysqlbackup 命令创建的 redo 日志文件的该值为 “ibbackup” 和创建时间。 |
LOG_BLOCK_CHECKSUM | 4 | 本block的校验值,所有block都有,我们不关心 |