MySQL 三大日志:binlog、redo log 和 undo log 使用与原理

本文深入探讨了MySQL的三大日志——binlog、redo log和undo log。binlog是逻辑日志,记录写操作以实现主从复制和数据恢复;redo log为物理日志,确保数据的持久性;undo log用于事务的原子性和MVCC。文章详述了它们的格式、使用场景、刷盘时机以及在数据库崩溃恢复中的作用。
摘要由CSDN通过智能技术生成


https://gitee.com/hzm_pwj/FigureBed/raw/master/giteeImg/20201122105555.png

日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息。 mysql日志主要包括错误日志查询日志慢查询日志事务日志二进制日志几大类。重点需要关注的是二进制日志( binlog )和事务日志(包括redo logundo log)。

binlog

binlog用于记录数据库执行的写入性操作(不包括查询)信息,以二进制的形式保存在磁盘中。binlogmysql逻辑日志,并且由Server层进行记录,使用任何存储引擎的mysql数据库都会记录binlog日志。

  • 逻辑日志: 可以简单理解为记录的就是sql语句
  • 物理日志mysql数据最终是保存在数据页中的,物理日志记录的就是数据页变更
  • redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。

binlog是通过追加的方式进行写入的,可以通过max_binlog_size参数设置每个binlog文件的大小,当文件大小达到给定值之后,会生成新的文件来保存日志。

binlog日志格式

binlog 日志有三种格式,分别为 STATMENTROWMIXED

在 MySQL 5.7.7 之前,默认的格式是 STATEMENT , MySQL 5.7.7 之后,默认值是 ROW 。日志格式通过 binlog-format 指定。

  • STATMENT: 基于SQL语句的复制(statement-based replication, SBR),每一条会修改数据的sql语句会记录到binlog 中 。

    • 优点: 不需要记录每一行的变化,减少了binlog日志量,节约了 IO , 从而提高了性能;

    • 缺点: 在某些情况下会1导致主从数据不一致,比如执行sysdate()slepp() 等 。

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SLtPca4K-1631868153377)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/7c7e1d23-dcb6-4b44-960c-b2e7fa468f8f/Untitled.png)]

  • ROW: 基于行的复制( row-based replication, RBR ),不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了 。

    • 优点: 不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题 ;

    • 缺点: 会产生大量的日志,尤其是 alter table 的时候会让日志暴涨

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KXBlBvud-1631868153378)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/f8039387-9a23-47b1-99e1-9add734aa0d0/Untitled.png)]

  • MIXED : 基于 STATMENTROW 两种模式的混合复制( mixed-based replication, MBR ),一般的复制使用 STATEMENT 模式保存 binlog ,对于 STATEMENT 模式无法复制的操作使用 ROW 模式保存 binlog

binlog 使用场景

在实际应用中, binlog 的主要使用场景有两个,分别是 主从复制数据恢复

  1. 主从复制 :在 Master 端开启 binlog ,然后将 binlog 发送到各个 Slave 端, Slave 端重放 binlog 从而达到主从数据一致。
  2. 数据恢复 :通过使用mysqlbinlog工具来恢复数据。

binlog 刷盘时机

binlog 的写入逻辑比较简单:事务执行过程中,先把日志写到 binlog cache,事务提交的时候,再把 binlog cache 写到 binlog 文件中。

一个事务的 binlog 是不能被拆开的,因此不论这个事务多大,也要确保一次性写入。这就涉及到了 binlog cache 的保存问题。

事务提交的时候,执行器把 binlog cache 里的完整事务写入到 binlog 中,并清空 binlog cache。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值