redoLog与binlog的区别

  • redolog是物理日志, binlog是逻辑日志
  • rodelog 是记录的InnoDB 的事务操作, 而binlog记录所有与mysql数据库有关的日志记录。
  • 写入的时间的不同。 relog 在事务进行的过程中不断的写入,而binlog只有在提交时才写入。
  • redolog是循环的,binlog是追加写。

    redolog 文件组

    redoLog与binLog - 图1
  • 每个innodb至少有一个 重做文件组,每组至少有两个redolog,不同重做文件放到不同的磁盘上,提高高可用行。 一个redolog写满会写另一个。
  • 重做日志文件太大 会导致 数据库宕机回复时间久,
  • 文件太小可能会导致一个事务的日志需要多次的切换重做日志文件,同时 频繁的 asynccheckpoint。 relog的capacity的变量 代表了最近的一个checkpoint 不能超过这个,否者 会将脏页数据部分写回到磁盘, 此时用户线程被阻塞。

    redolog Buffer写入磁盘的原子性。

  • 每次写入的大小是 512字节。 即4kb 因为一个扇区的大小也是4kb,因此重做日志在写入磁盘是不需要双写。

  • 写入的时机: 主线程每秒将redolog写入到磁盘。 事务提交时写入到磁盘。 redoLog与binLog - 图2
  • 写入时机的参数设置 只有 为1 时才满足 ACID的特性。 redoLog与binLog - 图3

    更新语句执行流程

    redoLog与binLog - 图4

    两阶段提交

  • 在执行写操作时,为了保证两份日志的的逻辑日志就引入 了 两阶段提交。 先提交binlog,再提交redolog。

    为什么一定要两阶段提交呢?

    因为 redolog和binlog是两个独立的操作,为了保证两个日志的逻辑一致,当数据库奔溃时,能够准确的恢复。
    反证法验证

  • 先redolog,再binlog。如果写完 redolog, 并提交,此时 如果 binlog只写到一半, 数据库发生异常重启,这时虽然能通过relog恢复数据, 但是, 在使用binlog进行备份时,一些写操作语句丢失,就会导致与原库数据不一致的问题。

  • 先写binlog,再写 redolog。 当binlog写完并提交写入磁盘中,redolog写入了一半,mysql异常重启了,奔溃恢复后,事务无效,会进行回滚到, 再进行redolog恢复时, 也会导致 binlog与redolog 数据的不一致。