mysql 8.0 初始化前唯一应配置的 undo 参数是 innodb_undo_directory,仅影响默认生成的 undo_001.ibu 和 undo_002.ibu 的初始存放位置,且仅首次初始化生效;innodb_undo_tablespaces 已废弃,设了无效并触发警告。

MySQL 8.0 初始化前只该配 innodb_undo_directory
初始化(mysqld --initialize)前,唯一值得设的 Undo 相关参数是 innodb_undo_directory。它只影响默认生成的两个隐式 Undo 表空间(undo_001.ibu、undo_002.ibu)的初始位置,且仅在首次初始化时生效。
常见错误是硬塞 innodb_undo_tablespaces = 4 —— 这个参数从 8.0.14 起已废弃,8.0.21 后彻底移除。设了不仅无效,还会在错误日志里打警告:[Warning] InnoDB: Ignoring innodb_undo_tablespaces because it is deprecated.
- 目标路径必须提前创建,属主为
mysql用户:例如mkdir -p /ssd/mysql/undo && chown mysql:mysql /ssd/mysql/undo - 配置写在
my.cnf的[mysqld]段下:innodb_undo_directory = /ssd/mysql/undo - 初始化完成后改这个参数重启,完全不会移动已有
undo_*.ibu文件
运行中新增 Undo 表空间必须用 SQL 命令
MySQL 8.0 的 Undo 表空间是「对象化」的,数量、路径、状态全靠 SQL 管理,不能靠配置文件热加载。
想加第三个表空间?直接执行:
CREATE UNDO TABLESPACE undo_003 ADD DATAFILE '/ssd/mysql/undo/undo_003.ibu';
注意:ADD DATAFILE 后必须是绝对路径,且该路径需在 innodb_directories 列表中,或直接落在 datadir 下;文件名必须以 .ibu 结尾。
- 新创建的表空间默认处于
INACTIVE状态,需手动激活:ALTER UNDO TABLESPACE undo_003 SET ACTIVE; - 停用旧表空间前,必须确认无活跃事务依赖它:
ALTER UNDO TABLESPACE undo_001 SET INACTIVE; - 删除前先停用,再
DROP UNDO TABLESPACE undo_001;,否则报错
innodb_max_undo_log_size 和 innodb_undo_log_truncate 决定空间回收节奏
这两个参数控制 Undo 表空间是否收缩、何时收缩。它们对所有独立 Undo 表空间(包括默认那俩)都有效,但对系统表空间(ibdata1)无效。
典型配置:
innodb_max_undo_log_size = 2147483648 # 2G<br>innodb_undo_log_truncate = ON
当某个 undo_*.ibu 文件大小超过 innodb_max_undo_log_size,且 innodb_undo_log_truncate = ON 时,Purge 线程会在空闲时尝试截断它。
- 截断是否成功,还取决于
innodb_purge_rseg_truncate_frequency(默认 128)——值越小,检查越频繁,但 CPU 开销略增 - 如果
History list length长期很高(查SHOW ENGINE INNODB STATUS\G),说明 Purge 跟不上,光调大innodb_max_undo_log_size没用,得看innodb_purge_threads是否够用 - 别把
innodb_max_undo_log_size设太小(比如 512M),否则会频繁触发截断,反而加重 I/O
监控不能只看 ibdata1 大小
很多人发现 ibdata1 文件大小稳定,就以为 Undo 没在增长 —— 这是错觉。MySQL 8.0 的 Undo 已完全脱离 ibdata1,全部存于独立的 .ibu 文件中。
真实水位要看两处:
-
SHOW ENGINE INNODB STATUS\G中的UNDO LOG段,重点关注History list length值是否持续攀升 -
SELECT * FROM information_schema.innodb_tablespaces WHERE space_type = 'undo';查每个undo_*.ibu的file_size和state - 磁盘上直接
ls -lh /path/to/undo_*.ibu,结合df -h看剩余空间
最危险的情况是:History list length 很高,而某个 undo_*.ibu 文件已接近磁盘上限 —— 这时事务可能被阻塞,甚至导致写入失败。











