解決 `ibdata1` 不斷膨脹的兩種方案
InnoDB 刪除數據僅標記刪除,不回收磁碟空間,導致表空間文件 (`ibdata1` 或 `.ibd`) 單調增長。
方案一:獨立表空間 + OPTIMIZE TABLE (推薦)
前提:啟用 `innodb_file_per_table=1` (MySQL 5.6+ 預設開啟),每表一個 `.ibd` 文件。
OPTIMIZE TABLE your_table;
輸出雖提示 `Table does not support optimize, doing recreate + analyze instead`,實際已完成:建臨時表 → 複製數據 → 重建索引 → 替換原表 → 釋放空間。
方案二:共享表空間 (未開啟 file_per_table) 必須全庫重建
- `mysqldump --all-databases > backup.sql` (加 `--single-transaction` 保證一致性)
- 停止 MySQL:`systemctl stop mysqld`
- 刪除共享表空間與日誌:`rm ibdata1 ib_logfile*`
- 啟動 MySQL (自動建立新 `ibdata1`)
- 還原數據:`mysql < backup.sql`
風險: 停機時間長、需足夠磁碟空間存放備份、外鍵約束需注意導入順序。
日常預防建議
- 確保 `innodb_file_per_table=ON` (新表自動獨立)。
- 定期對高頻刪除表執行 `OPTIMIZE TABLE` (低峰期)。
- 大量刪除考慮 `pt-archiver` 分批刪除 + `OPTIMIZE`,或建新表插入保留數據 `RENAME TABLE` 切換。
- 監控 `ibdata1` / `.ibd` 增長趨勢,設定告警。