全部產品
Search
文件中心

ApsaraDB RDS:使用OPTIMIZE TABLE命令釋放MySQL執行個體的資料表空間

更新時間:Jul 18, 2025

當MySQL表資料量較大時,通過 DELETE 語句清理資料並不會直接釋放磁碟空間,僅會將資料庫記錄或資料頁標記為可重用。若需要真正回收資料表空間並減少磁碟佔用,可通過OPTIMIZE TABLE實現。

前提條件

  • 僅InnoDB和MyISAM引擎支援OPTIMIZE TABLE語句。

  • 執行個體剩餘磁碟空間必須大於等於需釋放表的空間。

    說明

    如果執行個體剩餘磁碟空間不足,請務必先擴容磁碟空間。後續操作完成後,可按需縮容磁碟空間,系統會退還價差

注意事項

  • 必須先刪除大量資料:如果未先通過DELETE刪除大量資料,直接執行OPTIMIZE TABLE將無法有效降低資料表空間使用率。

  • 磁碟空間佔用的短暫增加:執行OPTIMIZE TABLE時,MySQL會建立一個暫存資料表來儲存重組後的資料,這會導致磁碟空間在短時間內增加。操作完成後,暫存資料表會被刪除,磁碟空間佔用會恢複正常。

  • 效能影響與高峰期風險:在RDS MySQL 5.7和8.0 中,OPTIMIZE TABLE使用Online DDL方式執行,支援並發DML操作。然而,對大表執行該操作可能引發突發的IO和Buffer資源佔用,存在鎖表或資源搶佔風險,業務高峰期還可能導致執行個體不可用或監控中斷。因此,建議選擇業務低峰期執行以避免對正常業務造成影響。

通過命令列操作

  1. 通過用戶端串連RDS MySQL執行個體

  2. 使用DELETE語句清理不需要的資料,根據業務實際情況刪除即可。

  3. 執行OPTIMIZE TABLE命令,釋放資料表空間。

    OPTIMIZE TABLE <$Database1>.<Table1>,<$Database2>.<Table2>;
    說明
    • <$Database1>與<$Database2>為資料庫名,<Table1>與<Table2>為表名。

    • 在InnoDB引擎中執行OPTIMIZE TABLE語句時,會出現以下提示資訊,該資訊是正常執行返回的結果,您可忽略資訊,確認返回“ok”即可。詳情請參見OPTIMIZE TABLE Statement

      Table does not support optimize, doing recreate + analyze instead

通過DMS操作

  1. 通過DMS登入RDS MySQL執行個體

  2. 在左側選擇目標執行個體的執行個體ID,然後雙擊目標庫,按右鍵任意表名,然後選擇大量操作表

  3. 勾選需要釋放空間的表名,然後選擇表維護 > 最佳化表最佳化表

  4. 在彈出的對話方塊中確認變更資訊正確,然後單擊確認即可。

相關文檔

回收表片段空間

常見問題

執行DELETERDS MySQL空間未釋放如何處理?

在RDS MySQL中,使用DELETE語句刪除資料時,該命令僅會將記錄的位置或資料頁標記為可複用,而磁碟檔案大小並不會改變,即資料表空間不會直接回收。這種行為會導致資料表空間無法直接回收,形成執行個體儲存空間片段,佔用執行個體儲存空間。

如下提供原生DDL或DMS無鎖表結構變更兩種方案,需注意,執行兩種方案前均需確保執行個體剩餘空間充足,避免執行個體空間打滿引起執行個體鎖定

  • 通過命令整理空間片段:執行OPTIMIZE TABLEALTER TABLE <table_name> ENGINE=InnoDB;等DDL操作重新組織表資料和索引結構,從而釋放片段空間。

    重要

    使用原生DDL命令,需注意在業務低峰期執行,避免中繼資料鎖阻塞的情況。更多詳情,請參見注意事項

  • 通過DMS無鎖表結構變更:若想避免中繼資料鎖情況,可以考慮使用DMS無鎖結構變更回收表片段空間。

TRUNCATEDROP後RDS MySQL空間未釋放如何處理?

在RDS MySQL中,執行TRUNCATEDROP操作後,若發現磁碟空間未釋放,可按照以下步驟處理:

  1. 確認空間釋放邏輯

    執行TRUNCATEDROP後,通過監控執行個體的磁碟空間使用率確認空間是否已釋放。通常情況下,被刪除表的大小佔總執行個體空間的比例會反映為磁碟使用率的下降。

  2. 避免依賴過時資訊

    若通過information_schema.tables或RDS控制台(自治服務 > 一鍵診斷 > 空間分析) 查看錶大小,可能會因資料更新延遲導致資料表空間顯示未變化。因此,建議優先以磁碟使用率作為判斷依據。

  3. 非同步刪除的影響

    若執行個體開啟了非同步刪除功能(如阿里雲的Purge Large File Asynchronously),表檔案佔用的空間不會立即釋放,而是由後台進程逐步清理。此時需等待非同步進程完成,磁碟空間才會最終釋放。