修改 my.cnf 中的 innodb_log_file_size 後重啟 MySQL 失敗,錯誤日志:
InnoDB: Error: log file /usr/local/mysql/data/ib_logfile0 is of different size
InnoDB: 5242880 bytes
InnoDB: than specified in the .cnf file 0 104857600 bytes!
[ERROR] Can't init databases
[ERROR] Aborting
InnoDB 重做日志文件(ib_logfile0, ib_logfile1...)的物理大小與配置參數 innodb_log_file_size 不一致。InnoDB 啟動時會強制校驗,不匹配則拒絕啟動以防數據損壞。
systemctl stop mysqld 或 mysqladmin -uroot -p shutdownmkdir /backup/ib_log_$(date +%F)mv /var/lib/mysql/ib_logfile* /backup/ib_log_$(date +%F)/[mysqld]
innodb_log_file_size = 100M # 新值
innodb_log_files_in_group = 2 # 文件組數量,通常 2-4
systemctl start mysqldInnoDB: Log file ./ib_logfile0 did not exist: new to be createdInnoDB: Setting log file ./ib_logfile0 size to 104857600 bytesls -lh /var/lib/mysql/ib_logfile* 確認大小匹配SHOW ENGINE INNODB STATUS\G 查看 LOG 區段| 項目 | 要求 | 風險 |
|---|---|---|
| 關閉方式 | 必須正常關閉 | 強制殺進程導致 checkpoint 不全,啟動時需崩潰恢復,極端情況下數據不一致 |
| 備份舊日志 | 強烈建議保留 | 若新配置有誤需回滾,舊日志是唯一恢復依據 |
| innodb_log_file_size | 總大小 = size × group,建議 100M-2G | 過大延長恢復時間,過小導致頻繁刷盤 |
| innodb_log_files_in_group | 通常保持默認 2 | 修改需同步刪除所有舊日志文件 |
❌ 直接修改配置重啟 → 必報上述錯誤
❌ 只刪除 ib_logfile0 → 組內文件大小不一致,同樣報錯
❌ 在線修改 →innodb_log_file_size為只讀變量,SET GLOBAL無效,必須重啟
Innodb_log_waits、Innodb_log_writes 指標,確認無異常等待#!/bin/bash
# check_innodb_log_size.sh
CONFIG_SIZE=$(grep innodb_log_file_size /etc/my.cnf | awk -F= '{print $2}' | xargs)
ACTUAL_SIZE=$(stat -c%s /var/lib/mysql/ib_logfile0 2>/dev/null || echo 0)
if [ "$CONFIG_SIZE" != "$ACTUAL_SIZE" ]; then
echo "ALERT: InnoDB log file size mismatch! Config=$CONFIG_SIZE, Actual=$ACTUAL_SIZE"
exit 1
else
echo "OK: InnoDB log file size matched ($ACTUAL_SIZE bytes)"
fi
「停服 → 備份舊日志 → 改配置 → 啟動 → 驗證」 是調整 InnoDB 日志文件大小的唯一標準動作。切記:InnoDB 用物理文件大小說話,不認配置文件。將此流程固化為運維 SOP,避免因參數調優引發服務不可用。