MySQL 三大日志

113 阅读2分钟

MySQL 的日志有很多种,其中包括慢查询日志、错误日志、事务日志等,在本文中,我们重点关注二进制日志(binlog)和事务日志(undo log、redo log)。

binlog

binlog 用于记录数据库的写入性操作(读操作将不会记录)数据,以二进制的形式保存在磁盘中,主要是 MySQL 的逻辑日志,由 server 层进行记录,使用任何存储引擎都会记录 binlog

binlog 日志主要有两个使用场景,分别的用于数据恢复和主从复制

  • 用于数据恢复:使用 mysql binlog 工具进行数据恢复
  • 用于主从复制:slave 消费 binlog 日志进行同步 master 节点数据

redo log

事务有四种特性,分别是原子性、一致性、隔离性和持久性。redo log 是保证事务的持久性的实现。

redo log 是物理日志,记录每个事务的修改操作,以确保事务在提交之后能正确的刷新到磁盘上。

redo log 是以循环的方式写在内存中,通过 buffer pool 进行加速,每次进行记录日志时内存大小不会发生变化

当我们查询一条数据时,首先在 Buffer Pool 中查找是否包含这条数据,如果不包含,则从数据加载一页的数据,然后放到 Buffer Pool 中,直到命中为止。这样可以减少 IO 次数,提高性能。当更新数据时,也是首先更新 Buffer Pool 中的数据,然后将更新日志同步到 redo log 中。

image.png

如上图所示,在什么情况下将 redo log buffer 写入到磁盘中呢?

  1. log buffer 内存不足时
  2. 事务提交时
  3. 后台线程不断刷新:后台有一个线程大约每秒钟刷新一次 buffer 数据到磁盘中
  4. 关闭服务器时

undo log

MySQL 要保证原子性,就需要在异常发生时,对已经执行的操作进行回滚。MySQL 崩溃恢复就是通过回滚日志 undo log 实现的。

所有的事物进行修改都会先记录到 undo log 日志中,然后再执行其他操作。如果遇到执行出现异常的情况下,会通过 undo log 日志进行恢复。写入时机会先于持久化硬盘,这样就能保证遇到宕机等情况还能通过 undo log 恢复未执行的日志。

此外 mvcc 的实现也是通过 undo log 完成的。

事务更新数据的流程图

image.png