如何在MySQL 8.0中查看当前事务占用的Undo Log表空间大小

陌婷大大_1276

陌婷大大_1276

2026-09-27

726人浏览

原创

可查询INFORMATION_SCHEMA.INNODB_TABLESPACES获取Undo表空间基础状态,执行SELECT NAME, SPACE_TYPE, FILE_NAME, FILE_SIZE, ALLOCATED_SIZE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE SPACE_TYPE = 'Undo',其中STATE为active表示正在使用,inactive表示已停用待截断。

如何在mysql 8.0中查看当前事务占用的undo log表空间大小

查 information_schema.innodb_tablespaces 看表空间基础状态

MySQL 8.0 中,Undo 表空间信息不暴露在 performance_schema 或事务级视图中,而是集中存于 information_schema.innodb_tablespaces。它能告诉你每个 Undo 表空间的文件名、大小、状态,但**不直接反映“当前事务”占用了多少**——因为 Undo 是按回滚段(rseg)动态分配、跨事务复用的,没有一对一映射。

执行以下语句获取当前所有 Undo 表空间快照:

SELECT NAME, SPACE_TYPE, FILE_NAME, FILE_SIZE, ALLOCATED_SIZE, STATE 
FROM information_schema.INNODB_TABLESPACES 
WHERE SPACE_TYPE = 'Undo';

注意字段含义:

  • FILE_SIZE:文件系统上该 .ibu 文件的总大小(字节),由操作系统决定
  • ALLOCATED_SIZE:InnoDB 当前已从该文件中分配出去、用于存放 Undo 记录的实际页数换算值(通常 ≈ FILE_SIZE,除非刚 truncate 过)
  • STATE:为 active 表示正在被 Purge 线程和新事务使用;inactive 表示已停用,等待自动截断

用 INFORMATION_SCHEMA.FILES 验证物理文件路径与大小

INNODB_TABLESPACES 的 FILE_NAME 字段有时显示相对路径或别名(如 undo_001),无法直接对应磁盘文件。此时需结合 INFORMATION_SCHEMA.FILES 查真实路径:

SELECT FILE_NAME, TABLESPACE_NAME, TOTAL_EXTENTS, EXTENT_SIZE 
FROM INFORMATION_SCHEMA.FILES 
WHERE FILE_TYPE = 'UNDO LOG';

该结果中的 FILE_NAME 是绝对路径(如 /data/mysql/data/undo_001.ibu),可配合系统命令验证:

  • ls -lh /data/mysql/data/undo_*.ibu —— 看实际文件体积是否与 FILE_SIZE 一致
  • du -h /data/mysql/data/undo_*.ibu —— 排除稀疏文件干扰,确认真实磁盘占用

如果两者差异大(比如 FILE_SIZE 显示 16M,du 显示 71G),说明该 Undo 表空间已被撑大且尚未被截断,背后大概率存在长事务或未提交事务拖住了 oldest active read view。

定位“谁在拖住 Undo 清理”:查活跃事务与读视图

真正影响 Undo 空间能否回收的,不是“当前事务写了多少 Undo”,而是**最老的活跃读视图(oldest active read view)是否释放**。这个视图由最早未结束的事务(包括只读事务)持有。

MySQL8 CRM Schema Design Expert
MySQL8 CRM Schema Design Expert

面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。

下载

关键查询如下:

SELECT trx_id, trx_state, trx_started, trx_mysql_thread_id, trx_query 
FROM information_schema.INNODB_TRX 
ORDER BY trx_started ASC 
LIMIT 5;

重点关注:

  • trx_state = 'RUNNING' 且 trx_started 时间极早(比如几小时甚至几天前)→ 极可能是元凶
  • trx_query IS NULL 但 trx_state = 'ACTIVE' → 可能是空闲连接未断开,或应用层开启事务后忘了 commit/rollback
  • 搭配 SHOW PROCESSLIST 看对应线程是否处于 Sleep 状态,进一步确认是否连接泄漏

注意:INNODB_TRX 不显示只读事务(如带 START TRANSACTION READ ONLY 的),但这类事务同样会阻止 Undo 清理。若怀疑,可用 SELECT * FROM performance_schema.threads WHERE TYPE = 'FOREGROUND' AND PROCESSLIST_COMMAND = 'Sleep' 辅助排查长时间空闲连接。

为什么不能精确到“单个事务占了多少 Undo”

Undo Log 在 InnoDB 内部以回滚段(rseg)为单位组织,每个 rseg 可服务多个并发事务,事务的 Undo 记录写入是追加+复用的,且会被 Purge 线程异步清理。这意味着:

  • 没有 per-transaction 的 Undo 字节数统计字段(INNODB_TRX 里没有类似 undo_bytes_used 的列)
  • 即使你 kill 掉一个大事务,其 Undo 也不会立刻释放,而是等 Purge 线程后续扫描并截断整个 undo file
  • innodb_max_undo_log_size 控制的是单个 Undo 表空间触发截断的阈值,不是单事务限额

所以,运维中真正要盯的不是“某个事务占了多少”,而是“有没有事务卡太久”,以及 “innodb_undo_log_truncate 是否开启 + innodb_purge_rseg_truncate_frequency 是否设得够低”。否则,就算你看到 ALLOCATED_SIZE 持续上涨,也找不到具体是哪个 SQL 导致的——它只是表象,根因永远在事务生命周期管理上。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql mysql 8.0 mysql开发

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4683

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

971

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1229

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6681

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3423

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6660

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

9201

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1250

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1092

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 193人学习