在企业实际的工作以及面试当中经常会提到undo log、redo log以及binlog这三个日志,这三个日志系统也起到了很重要的作用,他们共同保证了数据的安全性和可靠性。本文将详细介绍这三大日志体系的作用。
undo log
主要用来记录事务执行前的数据状态,主要用于:
事务的回滚:当事务执行失败需要撤销操作时,让不同的事务能看到对应时间点的数据版本。
实现MVCC:支持数据库的并发访问,让不同事务能看到对应时间点的数据版本。
redo log
主要用于记录事务修改后的数据状态。主要用户:
确保事务的持久性:即使数据库崩溃,也能通过redo log恢复已提交的事务。
提升性能:当提交数据时先将修改写入redo log(顺序写)再慢慢更新到磁盘数据文件(随机写)。
bin log
二进制目录,相当于把操作复制了一份保存,主要记录所有数据库的变更操作,主要作用:
主从复制:将主库的变更同步到从库
数据恢复:通过历史bin log将恢复某个时间点的数据状况。
分层架构下的日志协同工作机制
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状态