持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情
Redo log 的三种刷盘策略
前言
在讲述Redo log的三种刷盘策略之前,我们需要先回顾一下以下内容:
在要对数据进行更新的时候,MySQL首先是将磁盘中的数据页加载到buffer· pool中的缓存页中,而SQL对数据的修改就是对buff pool中数据的更改;
当然,在更改之前需要将原数据值写进undo log 日志中,同时还需要写进 Redo log buffer 中的redo log中;但是因为此时的 redo log 是在内存中的,存在丢失的风险,因此我们需要将其持久化到redo log 日志文件中(刷盘)
三种刷盘策略
redo log究竟采用什么策略来进行刷盘,取决于 innodb_flush_log_at_trx_commit 的配置(取值)。
下面我们就来详细说说,这三种策略的采用,会有什么影响。
1.提交事务时,不刷盘
当 innodb_flush_log_at_trx_commit = 0时,就算提交当前事务,也是不会把 redo log buffer里的数据刷盘的。
在这种情况下,数据丢失是相当严重的,哪怕你是提交了事务,但是假如此时MySQL宕机了,则内存里的数据全部都会丢失。
所以这种情况,一般不可取!
2.提交事务时,必须刷盘
当innodb_flush_log_at_trx_commit = 1时,在提交当前事务的时候,MySQL就会将redo log buffer里的数据刷盘的。
在这种情况下,只要你的事务是已经提交了的,那数据就不会丢失;因为事务提交时,redo log就已经持久化到磁盘了,只要redo log不丢,数据就不会丢失。
但是如果在事务未提交之前,系统就掉电了,那这个事务相关的数据更改就会丢失。
3.交由操作系统处理
当innodb_flush_log_at_trx_commit = 2时,提交事务的时候,不是直接将redo log 写进磁盘,而是写进了操作系统中磁盘文件对应的OS CaChe中,由操作系统决定何时写进磁盘文件(可能是 1 秒后)
将redo log的数据写进os cache ,其实也是一个充满隐患的选择,万一操作系统宕机了呢?
os cache 也是内存啊,数据页肯定会丢失的。
总结
综上所述,对于MySQL中redo log的三种刷盘策略,比较推荐的是第二种,也就是在提交事务时,将redo log 刷盘。