Mysql
InnoDB 是否會釋放未使用的磁碟空間?
由於一個錯誤(現已修復),一個具有 500M 行的大型 MySQL 關聯表最近膨脹為 1B 行。磁碟使用量從 ~130GB 增加到 240GB。
不幸的是,此伺服器上沒有空間用於任何標準補救措施(
OPTIMIZE
或者ALTER TABLE table ENGINE=InnoDB
,轉儲和重建,建構到臨時表並重命名和刪除舊表等)。我只剩下 50GB。這是問題:
雖然到目前為止我已經成功刪除了超過 1 億行(1B 下降到 850M),但磁碟使用量實際上增長了 10GB(達到 250GB)。是的,新記錄也在每秒添加,但我刪除的速度比添加的速度快得多。
- InnoDB 會釋放這個空間嗎?
- 為什麼表磁碟使用量會增加,而我正在減少行數?
當正常解決方案不適合時,還有什麼其他建議可以回收未使用的磁碟空間?
單個表 (
.ibd
) 的 InnoDB 表空間大小可以使用OPTIMIZE
和減小ALTER TABLE ... ENGINE=InnoDB;
,但係統表空間文件ibdata1
永遠不能收縮。撤消日誌中 ibdata1 增長的來源。
自 2013 年 7 月以來,我已經寫過關於此的文章。我首先從 Percona 的文章Reasons for run-away main Innodb Tablespace中了解到這種現象。
建議#1
如果您將數據 mysqldump 到另一個在新安裝的實例中執行 mysql 的伺服器中,您可以設置複製到它,然後故障轉移並丟棄舊的主伺服器。
建議#2
如果您沒有另一台伺服器,您將停止應用程序,mysqldump 數據,刪除所有 DB,關閉 mysql,刪除 ibdata1,啟動 mysql(重新創建 ibdata1,重新載入 mysqldump)。請參閱我的舊文章Howto:清理 mysql InnoDB 儲存引擎?