后端笔记04 | 认识MySQL三大日志:redolog 、binlog、undolog

🛑 参考资料

掘金:MySQL三大日志(binlog,redolog,undolog)详解

阿里云开发者:庖丁解InnoDB之UNDO LOG

阿里云开发者:庖丁解InnoDB之REDO LOG

小林coding

🛑 内容提问

  1. MySQL三个重点日志是什么?
  2. redolog应用、特点、存在必要性、记录方式
  3. MySQL的异步写回磁盘机制,什么是WAL机制,WAL机制和redolog的关系
  4. 为什么redolog能实现crash-safe,bin log能吗,为什么
  5. binlog是什么,特点,三种日志方式
  6. redolog 和 binlog的区别
  7. MySQL两阶段提交,是什么,哪两个阶段,执行流程
  8. 没有两阶段提交,只用redolog或者binlog会出现什么问题,redolog和binlog的作用是什么,所以为什么需要两阶段提交
  9. 什么是undolog,undolog和redolog的区别是什么,举例说明区别

🛑 正文

  1. 📌 MySQL有哪三个重点日志?

二进制日志binlog​(归档日志)、事务日志redo log​(重做日志)和undo log​(回滚日志)。

  1. 📌 什么是redolog?

redo log​是物理日志,记录的是“在某个数据页做了什么修改”,即所有提交的事务对数据库的修改。

  • 特点

是InnoDB存储引擎独有的,让MySQL具备崩溃恢复能力。

  • redo log存在必要性

① MySQL异常重启后的数据恢复手段, 保证数据的一致性;

② 配合MySQL的WAL机制。 由于事务执行时的特点是,数据会先写入内存,并异步刷新到磁盘,以提升性能。如果系统crash会有数据丢失风险,因此,MySQL 通过 redo log 记录事务修改,并在提交时持久化到磁盘。即使发生崩溃,MySQL 也能利用 redo log 进行数据恢复,从而保证 crash-safe

❓ redo log的记录方式是什么

redo log大小固定,循环写,即写完会回到开头循环写日志。

❓ 如何理解异步写回磁盘技术

✅由于MySQL数据存储是以页为单位存储, MySQL 在更新数据时,不会立即将数据写入磁盘,而是先在 Buffer Pool(内存)修改数据页,然后异步写入磁盘。

💡好处: 磁盘I/O速度远低于内存访问速度,如果每次更新都直接写磁盘,会严重拖慢性能,异步写回可以减少频繁的I/O,提高吞吐量。

❌带来问题: 如果 MySQL 在数据落盘前崩溃(crash),数据还未刷磁盘,提交事务可能丢失,导致数据不一致, 此时只修改了内存中的数据页,未写入磁盘的数据就会丢失。

❓ 如何解决上面说的问题:WAL机制

MySQL 采用 WAL 机制,即“先写日志,再写数据” ,利用 redo log 记录事务的变更,以保证​**崩溃恢复能力(crash-safe)**​

❓ 什么是WAL机制

WAL,中文全称是Write-Ahead Logging,预写日志机制,是数据库日志管理技术,redo log 是 WAL 机制的具体实现。

核心原则是“先写日志,再写数据”,确保数据库即使在崩溃后也能恢复数据。

对比:redis的AOF持久化机制是先执行命令再写日志,好处是什么?

8-为什么AOF是执行完命令记录日志?

❓为什么保证crash-safe

① 先写入redo log 后执行的特点,执行成功,说明一定写入;如果写入失败,一定不会执行,事务页不可能提交;

② redo log内部结构是基于页的,记录了这个页的字段值变化,只要crash后读取redo log进行重放,就可以恢复数据。

  1. 📌 什么是binlog(归档日志)?
  • 特点

binlog日志是逻辑日志, 记录内容是语句的原始逻辑,属于MySQL Server层。 所有的存储引擎只要发生了数据更新,都会产生binlog​日志。

  • 应用

实现数据同步(主从复制、分库分表同步等)、数据恢复 ,保证数据一致性。

比如,在分布式数据库架构中,可用Elasticsearch(ES)、Canal等,配合binlog记录的数据库变动操作,来实现分库分表的数据同步,保证数据一致性。

  • 能否实现crash-safe

不能。 crash之前,binlog只有在事务提交时才一次性写入内容,可能没写入完全MySQL就down了(事务没有提交成功),需要配合redo log才能进行crash-safe。

  • 数据库误删操作,如何执行数据库恢复?

找到距离误操作最近的时间节点的bin log,重放到临时数据库里,然后选择误删的数据节点,恢复到线上数据库。

  • binlog三种日志格式

① Statement-Based Replication (SBR)

这种模式下,Binlog 记录的是执行的 SQL 语句。 即主服务器执行的每个 SQL 语句都会被记录在 Binlog 中,从服务器再执行这些 SQL 语句。

这种方式可以减少 Binlog 的大小,但在某些复杂操作(如浮动函数或非确定性查询)下,可能会导致数据不一致。

