前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mysql日志redo log、undo log、bin log

Mysql日志redo log、undo log、bin log

原创
作者头像
BLACK595
发布2024-10-02 11:00:07
710
发布2024-10-02 11:00:07

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 中的这条记录,就能将数据恢复到正确的状态。

image.png
image.png

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。

image.png
image.png

在 MVCC 场景中,事务 B 在读这行数据时,如果事务 A 尚未提交,事务 B 可以通过 undo log 找到之前的版本进行读取,而不会被事务 A 的修改所阻塞。

bin log

在 MySQL 中,binlog(二进制日志)是一种重要的日志类型,它是以追加的方式记录数据库的修改操作,采用二进制格式进行存储。bin log 包含了操作语句、或语句集合的原始二进制数据,可以通过解析和回放 Bin log,来重新执行其中的操作。

作用

  1. 主从复制:在主从复制架构中,主库将数据库的变更操作记录在 binlog 中,从库通过读取并应用主库的 binlog 来实现数据的同步。
  2. 数据恢复:可以基于 binlog 进行数据的恢复操作,特别是在全量备份的基础上,通过应用备份时间点之后的 binlog 来恢复到特定的时间点。

特点

  1. 逻辑日志:记录的是对数据的逻辑更改,例如执行的 SQL 语句或事件。
  2. 可以归档:可以将 binlog 进行归档保存,以便在需要时进行查询和分析。
  3. 跨存储引擎:与存储引擎无关,无论使用 InnoDB、MyISAM 还是其他存储引擎,binlog 的记录和功能都是一致的。

示例

假设执行了一条 UPDATE 语句修改了表中的数据,binlog 会记录这条 UPDATE 语句的详细信息。在主从复制中,从库接收到这个 binlog 后,会重新执行相同的 UPDATE 语句,以保持数据的一致性。

image.png
image.png

总结

redo log(重做日志)主要作用是确保数据的持久性,在数据库故障时用于恢复数据。

undo log(回滚日志)支持事务回滚和实现多版本并发控制(MVCC)。

binlog(二进制日志)主要用于主从复制和数据恢复。

这三种日志相互配合,共同保障了 MySQL 数据库的事务处理、数据一致性、数据恢复和主从复制等重要功能。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • redo log
  • undo log
  • bin log
  • 总结
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档