天天看点

MYSQL数据保障 三大日志 binlog、redo log、undo log分类binlog 二进制日志redo log 重做日志undo log 撤销日志参考连接

文章目录

  • 分类
  • binlog 二进制日志
    • 简介
    • 应用场景
    • 刷盘时机
  • redo log 重做日志
    • 简介
    • 应用场景
    • 刷盘时机
      • 记录形式
      • 与binlog区别
  • undo log 撤销日志
    • 简介
    • 应用场景
    • 刷盘时机
  • 参考连接

日志是 mysql 数据库的重要组成部分,记录着数据库运行期间各种状态信息。

mysql日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。作为开发,我们重点需要关注的是二进制日志( binlog )和事务日志(包括redo log 和 undo log )

分类

  • 逻辑日志: 可以简单理解为记录的就是sql语句
  • 物理日志: mysql 数据最终是保存在数据页中的,物理日志记录的就是数据页变更

binlog 二进制日志

简介

  • binlog 用于记录数据库执行的写入性操作(不包括查询)信息,以二进制的形式保存在磁盘中。
  • binlog 是逻辑日志,并且由 Server 层进行记录,使用任何存储引擎的 mysql 数据库可以使用 binlog 日志。
  • binlog 是通过追加的方式进行写入的,max_binlog_size 参数设置每个 binlog文件的大小,当文件大小达到给定值之后,会生成新的文件来保存日志。

应用场景

  • 主从复制
  • 数据恢复

刷盘时机

  • mysql 通过 sync_binlog 参数控制 biglog 的刷盘时机,取值范围是 0-N
    • 0:不去强制要求,由系统自行判断何时写入磁盘
    • 1:每次 commit 的时候都要将 binlog 写入磁盘,MySQL 5.7.7

      之后的默认值

    • N:每N个事务,才会将 binlog 写入磁盘

redo log 重做日志

简介

  • 物理日志
  • redo log 包括两部分:内存中的日志缓冲( redo log buffer ),磁盘上的日志文件( redo log)
  • mysql 每执行一条 DML 语句,先将记录写入 redo log buffer `,后续某个时间点再一次性将多个操作记录写到 redo log file 。这种 先写日志,再写磁盘 的技术就是 MySQL里经常说到的 WAL(Write-Ahead Logging) 技术。
  • redo log 是 InnoDB 引擎层实现的,并不是所有引擎都有

应用场景

  • 系统突然崩溃恢复(crash-safe)

刷盘时机

  • mysql 支持三种将 redo log buffer 写入 redo log file 的时机,可以通过

    innodb_flush_log_at_trx_commit

    参数配置
    • 0(延迟写)
    • 1(实时写,实时刷)
      • 事务每次提交都会将 redo log buffer 中的日志写入 os buffer 并调用 fsync() 刷到 redo log file 中。
    • 2(实时写,延迟刷)

记录形式

  • redo log 实际上记录数据页的变更,而这种变更记录是没必要全部保存,因此 redo log

    实现上采用了大小固定,循环写入的方式,当写到结尾时,会回到开头循环写日志

  • 启动 innodb 的时候,不管上次是正常关闭还是异常关闭,总是会进行恢复操作。因为 redo log 记录的是数据页的物理变化,因此恢复的时候速度比逻辑日志(如 binlog )要快很多。
  • 重启 innodb 时,首先会检查磁盘中数据页的 LSN ,如果数据页的 LSN 小于日志中的 LSN ,则会从 checkpoint 开始恢复。
    MYSQL数据保障 三大日志 binlog、redo log、undo log分类binlog 二进制日志redo log 重做日志undo log 撤销日志参考连接

与binlog区别

  • binlog 日志只用于归档,只依靠 binlog 是没有

    crash-safe 能力的。但只有 redo log 也不行,因为 redo log 是 InnoDB

    特有的,且日志上的记录落盘后会被覆盖掉。因此需要 binlog 和 redo log二者同时记录,才能保证当数据库发生宕机重启时,数据不会丢失。

undo log 撤销日志

简介

  • 逻辑日志
  • 用于记录事务开始前的状态,用于事务失败时的回滚操作
  • undo log 主要记录了数据的逻辑变化,比如一条 ` INSERT语句,对应一条 DELETE 的 undo log ,对于每个 UPDATE 语句,对应一条相反的 UPDATE 的undo log ,这样在发生错误时,就能回滚到事务之前的数据状态。
  • 数据库事务四大特性中有一个是 原子性 , 原子性 底层就是通过 undo log 实现的。
  • undo log 也是 MVCC (多版本并发控制)实现的关键

应用场景

  • 用于记录事务开始前的状态,用于事务失败时的回滚操作

刷盘时机

  • undo log刷入磁盘后,才提交事务

参考连接

必须了解的mysql三大日志-binlog、redo log和undo log

继续阅读