redo
日志文件由若干个日志文件组成,这些redo
日志文件是被循环使用的。redo
日志文件组中每个文件的大小都一样,格式也一样,都是由两部分组成:
- 前2048个字节(也就是前4个
block
)用来存储一些管理信息。 - 从第2048个字节往后的字节用来存储
log buffer
中block
的镜像。
lsn
指已经写入的redo
日志量,flushed_to_disk_lsn
指刷新到磁盘中的``redo````日志量,flush
链表中的脏页按照修改发生的时间顺序进行排序,也就是按照oldest_modification
代表的lsn
值进行排序。被多次更新的页面不会重复插入到flush
链表中,但是会更新newest_modification
属性的值,checkpoint_lsn
表示系统中可以被 覆盖的redo
日志总量是多少。
redo
日志占用磁盘空间在它对应的脏页已经被刷新到磁盘后即可被覆盖。执行一次checkpoint
的意思就是增加checkpoint_lsn
的值,然后把相关的信息存放到日志文件的管理信息中。
innodb_flush_log_at_trx_commit
系统变量控制着在事务提交时是否将该事务运行过程中产生的redo
刷新到磁盘。该变量有3个可选值:
- 0:表示在事务提交时不立即向磁盘同步
redo
日志,这个任务交给后台线程来处理,这样会明显加快请求处理速度。 - 1:表示在事务提交时需要将
redo
日志同步到磁盘,这可以保证事务的持久性。innodb_flush_log_at_trx_commit
的默认值是1。 - 2:表示在事务提交时需要将
redo
日志写到操作系统的缓冲区中,但并不需要保证将日志真正地刷新到磁盘。
在奔溃恢复过程中,从redo
日志文件中第一个文件的管理信息中取出最近发生的那次checkpoint
信息,然后从checkpoint_lsn
在日志文件组中对应的偏移量开始,一直扫描日志文件中的block
,直到某个LOG_BLOCK_HDR_DATA_LEN
值不等于512为止,在恢复过程中,使用哈希表可加快恢复过程,并且会跳过已经刷新到磁盘的页面。