4、redo log(重做日志)
2021-10-16 16:36:13 1 举报
重做日志(redo log)是数据库系统中用于记录事务对数据的修改操作的一种特殊类型的日志。它的主要作用是在系统崩溃或故障时,通过重做日志中的信息来恢复未提交的事务,确保数据的一致性和完整性。重做日志通常存储在磁盘上,以便于在系统重启后进行恢复操作。与undo log(撤销日志)不同,重做日志主要用于保证事务的持久性,而撤销日志则用于在事务回滚时撤消之前的操作。总之,重做日志是数据库系统中关键的持久化机制之一,对于保障数据安全和系统稳定性具有重要意义。
作者其他创作
大纲/内容
2字节
body(块体)
工作线程
redo log block
block no
trailer
body
具体修改的数据
512字节
4字节
块唯一编号
redo log日志文件
......
header
将redo log写入redo log block
496字节
修改数据长度
innodb_log_buffer_sizeredo log buffer默认:16MB
依次在redo log日志文件的末尾追加写redo log block数据
日志类型
redo log
表空间号
ib_logfile0
每个事务都会有多个redo log(redo log group,即一组redo log)那么在block里的第一组redo log的偏移量,就是这2个字节存储
查看redo log日志文件存放目录:show variables like 'datadir'通过 innodb_log_group_home_dir 参数设置目录通过innodb_log_file_size可以指定每个redo log文件的大小,默认48MB通过innodb_log_files_in_group可以指定日志文件的数量,默认2个默认情况下,目录里两个日志文件,分别为ib_logfile0和ib_logfile1redo log文件循环写入
数据页号
比如配置为一组 4 个文件,每个文件的大小是 1GBwrite pos 是当前记录的位置,一边写一边后移,写到第 3 号文件末尾后就回到 0 号文件开头。checkpoint 是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件。write pos 和 checkpoint 之间的redo log上还空着的部分,可以用来记录新的操作。如果 write pos 追上 checkpoint(也就是新记录即将覆盖老记录的时刻),会推动check point向前移动,也就是催促其将记录刷到磁盘中,这样好空出位置给新记录有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为 crash-safe。
first record group
按照配置在OS中申请一块连续内存空间然后划分出了N多个空的redo log block
WAL(Write-Ahead Logging),它的关键点就是先写日志,再写磁盘。具体来说,当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log里面,并更新内存,这个时候更新就算完成了。同时,InnoDB 引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做。
block里写入了多少字节数据
数据库启动
header(块头)
1、redo log不是单行单行的写入日志文件,而是用redo log block来存放多个单行日志2、一个block最多存放496字节的redo log日志3、每个事务会有多个增删改操作,就会有多个redo log,这多个redo log就是一组redo log (每次一组redo log都是先在别的地方暂存,都执行完之后再把一组redo log写入到redo log buffer的block中)4、若一组redo log太多,就可能会存放在多个redo log block中,反之,若一个redo log group比较小,那么可能多个redo log group在一个redo log block中
12字节
ib_logfile1
MLOG_1BYTE:修改了1个字节的值MLOG_2BYTE:修改了2个字节的值MLOG_4BYTE:修改了4个字节的值MLOG_8BYTE:修改了8个字节的值MLOG_WRITE_STRING:修改了一大串的值(和“修改数据长度”配合使用)
trailer(块尾)
checkpoint on
redo log buffer
data length
数据页的偏移量
checkpoint是为了定期将buffer的内容刷新到data file。当遇到内存不足、db buffer已满等情况时,需要将db buffer中的内容/部分内容(特别是脏数据)转储到data file中。在转储时,会记录checkpoint发生的”时刻“。在故障回复时候,只需要redo/undo最近的一次checkpoint之后的操作
0 条评论
回复 删除
下一页