mysql三大日志总结
mysql三大日志总结
mysql三大日志总结 undo log redo log bin log
- undo log: Innodb存储引擎生成的日志,用于实现事务中的原子性,主要用于事务回滚和MVCC
- redo log:Innodb存储引擎生成的日志,实现事务中的持久性,主要用于掉电等实例崩溃后的恢复
- binlog:Server层生成的日志,主要用于数据备份和主从复制
undo log 回滚日志
事务提交前,Innodb会将更新前的数据缓存到undo log 中,当事务需要回滚时(事务执行失败,崩溃),会使用undo log进行回滚。
undo log保存于数据项中,由trx_id(缓存的记录由哪个事务修改,mvcc机制中需要使用)和roll_pointer(形成链表)组成;
redo log 重做日志
redo log用于保障事务的持久性,内存和硬盘在一致性上存在延迟,修改第一时间执行在内存中,在刷盘前(WAL技术),存在内存丢失的可能,所以需要将记录的物理修改记录在redo log中并立刻持久化(事务提交时,将redo log 持久化进硬盘,成功返回提交成功);
- WAL:MySQL 的写操作并不是立刻写到磁盘上,而是先写日志,然后在合适的时间再写到磁盘上。
redo log 的持久化流程
写入redo log buffer,在A时机调用系统接口写入系统缓存,调用fsync将缓存写入硬盘文件中。
A:
- Mysql关闭时
- 当redo log buffer中记录的写入量大于redo log buffer内存空间的一半时
- innodb后台线程定时入盘(1s)
- 事务提交(可由innodb_flush_log_at_trx_commit控制)
bin log 二进制日志
bin log不属于innodb的功能,是mysql server层的功能。主要用于主从复制时,传输主实例的数据,或者主动备份数据库数据;工作原理可以参考主从复制的工作机理。
bin log同样有bin log cache负责缓存,而不是直接写入系统缓存;入盘时机是事务提交。
集群环境下,redo log和bin log的持久化要按照两阶段提交,防止主从复制机制执行中出现数据的丢失
This post is licensed under CC BY 4.0 by the author.