赞
踩
Bin log、Redo log 和 Undo log 的区别,是 MySQL 的高频面试题,大厂校招面试90%会问。
在 MySQL 数据库中,Bin log、Redo log 和 Undo log 都是极为重要的日志文件。
MySQL 实现事务、崩溃恢复、集群的主从复制等,底层都离不开日志,可以说日志是 MySQL 的内核所在。
只有了解 MySQL 日志,才算是彻底搞懂 MySQL。
本文主要探讨 Bin log、Redo log 和 Undo log 的区别。
01
Bin log、Redo log 和 Undo log 的概述
Bin log 记录的是逻辑日志,它以追加的方式记录数据库的修改操作,采用二进制格式进行存储。
Bin log 包含了操作语句、或语句集合的原始二进制数据,可以通过解析和回放 Bin log,来重新执行其中的操作。
数据恢复和故障恢复:通过分析和回放 Bin log,可以将数据库恢复到故障发生之前的状态。当数据库发生故障或数据丢失时,可以利用Bin log 进行数据恢复。
主从复制:在主从架构中,Bin log 用于同步主数据库的数据变更到从数据库。主数据库将其修改操作记录到 Bin log 中,从数据库通过解析和应用 Bin log 来复制主数据库的数据变更,从而保持主从数据的一致性。
数据备份:通过定期备份 Bin log,可以实现对数据库的增量备份。将备份的 Bin log 文件与全量备份结合使用,可以还原数据库到指定的时间点。
示例:
假设我们有一个名为products的商品表,其中包含商品的名称和价格。
现在,我们发现商品价格发生了错误的修改,并且需要通过 Bin log 记录来定位和修复这个问题。
假设商品 ID 为 1 的商品价格,被错误地修改为 2000。
UPDATE products SET price = 2000 WHERE id = 1;
通过查看 Bin log 记录,我们可以定位到这个修改操作,并通过恢复正确的价格来修复数据。
Bin log 的三种日志格式
针对不同的应用场景,Binlog 推出了三种工作模式 Statement、Row、Mixed,以满足对数据库的需求。
这三种模式的选型参考思路:
使用 MySQL 特殊功能较少,例如存储过程、触发器、函数等,用 Statement 模式。
使用 MySQL 特殊功能较多,用 Mixed 模式。
使用 MySQL 特殊功能较多,同时希望数据最大化一致,用 Row 模式。
Bin Log 采用预写日志 WAL,即先写日志,再写磁盘。
写入 Bin Log 之后的事务流程:第5步箭头下是binlog buffer
先写处于 prepare 状态的 Redo Log,事务提交后,再写处于 commit 状态的 Redo Log,即二阶段提交。
那为什么不直接持久化到磁盘呢?
直接写入磁盘会严重影响到性能:
InnoDB 在磁盘中存储的基本单元是页,可能本次修改只变更一页中几个字节,但是需要刷新整页的数据,就很浪费资源。
一个事务可能修改了多页中的数据,页之间又是不连续的,就会产生随机IO,性能更差。
Bin log 的开启和配置:需要确保 Bin log 已经开启,并根据实际需求配置相关参数,如 Bin log 格式、Bin log 大小和保留时间等。
定期备份 Bin log :为了保证数据恢复和故障恢复的能力,需要定期备份 Bin log 文件。
Redo log 以循环写入的方式记录数据库的修改操作,采用固定大小的物理日志文件进行存储。
Redo log 记录了数据库页的物理修改,而非语句级别的逻辑操作。
Redo log 的作用:
保证事务的持久性:通过将事务的修改操作记录到 Redo log 中,可以确保在系统故障或崩溃发生时,已提交的事务能够被正确地重新执行,保证数据的一致性。
减少磁盘IO操作:Redo log的写入是顺序追加的方式,相比于随机写入数据库文件,它可以减少磁盘IO的操作,提升数据库的性能。
数据库恢复和故障恢复:通过分析和应用 Redo log,可以将数据库恢复到故障发生之前的状态。
数据库性能优化:合理配置 Redo log 的大小和数量,可以根据系统负载和事务处理量来提升数据库的性能。
示例:
假设用户在下订单后,数据库发生了突然的崩溃,我们可以使用 Redo log 来恢复用户的订单信息。
- -- 在事务中创建订单
- BEGIN;
- INSERT INTO orders (user_id, product_id, quantity) VALUES (1, 100, 2);
- COMMIT;
当数据库发生崩溃时,使用 Redo log 中的内容重新应用这个事务,就能恢复用户的订单信息了。
那在啥时候写入 Redo log 呢?
Redo log 同样采用预写日志 WAL 的方式。
在使用 Redo log 时,需要注意:
Redo log 的大小和数量配置:根据实际需求和系统负载,配置合适的Redo log大小和数量,以确保足够的持久化能力和性能。
定期刷写 Redo log :为了保证已提交的事务能够及时写入磁盘,需要配置合理的 Redo log 刷写策略,以避免数据丢失。
监控 Redo log 的使用情况:定期监控 Redo log 的使用情况,以便及时调整配置参数,并确保数据库的可靠性和性能。
Undo log 以逻辑方式记录数据库事务的修改操作,它记录了事务执行过程中旧值的备份,以便在事务回滚或并发控制需要时能够恢复数据。
例如:当我们执行一条 insert 语句时,Undo Log 就会记录一条相反的 delete 语句。
Undo log 的作用:
事务回滚:在事务执行过程中,如果出现错误或需要回滚操作,Undo log 可以恢复事务执行之前的数据状态,实现事务的回滚操作。
并发控制:通过 Undo log 的使用,数据库可以实现并发事务的隔离性和一致性,避免数据读取和写入的冲突。
示例:
假设在用户付款过程中,发现付款金额错误,我们需要回滚事务并使用 Undo log 中记录的旧值来恢复正确的付款金额。
- -- 在事务中更新付款金额
- BEGIN;
- UPDATE payments SET amount = 100.00 WHERE id = 1;
-
- -- 假设发现付款金额错误,需要回滚事务并恢复旧值
- ROLLBACK;
通过回滚事务并使用 Undo log 中记录的旧值,我们可以将数据库中的付款金额恢复到事务开始之前的状态,保证数据的一致性。
Undo Log 如何回滚到上一个版本
首先,通过两个隐藏列 trx_id(最近一次提交事务的 ID)和 roll_pointer(上个版本的地址),建立一个版本链。
然后,在事务中读取时生成一个 ReadView(读视图),在 Read Committed 隔离级别下,每次读取都会生成一个读视图,而在 Repeatable Read 隔离级别下,只会在第一次读取时生成一个读视图。
在使用 Undo log 时,需要注意:
Undo log 的管理和清理:由于 Undo log 会占用存储空间,需要定期清理不再需要的 Undo log,以释放存储空间。
配置 Undo log 的大小:根据数据库的并发事务量和数据修改量,合理配置 Undo log 的大小,以确保足够的空间来存储 Undo log 信息。
定期备份 Undo log:为了避免数据丢失,定期备份 Undo log 文件,以便在需要恢复数据时使用。
01
Bin log、Redo log 和 Undo log 的区别
Bin log:以二进制格式记录数据库的修改操作。
Redo log:以固定大小的物理日志文件记录数据库页的物理修改。
Undo log:以逻辑方式记录事务执行过程中旧值的备份。
Bin log:用于数据恢复、主从复制、数据审计和数据备份等。
Redo log:用于保证事务的持久性和故障恢复。
Undo log:用于事务的回滚和并发控制。
03
总结
通过本文,我们掌握了 Bin log、Redo log 和 Undo log 的概念、作用及其区别。
Bin log、Redo log 和 Undo log 都是 MySQL 中最为重要的日志机制。MySQL 实现事务、崩溃恢复、集群的主从复制等,底层都离不开日志,可以说日志是 MySQL 的内核所在。
MySQL InnoDB 引擎使用 Redo log (重做日志)保证事务的持久性。
使用 Undo log (回滚日志))来保证事务的原子性。
MySQL 数据库的数据备份、主备、主主、主从都离不开 Bin log,需要依靠 Bin log 来同步数据,保证数据一致性。
只有了解 MySQL 日志,才算是彻底搞懂 MySQL。
我是爱分享的程序员宝妹儿,分享即学习。
如果觉得有用,请顺手【点赞】支持下哦,这将是对宝妹儿的最大鼓励,谢谢~
PS.
本文收录于宝妹儿精编的2023版《 MySQL 大厂高频面试题大全》PDF。
宝妹儿精编的2023版《MySQL 大厂高频面试题大全》PDF,已收录100+道真题,近30000字,会长期迭代,持续更新。
吃透它,应付MySQL面试没问题。
公众号Java面试题宝,回复关键字:mysql,即可获取。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。