我的 Amazon Relational Database Service (Amazon RDS) for MySQL 資料庫 (DB) 執行個體使用的儲存空間超出我的預期。我想要了解原因,並且我想要最佳化磁碟儲存空間。
簡短說明
若要監控 Amazon RDS 資料庫執行個體的可用儲存空間,使用 Amazon CloudWatch FreeStorageSpace 指標。FreeStorageSpace 指標不會顯示資料庫執行個體中儲存空間的使用情況。若要判斷哪些項目使用儲存空間和回收儲空間,請使用下列方法。
解決方法
執行 OPTIMIZE TABLE
RDS for MySQL 會將空間配置給非使用中的資料表。當您刪除資料列時,InnoDB 會留下可重複使用的空白頁面。InnoDB 不會縮減實體資料表檔案。如果您開啟了 innodb_file_per_table,那麼執行 OPTIMIZE TABLE 命令來回收空間。如需詳細資訊,請參閱 MySQL 網站上的 OPTIMIZE TABLE 陳述式。
您可以對 InnoDB、MyISAM 和 ARCHIVE 資料表使用 OPTIMIZE TABLE。當您根據 Amazon RDS 預設的 innodb_file_per_table 組態設定,在單獨的資料表空間中建立資料表時,OPTIMIZE TABLE 就會發揮作用。如需詳細資訊,請參閱 MySQL 網站上的 File-per-table 資料表空間。
Amazon RDS 接受 OPTIMIZE TABLE 命令,但其會改為執行 ALTER TABLE...FORCE 命令。發生此情況時,您會收到類似下列內容的警告訊息:
「資料表不支援最佳化,請改為重新建立並分析。」
ALTER TABLE...FORCE 命令也會更新您的資料表統計資料。若要根據更新後的資料表統計資料來估算儲存空間使用量,請執行下列查詢:
SELECT
table_name,
data_length,
max_data_length,
index_length,
data_free
FROM
information_schema.tables
WHERE table_schema='schema_name'
;
注意: 請將 schema_name 替換為您的資料庫結構描述名稱。
若要找出配置給非使用中資料表的可用空間量,請檢視 data_free 欄位。
減少應用程式資料表儲存空間
若要查看應用程式資料表在 RDS for MySQL 資料庫執行個體上使用的儲存空間量,請執行下列查詢:
SELECT
TABLESPACE_NAME,
ROUND(DATA_FREE / EXTENT_SIZE, 0) FREE_DATA_MB,
FREE_EXTENTS FREE_EXTENTS_MB,
TOTAL_EXTENTS TOTAL_EXTENTS_MB
FROM
INFORMATION_SCHEMA.FILES;
若要尋找 RDS for MySQL 資料庫執行個體上最大的應用程式資料表,請執行下列查詢:
SELECT
TABLESPACE_NAME,
ROUND(DATA_FREE / EXTENT_SIZE, 0) FREE_DATA_MB,
FREE_EXTENTS FREE_EXTENTS_MB,
TOTAL_EXTENTS TOTAL_EXTENTS_MB
FROM
INFORMATION_SCHEMA.FILES
ORDER BY
TOTAL_EXTENTS_MB DESC;
注意: 如果資料庫包含長度可變的資料欄且大於 768 位元組的資料表,則無法計算資料庫和資料表使用的個別儲存空間。此限制包括 BLOB、TEXT、VARCHAR 和 VARBINARY 資料類型。
減少二進位日誌儲存空間
如果您將讀取複本新增至 RDS for MySQL DB 執行個體,則來源執行個體上的二進位日誌會使用額外的儲存空間。若要判斷二進位日誌使用多少儲存空間,請檢視 BinLogDiskUsage CloudWatch 指標。如果二進位日誌使用的儲存空間持續增加,請同步您的讀取複本。
減少或關閉一般日誌和慢速查詢日誌儲存空間
當您開啟一般日誌和慢速查詢日誌參數時,執行個體會儲存日誌和日誌備份。當您不進行問題疑難排解時,最佳做法是關閉一般查詢日誌和慢速查詢日誌。若要輪換這些檔案並控制磁碟使用量,請參閱 mysql.rds_rotate_general_log 和 mysql.rds_rotate_slow_log。
管理或減少 InnoDB 系統資料表空間大小
系統資料表空間從 10 MB 的空間開始,並包含 InnoDB 資料字典和復原空間。配置空間後,該檔案大小至少為 10 MB,且可能會使用更多可用的儲存空間。
預設情況下,Amazon RDS 會將 innodb_file_per_table 設為 1,以便資料庫將每個資料表空間的資料儲存在自己的 .ibd 檔案中。若要復原相關資料表的可重複使用空間,請使用 OPTIMIZE TABLE 調整每個資料表空間檔案的大小。或者,卸除資料表。
如果將 innodb_file_per_table 設定為 0,則 Amazon RDS 會將所有資料表指派給系統資料表空間。如果您刪除資料表或索引,或從系統中已配置的資料表中刪除或截斷資料,則資料表空間會將這些空間標記為可重複使用。但是,innodb_file_per_table 不會釋放檔案系統的空間。
若要縮減系統資料表空間,請從您目前的資料庫匯出資料,然後將資料匯入新的執行個體。您無法在系統資料表空間所在的執行個體上將其縮減。若要減少停機時間,請將新的 RDS for MySQL 執行個體設為來源執行個體的複本。當複本與來源 RDS 執行個體同步後,請切換至新的執行個體。
注意: 當您從快照還原或建立讀取複本時,您無法復原系統資料表空間中的空間。兩種方法都使用了包含系統資料表空間的來源執行個體儲存磁碟區快照。
相關資訊
Amazon RDS 資料庫執行個體儲存空間不足
修改 Amazon RDS 資料庫執行個體
使用 Amazon RDS for MySQL 時,如何對「MySQL HA_ERR_RECORD_FILE_FULL」錯誤進行疑難排解?