Post

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.