Redo log 的三种刷盘策略

977 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 刷盘。