啟用 innodb_file_per_table=ON 後,表數據存於獨立 .ibd 文件,但 **ibdata1 仍存儲**:數據字典、Undo Log、Change Buffer、Doublewrite Buffer。長事務、大事務、Purge 延遲會導致 ibdata1 暴增,**無法自動縮小**。
# 1. 確認當前配置與實際文件一致 ls -lh /var/lib/mysql/ibdata* # 2. 查看 my.cnf 配置 grep innodb_data_file_path /etc/my.cnf # 例:innodb_data_file_path=ibdata1:10G;ibdata2:10G:autoextend
systemctl stop mysqldinnodb_data_file_path 末尾追加新文件
# 原配置 innodb_data_file_path=ibdata1:10G;ibdata2:10G:autoextend # 新配置(注意:原 autoextend 文件必須指定確切當前大小) innodb_data_file_path=ibdata1:10G;ibdata2:15360M;ibdata3:10G:autoextend
# 獲取 ibdata2 實際大小 (MB,向下取整到整 MB) ls -l /var/lib/mysql/ibdata2 # -rw-rw---- 1 mysql mysql 16106127360 Jan 26 16:34 ibdata2 # 16106127360 / 1024 / 1024 = 15360 MB # 配置寫 15360M,不能寫 15G 或 16G
systemctl start mysqldls -lh /var/lib/mysql/ibdata3 應自動創建並開始增長:autoextend# 1. 官方工具:innochecksum (需編譯或從 Percona 下載) ./innochecksum /var/lib/mysql/ibdata1 # 輸出頁類型統計,如 UNDO_LOG 佔 93% # 2. 進階:Jeremy Cole 的 InnoDB Ruby 工具 gem install innodb_ruby innodb_space -f /var/lib/mysql/ibdata1 space-summary | grep UNDO_LOG | wc -l
SHOW ENGINE INNODB STATUS\G 看 TRX ACTIVE 1256288 sec,Undo Log 無法清理# 1. 完整邏輯備份 (單事務一致性,含觸發器/存儲過程) mysqldump -uroot -p --single-transaction --routines --triggers --events \ --hex-blob --default-character-set=utf8mb4 --master-data=2 \ --all-databases > /backup/full_$(date +%F).sql # 2. 停止服務 systemctl stop mysqld # 3. 刪除共享表空間與日志文件 (保留 .ibd 表空間文件若未重建) rm -f /var/lib/mysql/ibdata1 /var/lib/mysql/ib_logfile* /var/lib/mysql/mysql-bin.index # 4. 刪除除 mysql 系統庫外的所有數據庫目錄 # ls /var/lib/mysql/ | grep -v '^mysql$' | xargs rm -rf # 5. 啟動服務 (自動創建新 ibdata1, ib_logfile0/1) systemctl start mysqld # 6. 還原數據 mysql -uroot -p < /backup/full_$(date +%F).sql # 7. 驗證 ibdata1 大小大幅縮小
TRUNCATE 無用大表(如日志、臨時表)mydumper/myloader 並行導出導入,縮短停機窗口innodb_undo_tablespaces 將 Undo Log 移出 ibdata1innodb_ibuf_max_size 限制 Change Buffer、innodb_doublewrite_file 分離 Doublewrite| 措施 | 版本要求 | 效果 |
|---|---|---|
| innodb_file_per_table=ON | 5.5+ | 表數據獨立 .ibd,不進 ibdata1 |
| innodb_undo_tablespaces ≥ 2 | 5.6+ | Undo Log 獨立表空間,可截斷 |
| innodb_undo_log_truncate=ON | 5.7+ | 自動截斷巨大 Undo 表空間 |
| 監控 History List Length | 所有 | 早期發現長事務/Purge 延遲 |
ibdata1 膨脹本質是 **Undo Log 積壓**。擴容治標,邏輯重建治本,**架構分離(獨立表空間、獨立 Undo 表空間)才是永久治理**。