Mysql中日志文件是非常重要的,也是面试的高频问题。Mysql中日志分为三种,分别是redo log、undo log和bin log,他们在事务回滚,崩溃恢复,主从复制等功能上都是极其重要的,可以说是后端程序员必须掌握的知识点,只是了解Mysql日志,才是真正了解Mysql,下面我们就来看下他们三种日志分别都有什么作用。
作用:
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
支持不同的事务在同一时间看到不同的数据版本,从而提高了数据库的并发性能。这使得一个事务读取数据时不会被其他正在修改数据的事务阻塞。特点:
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 的修改所阻塞。
在 MySQL 中,binlog
(二进制日志)是一种重要的日志类型,它是以追加的方式记录数据库的修改操作,采用二进制格式进行存储。bin log 包含了操作语句、或语句集合的原始二进制数据,可以通过解析和回放 Bin log,来重新执行其中的操作。
作用:
binlog
中,从库通过读取并应用主库的 binlog
来实现数据的同步。binlog
进行数据的恢复操作,特别是在全量备份的基础上,通过应用备份时间点之后的 binlog
来恢复到特定的时间点。特点:
binlog
进行归档保存,以便在需要时进行查询和分析。binlog
的记录和功能都是一致的。示例:
假设执行了一条 UPDATE
语句修改了表中的数据,binlog
会记录这条 UPDATE
语句的详细信息。在主从复制中,从库接收到这个 binlog
后,会重新执行相同的 UPDATE
语句,以保持数据的一致性。
redo log
(重做日志)主要作用是确保数据的持久性,在数据库故障时用于恢复数据。
undo log
(回滚日志)支持事务回滚和实现多版本并发控制(MVCC)。
binlog
(二进制日志)主要用于主从复制和数据恢复。
这三种日志相互配合,共同保障了 MySQL 数据库的事务处理、数据一致性、数据恢复和主从复制等重要功能。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。