持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情
MySQL数据更新时undo log 和 redo log的作用
大家都知道MySQL中为了提高读取性能,所以它的内部是设计了内存的,如buffer pool等;在数据更改的时候,MySQL是首先更改buffer pool 中的;那么这里就存在一个问题:内存不是持久化的,如何保证掉电时数据不丢失呢?
通过今天的学习就可以解决这个问题,话不多说,咱们马上开始!
buffer pool 的引入
我们都知道平时MySQL中的数据最终都是保存在磁盘中的,而如果我们要读取、更改某个数据的时候;假如也是直接修改磁盘中的数据的话,这样是随机IO,消耗性能很大。
为了解决这个问题,MySQL中设计了buffer pool ,在要对数据进行操作时,先将数据从磁盘中加载到buffer pool,然后直接对buffer pool 中的数据进行更改。
但是这样的话,就会引发另外一个问题:buffer pool是内存,假如掉电了,数据就全部丢失了。
undo log 的引入
undo log的引入主要是为了在数据更新之后,可以恢复到原来的数据值(rollback)
在执行更新操作之前,将旧的数据值写进undo log 日志文件中,以实现持久化
请注意 undo log 的引入并不是为了解决掉电数据丢失的问题的,它是为了 rollback
redo log的引入
redo log 的引入就是为了解决掉电数据丢失问题的,它将操作持久化。
在这里,就不得不提到另外一个缓冲区了——Redo log Buffer。
redo log 并不是并不是第一时间写进磁盘文件的,它也有一个专属的缓冲区,就是Redo log Buffer。
在数据更改时,必须将对内存所做的所有更改都记录到 Redo log Buffer中,最后将redo log刷盘到磁盘文件,实现持久化。
当然,因为 Redo log Buffer 也是在内存中的,所以在redo log 还没刷盘之前,都存在掉电丢失数据的隐患。
- 丢失内存中更新的数据
- 丢失内存的redo log
总结
其实redo log的出现并不能百分百解决掉电丢失数据的问题,但是它有三种刷盘策略,不同的策略丢失的数据量不同,只能根据实际需要去选择。
而undo log就相对简单点,它就记录了原数据,方便rollback。