oldbeef
Published on 2025-06-26 / 14 Visits
0
0

Mysql三大日志系统

在企业实际的工作以及面试当中经常会提到undo log、redo log以及binlog这三个日志,这三个日志系统也起到了很重要的作用,他们共同保证了数据的安全性和可靠性。本文将详细介绍这三大日志体系的作用。

undo log

主要用来记录事务执行前的数据状态,主要用于:

  • 事务的回滚:当事务执行失败需要撤销操作时,让不同的事务能看到对应时间点的数据版本。

  • 实现MVCC:支持数据库的并发访问,让不同事务能看到对应时间点的数据版本。

redo log

主要用于记录事务修改后的数据状态。主要用户:

  • 确保事务的持久性:即使数据库崩溃,也能通过redo log恢复已提交的事务。

  • 提升性能:当提交数据时先将修改写入redo log(顺序写)再慢慢更新到磁盘数据文件(随机写)。

bin log

二进制目录,相当于把操作复制了一份保存,主要记录所有数据库的变更操作,主要作用:

  • 主从复制:将主库的变更同步到从库

  • 数据恢复:通过历史bin log将恢复某个时间点的数据状况。

586afd5d0c04b0286364108eedea262.png

分层架构下的日志协同工作机制

MySQL的只要功能可以划分为两个操作,一个是写数据时的事务管理,另一个是读数据时的查询功能

查询操作流程(读数据)

  • Server层接收SQL查询请求

  • 解析SQL语句并生成执行计划

  • 调用InnoDB引擎接口获取数据

  • InnoDB从Buffer Pool或磁盘获取数据

  • 返回结果给Server层

这一过程中,Innodb有一个很大的职责就是需要维护号Buffer Pool。包括将查询的热点数据尽量保存到Buffer Pool。如果Buffer Pool满了,还要淘汰热点数据

事务操作流程(写数据)

  • Server层接受SQL更新的请求

  • InnoDB记录undo log

  • 更新Buffer Pool中的数据

  • 写入redo log

  • Server层写入bin log

  • 将redo log改为commit状态

这一过程中设计到了MySQL的两阶段提交方案。为了保证数据一致性,MySQL使用两阶段提交来协调redo log和bin log的写入过程:

1、准备阶段:

  • innoDB写入redo log,标记为prepare状态

  • 通知Server层可以写入bin log

2、提交阶段:

  • Server层写入bin log

  • InnoDB将redo log标记为commit状态


Comment