MySQL日志之回滚日志(undo log)

本文详细介绍了MySQL中Undo日志的概念、作用及工作原理。Undo日志用于事务回滚和MVCC,它在事务开始前保存数据版本,并在提交后由purge线程判断何时释放。在MySQL5.6之前,Undo日志存储在共享表空间,而5.6之后可配置为独立文件。Undo日志的大量生成可能导致共享表空间扩大,而5.7后的独立表空间配置有助于管理空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作用:

保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读

内容:

逻辑格式的日志,在执行undo的时候,仅仅是将数据从逻辑上恢复至事务之前的状态,而不是从物理页面上操作实现的,这一点是不同于redo log的。

什么时候产生:

事务开始之前,将当前是的版本生成undo log,undo 也会产生 redo 来保证undo log的可靠性

什么时候释放:

当事务提交之后,undo log并不能立马被删除,而是放入待清理的链表,由purge线程判断是否由其他事务在使用undo段中表的上一个事务之前的版本信息,决定是否可以清理undo log的日志空间。

对应的物理文件:

MySQL5.6之前,undo表空间位于共享表空间的回滚段中,共享表空间的默认的名称是ibdata,位于数据文件目录中。

MySQL5.6之后,undo表空间可以配置成独立的文件,但是提前需要在配置文件中配置,完成数据库初始化后生效且不可改变undo log文件的个数
如果初始化数据库之前没有进行相关配置,那么就无法配置成独立的表空间了。

关于MySQL5.7之后的独立undo 表空间配置参数如下:

innodb_undo_directory = /data/undospace/ –undo独立表空间的存放目录
innodb_undo_logs = 128 –回滚段为128KB
innodb_undo_tablespaces = 4 –指定有4个undo log文件
如果undo使用的共享表空间,这个共享表空间中又不仅仅是存储了undo的信息,共享表空间的默认为与MySQL的数据目录下面,其属性由参数innodb_data_file_path配置。

这里写图片描述

其他:

undo是在事务开始之前保存的被修改数据的一个版本,产生undo日志的时候,同样会伴随类似于保护事务持久化机制的redolog的产生。

默认情况下undo文件是保持在共享表空间的,也即ibdatafile文件中,当数据库中发生一些大的事务性操作的时候,要生成大量的undo信息,全部保存在共享表空间中的。

因此共享表空间可能会变的很大,默认情况下,也就是undo 日志使用共享表空间的时候,被“撑大”的共享表空间是不会也不能自动收缩的。

因此,mysql5.7之后的“独立undo 表空间”的配置就显得很有必要了。

参考文章

### 关于 MySQL 回滚日志的使用与管理 MySQL回滚日志(Rollback Log),也称为 Undo 日志,主要用于支持事务的 ACID 属性中的原子性和一致性。Undo 日志存储在 InnoDB 存储引擎中,用于记录数据修改前的状态,以便在事务失败时能够恢复到原始状态。 #### 1. **Undo 日志的作用** Undo 日志的主要功能包括: - 支持事务回滚操作:当事务被中断或显式回滚时,InnoDB 使用 Undo 日志来撤销未提交的更改[^4]。 - 提供多版本并发控制(MVCC):通过保存旧版本的数据,使得其他事务能够在读取数据时不被阻塞,即使该数据正在被另一个事务更新[^4]。 #### 2. **Undo 日志的空间管理** Undo 日志通常存储在共享表空间(system tablespace)或独立的 undo 表空间中。可以通过配置参数 `innodb_undo_log_truncate` 和 `innodb_max_undo_logs` 来管理和优化 Undo 日志的空间占用: - 参数 `innodb_undo_log_truncate` 控制是否启用自动截断 Undo 日志文件的功能,默认值为 OFF。开启此选项可以帮助释放不再使用的磁盘空间。 - 参数 `innodb_max_undo_logs` 定义了最大允许的 Undo 日志数量,增加这个值可以在高并发场景下提高性能[^4]。 #### 3. **清理机制** 为了防止 Undo 日志无限增长,InnoDB 设计了一套清理机制。当某个事务完成后,其对应的 Undo 记录会被标记为可删除。随后,后台线程会定期扫描这些记录并将其物理删除。需要注意的是,如果存在长时间运行的查询或者只读事务,则可能会阻止某些 Undo 日志的回收,从而导致表空间膨胀。 #### 4. **监控 Undo 日志** 可以利用以下视图和命令来监控 Undo 日志的状态以及潜在问题: - 查询 `information_schema.INNODB_METRICS` 获取有关 Undo 日志的具体统计信息; - 查看 `performance_schema.table_io_waits_summary_by_index_usage` 判断是否有因等待 Undo 资源而引发的延迟现象。 ```sql SELECT * FROM information_schema.INNODB_METRICS WHERE NAME LIKE 'undo%'; ``` --- ### 示例代码展示如何调整 Undo 配置 以下是设置 Undo 相关参数的一个简单例子: ```bash [mysqld] innodb_undo_tablespaces=2 # 创建两个独立的 Undo 表空间 innodb_undo_log_truncate=ON # 启用 Undo 日志截断功能 innodb_max_undo_logs=128 # 设置最大的 Undo Logs 数量 ``` 重启服务使新配置生效后,可通过下面 SQL 命令验证变更情况: ```sql SHOW VARIABLES LIKE '%undo%'; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值