admin管理员组文章数量:1487745
Mysql日志redo log、undo log、bin log
Mysql中日志文件是非常重要的,也是面试的高频问题。Mysql中日志分为三种,分别是redo log、undo log和bin log,他们在事务回滚,崩溃恢复,主从复制等功能上都是极其重要的,可以说是后端程序员必须掌握的知识点,只是了解Mysql日志,才是真正了解Mysql,下面我们就来看下他们三种日志分别都有什么作用。
redo log
作用:
- 确保数据的持久性:当数据库中的数据发生修改时,这些修改操作会先记录在
redo log
中。即使在数据还未真正写入磁盘(数据文件)之前数据库发生故障,例如服务器突然断电,在重新启动时,可以通过读取redo log
来重放之前的操作,将数据恢复到故障前的状态,保证数据不会因为意外丢失。
特点:
- 物理日志:
redo log
记录的是数据页的物理修改,例如某个页中的偏移量为多少的位置的值从 A 变成了 B 。 - 循环写入:
redo log
是一个固定大小的环形缓冲区,会循环地进行写入。当写满时,会覆盖之前的日志内容。 - 先写日志后写磁盘:为了提高性能,数据的修改操作先写入
redo log
,然后再逐步刷新到磁盘中的数据文件。
写入过程:
- 事务执行修改操作时,生成对应的
redo log
记录并写入到redo log buffer
(重做日志缓冲区)。 - 当
redo log buffer
中的内容积累到一定程度,或者遇到特定的时机(如事务提交),会将其刷新到磁盘的redo log file
(重做日志文件)中。
示例:假设一个事务要将表中某行数据的 age
字段从 18 增加到 20。这个修改操作会生成相应的 redo log
记录,如“将表 X 中偏移量为 Y 的位置的 age
字段的值从 18 改为 20”。即使在数据还没真正写入磁盘中的表时数据库出现故障,重新启动后,通过读取 redo log
中的这条记录,就能将数据恢复到正确的状态。
undo log
作用:
- 事务回滚:当一个事务执行过程中出现错误或需要回滚时,
undo log
用于将数据恢复到事务开始之前的状态。这确保了事务的原子性,即要么全部成功,要么全部失败。 - 实现多版本并发控制(MVCC):通过保存数据的多个版本,
undo log
支持不同的事务在同一时间看到不同的数据版本,从而提高了数据库的并发性能。这使得一个事务读取数据时不会被其他正在修改数据的事务阻塞。
特点:
- 逻辑日志:
undo log
记录的是对数据的逻辑操作,例如插入、删除、更新等,而不是像redo log
那样记录数据页的物理修改。 - 与事务关联:每个事务都有自己的
undo log
链,这些undo log
记录按照事务执行的顺序链接在一起。 - 存储空间管理:随着事务的提交和不再需要的
undo log
被清理,以释放存储空间。
示例:
假设事务 A 要将表中某行数据的 age
字段从 25 更新为 30。此时,undo log
会记录前 age
字段的值 25。如果事务 A 回滚,就可以根据 undo log
中的记录将 age
字段的值恢复为 25。
在 MVCC 场景中,事务 B 在读这行数据时,如果事务 A 尚未提交,事务 B 可以通过 undo log
找到之前的版本进行读取,而不会被事务 A 的修改所阻塞。
bin log
在 MySQL 中,binlog
(二进制日志)是一种重要的日志类型,它是以追加的方式记录数据库的修改操作,采用二进制格式进行存储。bin log 包含了操作语句、或语句集合的原始二进制数据,可以通过解析和回放 Bin log,来重新执行其中的操作。
作用:
- 主从复制:在主从复制架构中,主库将数据库的变更操作记录在
binlog
中,从库通过读取并应用主库的binlog
来实现数据的同步。 - 数据恢复:可以基于
binlog
进行数据的恢复操作,特别是在全量备份的基础上,通过应用备份时间点之后的binlog
来恢复到特定的时间点。
特点:
- 逻辑日志:记录的是对数据的逻辑更改,例如执行的 SQL 语句或事件。
- 可以归档:可以将
binlog
进行归档保存,以便在需要时进行查询和分析。 - 跨存储引擎:与存储引擎无关,无论使用 InnoDB、MyISAM 还是其他存储引擎,
binlog
的记录和功能都是一致的。
示例:
假设执行了一条 UPDATE
语句修改了表中的数据,binlog
会记录这条 UPDATE
语句的详细信息。在主从复制中,从库接收到这个 binlog
后,会重新执行相同的 UPDATE
语句,以保持数据的一致性。
总结
redo log
(重做日志)主要作用是确保数据的持久性,在数据库故障时用于恢复数据。
undo log
(回滚日志)支持事务回滚和实现多版本并发控制(MVCC)。
binlog
(二进制日志)主要用于主从复制和数据恢复。
这三种日志相互配合,共同保障了 MySQL 数据库的事务处理、数据一致性、数据恢复和主从复制等重要功能。
本文标签: Mysql日志redo logundo logbin log
版权声明:本文标题:Mysql日志redo log、undo log、bin log 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/shuma/1755031024a3182681.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论