结合MySQL更新流程看 undolog、redolog、binlog

前言

看过我之前文章《一条Update语句的执行过程是怎样的?》的朋友都基本知道【点击文章传送门~🙌,在整个Update更新语句中会涉及到三种日志,分别是undo log(回滚日志)、redo log (重做日志) 、binlog (归档日志),也有两阶段提交,没看过的不要紧,可以结合本篇文章一起看,会有1+1>2的效果。

当时我们在文末也留了个小目标,就是更新一期详细分享下三种日志的用处和产生的时机等知识,进行更深一步的扩展,刚好现在这个时候。

Let’s Go!,额,最近听《My Stupid Heart》🎵🎵🎵上头了,经常浮现Let’s Go开头了,感兴趣的朋友可以去听下这首歌。

好了,回归正题,正文正式开始!📄📄

📚 全文字数 : 9k+

⏳ 阅读时长 : 13min

📢 关键词 : undolog、redolog、binlog

开篇tip

我们知道日志的作用不言而喻,无论是线上排查,亦或是性能优化,几乎都需要从日志中来获得信息作为依据,而MySQL中,很多很多的功能也都需要基于日志实现,比如事务回滚、数据持久化、数据恢复、数据迁移、MVCC机制…

我们在了解具体内容之前,先对三种日志之间的小总结,涉及到使用场景和文件等,可以把这个当做先前总结,更细的内容在每一章会提及。

简单梳理下日志是在哪个地方写入到不同日志文件中的,undolog、redolog都是InnoDB引擎中的日志,而且都是在Buffer Pool中,而binlog在Server层中,位于每条线程中,并且每种日志在磁盘中的的归档方式和文件都是不一样的,之间的区别如下图。

WAL机制是什么?

WAL,全称是Write-Ahead Logging, 预写日志系统。指的是 MySQL 的写操作并不是立刻更新到磁盘上,而是先记录在日志上,然后在合适的时间再更新到磁盘上。

MySQL真正使用WAL的原因是:磁盘的写操作是随机IO,比较耗性能,所以如果把每一次的更新操作都先写入log中,那么就成了顺序写操作,实际更新操作由后台线程再根据log异步写入。

这样对于client端,延迟就降低了。并且,由于顺序写入大概率是在一个磁盘块内,这样产生的IO次数也大大降低。所以WAL的核心在于将随机写转变为了顺序写,降低了客户端的延迟,提升了吞吐量。

CheckPoint技术是啥?

在MySQL中主要是将缓冲池中的脏页刷回到磁盘。InnoDB存储引擎内部,两种checkpoint,分别为:Sharp Checkpoint 和 Fuzzy Checkpoint。

而MYSQL中主要是为了保证数据会做很多CheckPoint动作

Undo log

undo log 叫做回滚日志,它保证了事务的 ACID 特性中的原子性(Atomicity),是引擎层生成的日志,记录的是逻辑操作,用于记录数据被修改前的信息,这里的逻辑操作是指: “增(insert)删(delete)改(update)”。

undo log的两个主要作用是【事务回滚】 和 通过ReadView + undo log 实现 【MVCC (多版本并发控制)】

记录内容

不同的SQL修改操作,记录的undo log分别是什么呢?

insert 插入操作,会在undo log中记录本次插入的主键id,等事务回滚时,会delete此主键对应的记录,

update 更新操作,会记录一条相反的update的undo log,回滚时执行一次相反update,更新回原来的数据,

delete 删除操作,会记录删除前的数据,回滚时,insert原来的数据。

通过上面的相反逻辑处理,这样的话即使发生错误时,就能回滚到事务之前的数据状态。

一条SQL没有begin开启事务和Commit提交事务,也能自己提交事务?

是的,MYSQL事务分为【隐式事务和显示事务】

隐式事务:

比如insert、update、delete语句,事务的开启、提交或回滚由mysql内部自动控制的,事务自动开启、提交或回滚。

我们可以通过 show variables like 'autocommit’查看是否开启了自动提交,autocommit为ON表示开启了自动提交

显示事务:

显式事务是指在应用程序中明确指定事务的开

### Mysqlbinlogundologredolog的日志功能及区别 #### binlog(二进制日志) binlogMySQL Server 层的日志,记录了数据库的逻辑操作,例如 `INSERT`、`UPDATE` 和 `DELETE` 等语句。它以逻辑日志的形式存储,记录的是 SQL 语句的原始逻辑[^1]。 - **功能**: - 主要用于主从复制,从库通过读取主库的 binlog 来实现数据同步[^2]。 - 可用于数据恢复,当数据库发生故障时,可以通过重放 binlog 来恢复数据[^4]。 - **刷盘时机**: - `sync_binlog` 参数控制 binlog 的刷盘行为,建议设置为 1,即每次事务提交时都将 binlog 写入磁盘,以保证异常重启后日志不会丢失[^4]。 - **格式**: - 支持三种格式:`STATEMENT`、`ROW` 和 `MIXED`。`ROW` 格式记录每一行的变化,而 `STATEMENT` 格式记录执行的 SQL 语句。 --- #### redo log(重做日志) redo log 是 InnoDB 存储引擎层的日志,记录了数据页的物理变化,属于物理日志[^3]。 - **功能**: - 主要用于崩溃恢复。当数据库因意外宕机或介质故障而需要恢复时,redo log 能够确保未写入磁盘的数据能够被重新应用,从而保证数据的一致性和完整性。 - **记录形式**: - 记录的是数据页的物理变化,而非具体的 SQL 操作。例如,某一行数据从 A 值更新为 B 值,redo log 会记录这一变化的详细信息[^2]。 - **写入方式**: - redo log 是循环写入的,其日志空间大小是固定的。当一个日志文件写满后,会切换到下一个日志文件,形成循环使用。 --- #### undo log(回滚日志) undo log 同样是 InnoDB 存储引擎层的日志,主要用于事务的回滚以及多版本并发控制(MVCC)。 - **功能**: - 在事务执行过程中,如果需要回滚,undo log 提供了撤销操作的能力。例如,某条记录被更新后,undo log 会保存该记录的旧版本,以便在需要时恢复旧值[^2]。 - 支持 MVCC,允许多个事务同时读取不同版本的数据,而不会相互干扰[^1]。 - **记录形式**: - 记录的是事务执行前的数据状态,与 redo log 不同,undo log 是逻辑日志[^2]。 --- #### 区别总结 | 日志类型 | 层级 | 功能 | 记录形式 | 使用场景 | |------------|--------------|--------------------------|----------------|------------------------------------| | binlog | MySQL Server | 数据恢复、主从复制 | 逻辑日志 | 数据同步、故障恢复 | | redo log | InnoDB 引擎 | 崩溃恢复 | 物理日志 | 数据库异常宕机后的数据一致性恢复 | | undo log | InnoDB 引擎 | 事务回滚、MVCC | 逻辑日志 | 回滚操作、支持并发读 | --- ### 示例代码:查看 binlog 文件内容 ```bash # 查看当前 binlog 文件列表 SHOW MASTER LOGS; # 查看指定 binlog 文件的内容 mysqlbinlog /var/lib/mysql/binlog.000001; ``` --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值