首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL InnoDB 刪除數據後釋放磁碟空間:OPTIMIZE TABLE 與重建大法

     編輯:MySQL 資料庫相關知識

解決 `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) 必須全庫重建

  1. `mysqldump --all-databases > backup.sql` (加 `--single-transaction` 保證一致性)
  2. 停止 MySQL:`systemctl stop mysqld`
  3. 刪除共享表空間與日誌:`rm ibdata1 ib_logfile*`
  4. 啟動 MySQL (自動建立新 `ibdata1`)
  5. 還原數據:`mysql < backup.sql`

風險: 停機時間長、需足夠磁碟空間存放備份、外鍵約束需注意導入順序。

日常預防建議

  • 確保 `innodb_file_per_table=ON` (新表自動獨立)。
  • 定期對高頻刪除表執行 `OPTIMIZE TABLE` (低峰期)。
  • 大量刪除考慮 `pt-archiver` 分批刪除 + `OPTIMIZE`,或建新表插入保留數據 `RENAME TABLE` 切換。
  • 監控 `ibdata1` / `.ibd` 增長趨勢,設定告警。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved