redoLog

  • 属于InnoDB的日志
  • 物理日志,记录的是“在某个数据页上做了什么修改”
  • WAL(Write Ahead Logging),即先写日志,再写磁盘
  • InnoDB的redoLog是固定大小,可以配置为4个文件,每个文件1GB

    • 从头写,写到末尾后循环写
    • write pos是当前记录的位置,一边写一边后移
    • checkpoint是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件
    • write pos追上checkpoint,表示redoLog写满了,此时要进行flush脏页
    • Crash-safe,可以保证数据库异常重启,之前提交的记录不会丢失
      • innodb_flush_log_at_trx_commit这个参数设置成1, 表示每次事务的redo log都直接持久化到磁盘
      • 保证MySQL异常重启数据不丢失
    • image.png

      binLog

  • Server层日志,也叫归档日志

  • 逻辑日志,记录sql的操作逻辑
  • sync_binlog这个参数设置成1,表示每次事务的binlog都持久化到磁盘
  • 追加写

    一条update语句执行流程

    image.png

    两阶段提交

  • MySQL数据恢复:整库备份+binlog重放

  • 如果不使用两阶段提交,可能导致数据库和用日志恢复出来的库状态不一致
  • 更新操作会先写入redo log buffer这块内存,事务commit后,写道redo log文件里