MySQL三大日志——binlog、redoLog、undoLog详解
在MySQL数据库的世界里,binlog、redoLog、undoLog 这三大日志扮演着至关重要的角色。深入理解它们,对于我们优化数据库性能、保障数据安全与完整有着极大的帮助。今天,就让我们一起来详细剖析这三大日志。
一、redoLog(重做日志)
1.1 作用
redoLog 是 InnoDB 存储引擎独有的,它赋予了 MySQL 崩溃恢复能力。当 MySQL 实例遭遇挂掉或宕机等意外情况,重启时 InnoDB 存储引擎会借助 redoLog 来恢复数据,确保数据的持久性与完整性。
1.2 工作原理
MySQL 中数据以页为单位存储。当查询一条记录时,会从硬盘将一页数据加载出来,此数据页被放入 BufferPool 中。后续查询先在 BufferPool 中查找,未命中才去硬盘加载,以此减少硬盘 IO 开销,提升性能。更新表数据时,若 BufferPool 里存在要更新的数据,便直接在 BufferPool 里更新。之后,会把在某个数据页上的修改记录到重做日志缓存(redologbuffer)里,接着刷盘到 redolog 文件中。
1.3 刷盘时机
InnoDB 存储引擎为 redolog 的刷盘策略提供了 innodb_flush_log_at_trx_commit 参数,该参数支持三种策略:
- 0:设置为 0 时,每次事务提交时不进行刷盘操作。
- 1:设置为 1 时(默认值),每次事务提交时都将进行刷盘操作。这意味着只要事务提交成功,redolog 记录就一定在硬盘里,不会有任何数据丢失。如果事务执行期间 MySQL 挂了或宕机,由于事务并未提交,日志丢失也不会造成损失。
- 2:设置为 2 时,每次事务提交时都只把 redologbuffer 内容写入 pagecache。
此外,InnoDB 存储引擎有一个后台线程,每隔 1 秒,就会把 redologbuffer 中的内容写到文件系统缓存(pagecache),然后调用 fsync 刷盘。也就是说,即使是没有提交事务的 redolog 记录,也可能会刷盘。而且当 redologbuffer 占用的空间即将达到 innodb_log_buffer_size 一半的时候,后台线程也会主动刷盘。
1.4 日志文件组
硬盘上存储的 redolog 日志文件并非单个存在,而是以日志文件组的形式出现,每个 redo 日志文件大小相同。例如,可以配置为一组 4 个文件,每个文件大小 1GB,整个 redolog 日志文件组就能记录 4G 的内容。它采用环形数组形式,从头开始写,写到末尾又回到头循环写。
在日志文件组中有两个重要属性:
- writepos:当前记录的位置,一边写一边后移。
- checkpoint:当前要擦除的位置,也是往后推移。
每次刷盘 redolog 记录到日志文件组中,writepos 位置就会后移更新。每次 MySQL 加载日志文件组恢复数据时,会清空加载过的 redolog 记录,并把 checkpoint 后移更新。writepos 和 checkpoint 之间的空闲部分可用来写入新的 redolog 记录。如果 writepos 追上 checkpoint,表示日志文件组满了,此时不能再写入新的 redolog 记录,MySQL 得停下来,清空一些记录,把 checkpoint 推进一下。
二、binlog(二进制日志)
2.1 作用
binlog 主要用于数据备份、恢复以及主从复制。它记录了数据库中所有对数据进行修改的操作,比如 INSERT、UPDATE、DELETE 等语句。
2.2 与 redoLog 的区别
- redoLog 是 InnoDB 存储引擎独有的,而 binlog 是 MySQL 的 Server 层实现的,所有存储引擎都可以使用。
- redoLog 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是语句的原始逻辑,比如“给某张表的某条记录的某个字段更新成了什么值”。
2.3 写入时机
binlog 的写入时机由参数 sync_binlog 控制,该参数同样支持多种策略,例如 0 表示由系统自行决定何时将 binlog cache 中的内容写入磁盘;1 表示每次事务提交时都将 binlog cache 中的内容写入磁盘并同步,这样能保证数据的完整性,但会影响性能。
三、undoLog(回滚日志)
3.1 作用
undoLog 主要用于事务回滚以及实现多版本并发控制(MVCC)。当事务执行过程中出现错误或者主动执行 ROLLBACK 语句时,MySQL 可以利用 undoLog 来撤销已经执行的操作,将数据恢复到事务开始之前的状态。
3.2 工作原理
在事务开始时,MySQL 会为该事务分配一个回滚段,回滚段中包含了 undoLog 记录。这些记录记录了数据在修改前的状态。当需要回滚时,就按照 undoLog 记录的内容反向操作,将数据恢复原状。
在多版本并发控制(MVCC)中,undoLog 用于构建数据的历史版本。当一个事务读取数据时,它可能会读取到一个旧版本的数据,这个旧版本的数据就是通过 undoLog 来构建的。通过这种方式,不同的事务可以在不互相干扰的情况下并发访问数据,提高了数据库的并发性能。
四、总结
binlog、redoLog、undoLog 这三大日志在 MySQL 数据库中各司其职,共同保障了数据库的正常运行、数据的安全与完整以及高效的并发处理能力。redoLog 确保崩溃恢复能力,binlog 用于备份恢复和主从复制,undoLog 负责事务回滚和 MVCC。希望通过这篇文章,能让大家对 MySQL 的这三大日志有更清晰的认识。如果文章对你有帮助,别忘了点赞支持哦!后续我也会继续深入学习,为大家带来更多有价值的内容。

被折叠的 条评论
为什么被折叠?



