redolog是mysql基于WAL方式的产物,因为是顺序写所以效率非常高,所以除了数据存储之外,redolog也被mysql作为事务处理的核心文件。redolog记录的数据是非常底层的,比如包涵了哪些磁盘块的哪些字节发生了变化,通过redolog可以完整重放出一个完全相同的数据副本,基于这些特性所以也叫重做日志、物理日志。缺点在于redolog因为存储的是物理数据,和存储引擎是非常耦合的,不同存储引擎甚至不同版本都会影响数据重放。
    为了解决上述问题,一般数据还提供不基于存储引擎层面的日志,它记录的内容是通过一系列记录来描述数据行级别的写请求,比较可读:

    1. 新增:包涵新增所有列的值。
    2. 删除:只需要记录一个主键即可。
    3. 更新:只需要记录主键和更新列的新值。
    4. 多行:记录多条上述数据,并记录相同的事务ID。

    这就是mysql的binlog日志,也叫逻辑日志。由于这种语义化的日志,使得它可以更容易保持不同版本甚至不同引擎之间的兼容,所以一般来说数据库的副本是通过binlog来实现。甚至一些数仓组件、搜索组件、缓存组件也是基于binlog来构建数据和索引的。
    binlog有三种模式:

    1. STATEMENT:记录逻辑SQL语句,也就是对同一行的操作都会按顺序记录下来。
    2. ROW:记录行的最终更改情况,也叫物理SQL,也就多条SQL对行的变更会合并为最终的行的变更记录。类似Redis的AOF模式下的指令合并或AOF重写。
    3. MIXED:上述两种模式各有优劣,STATEMENT好处在于体现了SQL执行过程,在一些需要过程数据的场景下比如流式计算等是需要的,缺点是恢复成本高。ROW的优缺点当然就是刚好反过来。所以MIXED的逻辑当然就是折中,基本会用STATEMENT,某些场景下用ROW:
      1. SQL中存在不确定函数调用,如UUID、NOW、CURRENT_USER、ROW_COUNT等等。

    image.png