MySQL 事务日志

一、二进制日志(Binlog)

1. Binlog概念

Binlog 是逻辑日记,用于记录数据库执行的写入操作(查询不记录)信息,Server层记录和引擎层无关,并且是以追加方式进行写入,可以通过参数 max_binlog_size设置每个 Binlog 文件的大小,文件大小达到设定值时会生成新的文件来保存日记。

概念 解释
逻辑日志 “逻辑日志”可以简单理解为记录的就是sql语句。Binkog和Undo log记录的是逻辑日志
Server “Server”是MySQL基本架构的一层,MySQL基本架构分为Server层和引擎层详细介绍可以参考简单记一条查询SQL语句的执行全过程

2. Binlog作用

在实际应用中,主要用在两个场景:主从复制和数据恢复

  • 主从复制场景:在 Master 主端开启 Binlog,将 Binlog 发生到各个 Slave 从端,Slave 从端重放 Binlog 从而达到主从数据一致
  • 数据恢复场景:通过使用 mysqlbinlog 工具来恢复数据

3. Binlog 记录过程及刷盘时机

Binlog 大致记录过程是先写 Binlog Buffer,然后通过刷盘时机,控制刷入 OS Buffer,控制 fsync() 进行写入 Binlog File 日记磁盘的过程。

概念 解释
刷盘时机 “刷盘时机”是指啥时候、通过什么策略将内存中的日志写到磁盘中。因为日志每次都是先写入内存的buffer中,然后通过刷盘时机设置的参数控制刷盘时机,最后才刷入磁盘。这个参数设置对于Undo、Redo和Binlog都有一套参数

对于 Binlog,MySQL 是通过参数 sync_binlog 参数来控制刷盘时机,取值是 0、1 和 N 三种值。0 表示由系统自行判断何时调用 sync() 写入磁盘;1 表示每次事务 commit 都要调用 fsync() 写入磁盘;N 表示每 N 个事务,才会调用 fsync() 写入磁盘。
在这里插入图片描述
图2:内存和磁盘日记结构图

4. Binlog 记录格式

MySQL 5.7.7 版本之前默认格式是 STATEMENT,版本之后默认是 ROW,可以通过参数 binlog-format 指定。

二、事务日志(Undo log)

1. Undo log 概念

Undo log是逻辑日记、回滚日记。比如一条修改 +3 的逻辑语句,Undo log 会记录对应一条 -3 的逻辑日记,一条插入语句则会记录一条删除语句,这样发生错误时,根据执行 Undo log 就可以回滚到事务之前的数据状态。

2. Undo log 作用

  • 回滚数据:当程序发生异常错误时等,根据执行 Undo log 就可以回滚到事务之前的数据状态,保证原子性,要么成功要么失败。
  • MVCC 一致性视图:通过 Undo log 找到对应的数据版本号,是保证 MVCC 视图的一致性的必要条件。

3. Undo log 记录过程及刷盘时机

刷盘过程及时机类似于 Binlog 和 Redo,可以参考 Redo log 刷盘时机章节给出的图片,已经体现出来了。

4. Undo log 总结

Undo log 日记内容不是很多,重点是回滚多版本控制 MVCC那块。此外,我记得印象笔记深刻的是长事务会导致日记过多,这个日记就是 Undo log。因为长事务存在,导致需要保存很多视图快照,其实这里就是涉及到Undo log 何时删除和生成的问题,当时纠结好久,其实很简单。生成是事务开始后写 Redo log 之前生成,当没有事务需要用到 Undo log 时就会被删除。举个例子,如果事务 A 一直存活,那么事务 A 之后产生的事务 B、C…等等就算提交了,也不会被删除,因为事务 A 需要用到 B、C… 事务去找 A 的版本。所以避免长事务可以减少Undo log 日记量,当然还可以提高性能。

三、事务日记 (Redo log)

1. Redo log 概念

Redo log 是重做日记,属于InnoDB引擎的日记。是物理日记,日记记录的内容的是数据页的更改,这个页 “做了什么改动”。如:add xx记录 to Page1,向数据页Page1增加一个记录。

概念 解释
数据页 MySQL是按照数据页为最小单位进行存储的,b+树的特性,一页默认16k,数据属于页,页包含数据当操作一条数据的时候,实际上就是在操作一个数据页,多条数据可能是在一个数据页也可能是在多个数据页,看数据具体分布。

2. Redo log 作用

  • 前滚操作:具备 crash-safe能力,提供断电重启时解决事务丢失数据问题。
  • 提高性能:先写Redo log记录更新。当等到有空闲线程、内存不足、Redo log满了时刷脏。写 Redo log 是顺序写入,刷脏是随机写,节省的是随机写磁盘的 IO 消耗(转成顺序写),所以性能得到提升。此技术称为WAL技术:Write-Ahead Logging,它的关键点就是先写日记磁盘,再写数据磁盘。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

走出半生仍是少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值