mysql 8.0.30+ 必须用 innodb_redo_log_capacity 动态设总容量,路径固定在 datadir/#innodb_redo/ 下32个文件,旧参数被忽略;8.0.29及更早需停库删 ib_logfile* 并配置 innodb_log_group_home_dir 和 innodb_log_file_size 才生效。

必须分版本处理:MySQL 8.0.30+ 和 8.0.29 及更早版本的 redo log 配置逻辑完全不同,混用会导致启动失败或参数被忽略。
MySQL 8.0.30+:用 innodb_redo_log_capacity 动态设总容量,路径固定在 datadir/#innodb_redo/
该版本已废弃 innodb_log_group_home_dir、innodb_log_file_size 等旧参数。InnoDB 自动把 redo log 写入 datadir/#innodb_redo/ 下的 32 个文件(如 #ib_redo2923),你无法指定其他路径——innodb_log_group_home_dir 被完全忽略。
- 想让 redo log 落在 NVMe 上?唯一办法是把整个
datadir迁移到 NVMe,或用符号链接将datadir/#innodb_redo指向 NVMe 分区(需确保 MySQL 启动时能解析该链接,且 SELinux/AppArmor 不拦截) - 在线调容量:
SET GLOBAL innodb_redo_log_capacity = 4294967296;(4GB),值会立即生效,底层文件渐进重调度 - 配置文件中只写这一行:
innodb_redo_log_capacity = 4294967296;若仍保留innodb_log_file_size,启动时会报[Warning] [MY-013869] Ignored deprecated configuration parameter并跳过该值 - 验证是否生效:
SELECT @@innodb_redo_log_capacity;+SELECT * FROM performance_schema.innodb_redo_log_files;看FILE_NAME是否在#innodb_redo/下、SIZE_IN_BYTES是否接近总容量 / 32
MySQL 8.0.29 及更早:停库删文件 + 改 innodb_log_group_home_dir 才有效
直接拷贝 ib_logfile0/ib_logfile1 到新路径再改配置,必然启动失败,报错类似 InnoDB: Error: log file ./ib_logfile0 is of different size——这是 InnoDB 对日志头校验(LSN、checksum、大小)的硬性保护。
- 正确流程只有四步:先执行
SET GLOBAL innodb_fast_shutdown = 0;→systemctl stop mysql→ps aux | grep mysql确认无残留进程 →rm -f /var/lib/mysql/ib_logfile*(路径按实际datadir调整) - 创建目标目录并授权:
mkdir -p /nvme/mysql-redo→chown mysql:mysql /nvme/mysql-redo→ 挂载时加noatime,nobarrier - 配置文件写死路径:
innodb_log_group_home_dir = /nvme/mysql-redo/,同时建议配innodb_log_file_size = 1G(总大小控制在 2–4GB) - 重启后 InnoDB 自动重建
ib_logfile0/ib_logfile1,大小严格按配置生成;ls -lh /nvme/mysql-redo/可验证
Undo log:无论哪个版本,都可用 innodb_undo_directory 指向独立高速盘
这是最干净的分离方式,无需停库(但需重启生效),且 MySQL 8.0 全系支持。
- 路径必须提前创建并属主正确:
mkdir -p /nvme/mysql-undo→chown mysql:mysql /nvme/mysql-undo - 配置项写入
[mysqld]段:innodb_undo_directory = /nvme/mysql-undo/ - 配套启用自动清理:
innodb_undo_log_truncate = ON+innodb_max_undo_log_size = 2147483648(2GB),防止空间无限增长 - 注意:该设置只对独立 undo 表空间生效;若仍用系统表空间(
ibdata1),此参数无效——需先通过CREATE UNDO TABLESPACE创建独立表空间并设为ACTIVE
容易被忽略的性能配套项
只挪路径不调参,NVMe 的低延迟优势基本浪费。
-
innodb_flush_method = O_DIRECT:在 NVMe 上绕过 OS page cache,减少内存拷贝;但必须满足“服务器独占、内存 ≥64G、未使用 LVM/云盘虚拟层”,否则反而引发额外 IO 或 RSS 暴涨 OOM -
innodb_flush_log_at_trx_commit = 1:金融类场景必须保持;若业务允许 1 秒内数据丢失,可设为 2,写入性能提升明显 - undo 和 redo 不要放在同一块 NVMe 盘的同一挂载点下——它们都是顺序写密集型,物理竞争会抵消 IOPS 优势;最好分盘或至少分挂载子目录