② Row-Based Replication (RBR)

这种模式下,Binlog 记录的是数据行的变化。即每次对数据的修改(如 INSERT、UPDATE、DELETE)都会记录数据行的具体变化。

这种方式保证了主从数据的严格一致性,但会增加 Binlog 文件的大小。

③ Mixed-Based Replication (MBR)这是 SBR 和 RBR 的混合模式,

MySQL 会自动选择适当的格式,通常是 SBR 和 RBR 结合的方式。

对于简单的 SQL 语句使用 SBR,对于复杂的 SQL 语句或可能导致不一致的语句使用 RBR。

  1. 📌 redolog和binlog的区别是什么
特性Redo LogBinlog
主要目的确保事务的持久性,崩溃恢复 ⏳实现数据同步 、数据恢复
存储位置数据库内部,事务日志文件 💾。InnoDb存储引擎实现数据库外部,独立日志文件。Server 层实现的,所有引擎都可以使用 📂
使用场景事务恢复,崩溃后保证已提交数据不会丢失 🔧,可实现crash-safe数据复制、增量备份、分布式系统的数据同步 ,但不能实现crash-safe
日志记录方式循环写的方式记录,写到结尾时,会回到开头循环写日志通过追加的方式记录,当文件尺寸大于配置值后,后续日志会记录到新的文件上
事务提交信息记录事务提交前后的所有修改,包括未提交事务的信息只记录已提交的事务数据变更
数据恢复方式恢复未持久化的数据,保证事务一致性 🛠️恢复增量数据,主要用于主从复制或备份
实现方式InnoDB 存储引擎实现Server 层实现,所有引擎均可使用
日志级别基于页级别,记录数据页变化基于行或语句级别,记录数据变化
日志类型物理日志,记录数据页修改逻辑日志,记录语句级别的操作
数据库支持主要用于单一数据库实例的数据恢复支持跨数据库实例的数据同步
写入时机事务执行过程可以不断写入事务提交时才写入

  1. 📌为什么需要MySQL两阶段提交?

❓ 什么是MySQL 两阶段提交(2PC,Two-Phase Commit)

一个用于分布式系统中的事务管理协议, 确保在跨多个节点或数据库操作时保持数据一致性。

❓ 2PC是哪两阶段?

prepare阶段(预提交)和commit阶段(提交)

❓ 2PC执行流程?

redo log ->> bin log

Prepare 阶段: InnoDB 先将事务的 redo log 写盘,但并不真正提交事务,此时事务处于 “prepare” 状态。【redo log在写入后,进入prepare状态】

Commit阶段: MySQL Server 会将对应的 binlog 写盘。binlog 写盘完成后,InnoDB 将事务设置为 commit 状态。

❓binlog和redo log在2PC的作用是什么?

redo log​(重做日志)让InnoDB​存储引擎有了崩溃恢复的能力。

binlog​(归档日志)保证了MySQL​集群架构数据的一致性。

❓不进行2PC,而是只写redo log 或者 bin log两种情况会遇到什么问题?

① 只写redo log

只写 redo log 可以保证事务的持久性,但缺乏数据恢复、主从复制等重要功能,crash后bin log备份恢复时少了一次更新,与当前数据不一致。

② 只写bin log

只写 binlog 无法保证事务的持久性,会面临数据丢失和不一致的风险。

🔄 因此,为什么需要2PC?

数据一致性: redo log 和 binlog 要么都写入成功,要么都写入失败,避免了数据不一致。

事务持久性:redo log 保证了即使数据库崩溃,数据也可以恢复。bin log commit之前crash,重启后发现redo log是prepare状态且bin log完整,则会自动让存储引擎commit事务。

③ 主从复制的正确性:binlog 保证了主从复制的数据一致性。

  1. 📌 什么是undo log?
  • 介绍

undo log 叫做回滚日志, 用于记录数据被修改前的信息。

  • 对比redo log
特性Redo Log (重做日志)Undo Log (撤销日志)
主要目的保证事务的持久性 (Durability)保证事务的原子性(Atomicity)和一致性 (Consistency)
记录内容物理修改(数据页的修改)逻辑操作的反向操作
存储位置磁盘上的 redo log 文件数据库中的数据页
工作方式重放事务修改,恢复崩溃状态执行反向操作,实现回滚
主要用途崩溃恢复,保证数据不丢失事务回滚、MVCC,保证数据一致性
写入方式顺序写入、循环写入非循环写入,直至事务结束
  • 举例说明区别

假设一个银行转账操作:A 向 B 转账 100 元。如果这个事务在执行过程中,数据库突然崩溃,那么在重启后,

.Redo Log的作用:
数据库会读取redo log,发现A的账户需要减少100元,B的账户需要增加100元。数据库会重新执行这些操作,保证最终结果的正确性。

Undo Log的作用:
数据库发现B的账户不存在了,那么数据库会读取undo log,发现需要撤销A的账户减少100元的操作,这样A的账户余额会恢复到事务开始前的状态,保证了事务的原子性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值