redo log block 和日志缓冲区
InnoDB 为了更好的进行系统崩溃恢复,把通过 Mini-Transaction 生成的 redo日志都放在了大小为 512 **字节的块(block)中。
我们前边说过,为了解决磁盘速度过慢的问题而引入了 Buffer Pool。同理, 写入 redo 日志时也不能直接直接写到磁盘上,实际上在服务器启动时就向操作系统申请了一大片称之为 **redo log buffer 的连续内存空间,翻译成中文就是 redo 日志缓冲区,我们也可以简称为 log buffer。这片内存空间被划分成若干个连续的redo log block,我们可以通过启动参数 innodb_log_buffer_size 来指定log buffer的大小,该启动参数的默认值为 16MB。
向 log buffer 中写入 redo 日志的过程是顺序的,也就是先往前边的 **block 中写,当该 block 的空闲空间用完之后再往下一个 block 中写**。
我们前边说过一个 Mini-Transaction 执行过程中可能产生若干条 redo 日志, 这些 redo 日志是一个不可分割的组,所以其实并不是每生成一条 redo 日志,就将其插入到 log buffer 中,而是每个 Mini-Transaction 运行过程中产生的日志先暂时存到一个地方,当该 Mini-Transaction 结束的时候,将过程中产生的一组 redo日志再全部复制到 log buffer 中。
redo 日志文件组
磁盘上的 redo 日志文件可以不只一个,而是以一个日志文件组的形式出现的。这些文件以 ib_logfile[数字](数字可以是 0、1、2…)的形式进行命名。在将 redo 日志写入日志文件组时,是从 ib_logfile0 开始写,如果 ib_logfile0 写满了,就接着 ib_logfile1 写,同理,ib_logfile1 写满了就去写 ib_logfile2,依此类推。如果写到最后一个文件,那就重新转到 ib_logfile0 继续写
redo 日志文件格式
前边说过 log buffer 本质上是一片连续的内存空间,被划分成了若干个512 字节大小的block。将 log buffer 中的redo 日志刷新到磁盘的本质就是把block 的镜像写入日志文件中,所以 redo 日志文件其实也是由若干个 512 字节大小的block 组成。
redo 日志文件组中的每个文件大小都一样,格式也一样,都是由两部分组成:前 2048 个字节,也就是前 4 个 block 是用来存储一些管理信息的。
从第 2048 字节往后是用来存储 log buffer 中的 block 镜像的。