Redo Log 基本原理

发布时间 2023-10-11 00:25:53作者: cs7

MySQL中事务的原子性和持久性是Redo Log实现的,它主要保证事务提交后,要么事务执行操作全部成功,要么全部失败。
 
 
 
 
Redo Log基本概念:重做日志,在InnoDB存储引擎层产生的,保证事务的原子性和持久性(主要记录的是物理日志,磁盘上的一些修改操作,用于恢复物理数据页-- 只能恢复到最后一次提交)。Redo Log通常包含两部分,一部分是内存中的日志缓冲 Redo Log Buffer。另一部分是存放在磁盘上的重做日志文件 Redo Log File。
 
 
Redo Log的基本原理:保证事务的原子性和持久性,一定程度上保证MySQL发生故障的时候,内存中的脏页数据没有写入数据的idb文件,再重启MySQL的时候,可以根据Redo Log来恢复事务提交还没有写入idb文件中的数据。
 
 
Redo Log Buffer写日志到Redo Log File:
 
 
​ 在MySQL的InnoDB存储引擎中,通过提交事务强制执行写日志操作来实现事务的持久化,将日志提交到事务的日志文件中,默认每次将redo log buffer中的日志写入日志文件过程中调用一次OS的fsync()将buffer写入文件中,但是MySQL进程和其占用的内存空间都是工作在操作系统的用户空间当中,所以 log Buffer在OS的用户空间,所以还需要将用户空间的log buffer转入OS的 buffer中。
 
 
​ 这是因为打开日志文件的过程中,没有使用O_DIRECT标志位,如果使用了就可以不经过操作系统内核空间的OS Buffer直接向磁盘写数据,所以MySQL是经过了用户空间和内核空间,通过内核空间才把日志刷到磁盘。
 
 
Redo Log刷盘规则:
 
 
​ 是否刷日志由innodb_flush_log_at_trx_commit值决定
 
 
​ 刷日志的频率由innodb_flush_log_at_timeout值决定,默认为1秒
 
 
​ 当Log Buffer已经使用的内存超过一半的时候,也会触发刷盘操作
 
 
​ 当事务存在checkpoint,checkpoint代表了刷到磁盘时日志所处的LSN的位置。LSN全程为Log Sequence Number,日志逻辑号