我們的 Aurora MySQL 資料庫中的一個表格消耗了總儲存的大約 80%(約 400 GB)。由於我們能夠將舊資料存檔為 CSV 文件,因此我們決定刪除舊記錄並釋放儲存空間。
一開始我以為刪除記錄就能釋放儲存空間,但結果比想像的還要複雜。所以,我記錄了詳細步驟以供日後參考。
您可以使用以下查詢檢查每個 .ibd 檔案的大小:
SELECT file_name, ROUND(SUM(total_extents * extent_size)/1024/1024/1024,2) AS "TableSizeinGB" FROM information_schema.files GROUP BY file_name ORDER BY total_extents DESC;
參考:MySQL 文件
AWS re:Post 建議使用以下查詢來檢查表格大小,但目標表的結果比第一個查詢小約 150 GB。
SELECT table_schema "DB Name", table_name, (data_length + index_length)/1024/1024/1024 AS "TableSizeinGB" FROM information_schema.tables WHERE table_schema = 'database_name';
當我諮詢 AWS Support 時,他們確認 information_schema.tables 僅提供統計值,而這些值通常不準確。他們建議使用 information_schema.files 來取得精確的資料。
有關表大小(390 GB)的資訊是從 information_schema.tables 中檢索的,由於這是統計數據,因此可能不準確。未來,我們建議使用 information_schema.files 來檢索表格大小資訊。
參考:AWS re:Post
以下查詢檢查整體資料庫使用情況。這也使用 information_schema.files 來確保準確性。
SELECT file_name, ROUND(SUM(total_extents * extent_size)/1024/1024/1024,2) AS "TableSizeinGB" FROM information_schema.files WHERE file_name LIKE '%/database_name/%';
以下是釋放儲存空間的步驟:
單純刪除記錄並不會釋放儲存空間;您需要執行 OPTIMIZE TABLE 來釋放空間。
此外,在 OPTIMIZE TABLE(或 ALTER TABLE ... FORCE)操作期間,會建立臨時中間表檔案。在 Aurora 中,這些暫存檔案儲存在本機儲存中。本地儲存量取決於實例類別。就我而言,db.r6g.xlarge 實例只有 80 GB 本地存儲,這不足以容納已刪除記錄的大小。因此,我暫時擴展到 db.r6g.8xlarge (640 GB)。
參考:最佳化表
參考:更改表
參考:InnoDB Online DDL空間需求
參考:Aurora MySQL 暫存
刪除大約 250 GB 的記錄後,運行 OPTIMIZE TABLE 花費了大約 130 分鐘(大約 2 小時)。由於 OPTIMIZE TABLE 會鎖定表,因此您可能需要安排停機時間或在非尖峰時段執行此操作。作為參考,刪除所有記錄總共花了大約 15 個小時,我分散了好幾天。
以上是透過刪除不必要的資料來優化 Aurora MySQL 存儲的詳細內容。更多資訊請關注PHP中文網其他相關文章!