Redo log

redo,重做,目的是恢复数据库的操作,在发生意外时进行重新操作,保证数据安全。

Redo Log

重做日志,事务中修改的任何数据,都会存储到日志中,包含表空间id、插入的记录所在的页号、insert的具体数据等。

Redo Log 工作原理

当数据库启动时,会根据checkpoint来判断哪些数据是需要恢复的。进行数据恢复时,innodb将从LOG_CHECKPOINT_LSN所指向的redo文件位置开始进行数据恢复。

图一 lsn

其中,checkpoint_page = redo_lsn - checkpoint_lsn,指已经记录到redo log但是还未将数据刷新到磁盘的部分。除了checkpoint_page,还有async_water_mark以及sync_water_mark。

checkpoint_page = redo_lsn - checkpoint_lsn
async_water_mark = 75% * total_redo_log_file_size
sync_water_mark = 90% * total_redo_log_file_size

若每个重做日志文件的大小为1GB,并且定义了两个重做的日子文件,则重做日志文件的总大小为2GB。

async_water_mark =1.5GB
sync_water_mark =1.8GB

当checkpoint_age < async_water_mark,则不需要刷新任何脏页到磁盘;当checkpoint_age > async_water_mark 且 checkpoint_age < sync_water_mark,则触发异步刷盘,从flush列表中刷新足够的脏页回磁盘,直到满足checkpoint_age < async_water_mark;当checkpoint_age > sync_water_mark时,触发sync flush操作,从flush列表中刷新足够多的脏页会磁盘,直到满足checkpoint_age<async_water_mark。

Redo Log 写入机制

Redo Log 文件内容是以顺序循环的方式写入文件,写满时则回溯到第一个文件,进行覆盖写。write pos 和 checkpoint 之间还空着的部分,可以用来记录新的操作。如果 write pos 追上checkpoint,表示写满,这时候不能再执行新的更新,得停下来先擦掉一些记录,把checkpoint 推进一下。

图2 更新流程

节点1,如果服务器异常关闭发生在节点1以及之前的节点,这个时候redo log和bin log都没有任何记录,事务还未提交,不会造成任何影响

节点2,服务器启动时发现redo log有处于prepare状态的记录,而这时bin log还未包含事务变更,则丢弃本次更改。

节点3,服务器启动时发现redo log有处于prepare状态的记录,而这时bin log包含事务变更,则进行事务提交。

节点4,bin log中和数据库中均含有此事务的变更,没有任何影响。

Redo Log相关配置参数

innodb_log_file_size 表示每个redo log file的大小,单位为字节。

innodb_log_files_in_group 表示每个重做日志组中redo log file的数量。

innodb_log_group_home_dir 表示重做日志组文件所在路径,默认情况下为/var/lib/mysql,此目录中的ib_logfile0与ib_logfile1即为日志组中的两个重做日志。

innodb_mirrored_log_groups 表示一共有几组日志组,如果此值为1,表示没有冗余的日志组。大于等于2,表示有冗余的镜像日志组。如果设备没有做冗余,可以将此值设为大于等于2。

innodb_flush_log_at_trx_commit 表示当事务提交以后,是否立即将redo log从内存(log buffer)刷写到redo log file中。

如果此值设置为1(默认值),表示事务提交时必须将redo log从log buffer中刷写到redologfile(磁盘)中,过程为:事务提交--log buffer--os buffer--log file,此值为1时完全满足ACID的要求。
如果此值设置为0,事务提交时并不会将redo log从log buffer刷写到redo log file,但是会在每秒钟自动刷写一次,也就是说每一秒钟都自动将内存中的redo log刷写到redo log file(磁盘)中,可以理解为,当事务提交时,redo log存在于log buffer中,每秒钟,log从log buffer中经过os buffer,刷写到log file中一次,当此值设置为0时,如果mysql数据库崩溃,最多会丢失1秒钟的redo log。
如果此值设置为2,表示在事务提交时,只会将redo log写入到文件系统内存(os buffer)中,但是不会立即写入到redo log file(磁盘)中,而是每秒钟从文件系统缓存中将数据刷写至redo log file(磁盘)中一次,可以理解为,当事务提交时,redo log存在于log buffer和os buffer中,每秒钟,log从os buffer中刷写到log file中一次,此值为2时,如果只是mysql数据库宕机,但是操作系统没有宕机,则数据不会丢失,如果此时操作系统宕机,重启数据库后,则会丢失未从文件系统内存刷写到redo log file中的那部分事务(约1秒钟的数据),因为只有mysql宕机而操作系统没有宕机时,并不会丢失数据,所以可靠性 比此值设置为0时要高一些。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值