MySQL日志体系

  • MySQL为了满足主从复制、事务等,有复杂的日志体系
  • Server层产生binlog,用来进行数据复制
  • InnoDB产生undo log、redo log,用来实现事务ACID
  • MySQL的日志不是来读的

    binlog

    归档日志

  • server层产生的逻辑日志

  • 用来进行数据复制和数据传送
  • 完整记录了数据库的每次数据操作,可作为数据闪回手段
  • 记录在专门的文件中

    undo log 回滚日志

  • InnoDB自身产生的逻辑日志,用于事务回滚和展示旧版本

  • 对任何数据(缓存)的更新,都先写undo log
  • undo log位于表空间的undo segment中
  • SQL: UPDATE name = ‘b’ —> undo: UPDATE name = ‘a’

    redo log重做日志

  • InnoDB自身产生的物理日志,记录数据叶(page)的变化

  • InnoDB“日志优先于数据”,记录redo log视为数据已经更新
  • 内存中的数据更新后写redo log,数据被写入硬盘后删除
  • redo log存储在4个1GB文件中,并且循环写入

image.png

  • write pos是当前日志写入点
  • check point是擦除点,数据被更新到硬盘时擦除
  • 当write pos追上check point时,事务无法提交,需要等待check point推进
  • 只要redo log不丢,数据就不会丢失