MySQL事务是怎么保证持久化的?浅谈Redo Log (一)

232 阅读3分钟

本文正在参加「技术专题19期 漫谈数据库技术」活动

1 什么是事务?

MySQL作为我们日常研发工作中常用的一个数据库,相信大家对事务一定不陌生了。简单来说,我们把具有原子性、隔离性、一致性、持久性的一个或多个数据库操作成为事务。而MySQL支持事务的存储引擎有InnoDB、NDB。

  • 原子性:事务中的操作要么全部都做,要么全部都不做
  • 一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态
  • 隔离性:一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 持久性:一个事务一旦被提交,它对数据库中数据的改变就是永久性的

好了,在回顾了事务的ACID属性后,我们来回到本文讨论的问题,事务是如何保证数据的持久化的?下面我们一起来揭秘吧~

2 Redo Log (重做日志)

由事务的持久性可以知道:一个事务一旦被提交,它对数据库中数据的改变就是永久性的。如果清楚MySQL数据写入的同学应该知道,数据修改并不是直接刷到磁盘的,而是先对内存(Buffer Pool)中的页进行数据修改,等到特定的时机,才会把内存中的修改写入到磁盘。

假设内存中数据已经发生了变动,事务提交了,但修改的数据还未写入到磁盘,这段时间内,数据库发生故障断电崩溃了,那这部分内存里修改的数据就全部丢失了。那如果是在转账的场景,其实不是凉凉~

优秀的 MySQL 设计师当然不允许出现这种 case ,于是他们设计出了 Redo Log 重做日志,就是把数据的修改记录到这个日志中,待数据库重启时利用日志把事务修改过的数据重新更新到数据页。具体 Redo Log 记录的内容是啥,我们后面再详细来看~现在只需要知道,MySQL利用 Redo Log 记录了需要更新的数据,以便数据库崩溃后重启时恢复数据,从而保证了事务的持久性。

3 Redo Log 长啥样

既然 Redo Log 如此强大,那么它长啥样,记录了哪些信息?

  • type:日志类型
  • spaceID:表空间ID
  • page number: 页号
  • data:具体内容

具体的结构是什么样的,不是本文的讨论重点,感兴趣的小伙伴自行查看相关资料~

小结

本文主要介绍了 Redo Log 是什么以及它出现的意义和作用,接下来会有另外的文章来对 Redo Log 的工作原理做更深入的研究,谢谢大家的一键三连!