我的 Amazon Relational Database Service (Amazon RDS) for MySQL 資料庫執行個體使用的空間超出預期。為什麼會發生此情況?如何優化磁碟儲存?
解決方案
您可以使用 FreeStorageSpace Amazon CloudWatch 指標監控 RDS 資料庫執行個體的可用儲存空間。但是,FreeStorageSpace 不會說明資料庫執行個體如何耗用儲存空間。
請使用下列策略回收儲存空間:
執行 OPTIMIZE TABLE
資料表會耗用一些未處於積極使用狀態的空間,但 Amazon RDS 還是會將該空間配置給資料表。如果已開啟 innodb_file_per_table (預設為開啟),您就可以使用 OPTIMIZE TABLE 回收該空間。OPTIMIZE TABLE 適用於 InnoDB、MyISAM 及 ARCHIVE 資料表。雖然 Amazon RDS 接受 OPTIMIZE TABLE 命令,但實際上會改為執行 ALTER TABLE...FORCE 命令。發生此情況時,您會收到類似下列內容的警告訊息: 「資料表不支援優化,請改為重新建立和分析」。 如需詳細資訊,請參閱 MySQL 文件中的 OPTIMIZE TABLE。
若要檢查分散程度,請執行類似下列內容的查詢:
SELECT
table_name,
data_length,
max_data_length,
index_length,
data_free
FROM
information_schema.tables
WHERE table_schema='schema_name'
;
data_free 欄會醒目提示配置給未處於積極使用狀態之資料表的可用空間量。您可能可以使用 OPTIMIZE TABLE 回收此空間。 根據 Amazon RDS 預設的 innodb_file_per_table 組態設定,如果資料表建立位置是在單獨的資料表空間中,OPTIMIZE TABLE 就會發揮作用。如需詳細資訊,請參閱 MySQL 文件中的 File-per-table 資料表空間。
減少應用程式資料表儲存空間
若要查看應用程式在您的資料庫執行個體上使用了多少儲存空間,請執行類似下列內容的查詢:
SELECT
table_schema,
SUM(data_length + index_length + data_free)/1024/1024 AS total_mb,
SUM(data_length)/1024/1024 AS data_mb,
SUM(index_length)/1024/1024 AS index_mb,
SUM(data_free)/1024/1024 AS free_mb,
COUNT(*) AS tables,
CURDATE() AS today
FROM
information_schema.tables
GROUP BY table_schema
ORDER BY 2 DESC
;
若要尋找資料庫執行個體上最大的應用程式資料表,請執行類似下列內容的查詢:
SELECT
table_schema,
table_name,
(data_length + index_length + data_free)/1024/1024 AS total_mb,
(data_length)/1024/1024 AS data_mb,
(index_length)/1024/1024 AS index_mb,
(data_free)/1024/1024 AS free_mb,
CURDATE() AS today
FROM
information_schema.tables
ORDER BY 3 DESC
;
注意事項: 如果資料庫包括長度超過 768 位元的變數長度欄,則無法計算個別資料庫和資料表使用的總儲存空間。例如,這包括 BLOB、TEXT、VARCHAR 或 VARBINARY。
減少二進位日誌儲存空間
新增讀取複本會讓來源執行個體的二進位日誌使用額外儲存空間。若要了解來源執行個體使用的儲存空間,請檢查 BinLogDiskUsage CloudWatch 指標。大量增長可能表示一或多個讀取複本並未同步。
減少或關閉一般日誌和慢速查詢日誌儲存空間
關閉一般日誌和慢速查詢日誌參數時,您的執行個體即會開始儲存這些日誌。也會儲存這些日誌的備份。若要輪替這些檔案並控制磁碟使用量,請參閱 mysql.rds_rotate_general_log 和 mysql.rds_rotate_slow_log。
注意事項: 當您未積極使用一般和慢速查詢日誌進行疑難排解時,請加以關閉。
管理或減少 InnoDB 系統資料表空間大小
系統資料表空間包含 InnoDB 資料字典和復原空間,而且會從 10 MB 開始。配置空間後,檔案最少都必須是該大小,雖然長時間執行的交易會耗用更多可用儲存空間。
預設情況下,Amazon RDS 會將 innodb_file_per_table 設為 1。這表示每個資料表空間的資料會儲存在自己的 .ibd 檔案中。若要復原標示為可重複用於相關資料表的空間,請使用 OPTIMIZE TABLE 調整每個資料表的大小,或是捨棄資料表。
如果 innodb_file_per_table 設為 0,則同樣會將所有資料表配置給系統資料表空間。捨棄資料表或索引,或是刪除或截斷在系統資料表空間中配置的資料表資料時,都會將先前佔用的空間標示為可重複使用。但是,innodb_file_per_table 不會向檔案系統釋放任何空間。
因為無法就地壓縮系統資料表空間,所以請匯出您目前資料庫的資料。然後,將資料匯入到新的執行個體中。若要減少停機時間,請將新的 MySQL 執行個體設為來源 Amazon RDS 執行個體的複本。當複本與來源的 Amazon RDS 執行個體同步時,請切換至新執行個體。
注意事項: 從快照中還原或建立讀取複本時,無法讓您復原系統資料表空間中的空間。這是因為兩種方法都使用了包含系統資料表空間的來源執行個體儲存磁碟區快照。
相關資訊
Amazon RDS 資料庫執行個體的儲存空間不足
修改 Amazon RDS 資料庫執行個體
使用 Amazon RDS for MySQL 時,如何對「MySQL HA_ERR_RECORD_FILE_FULL」錯誤進行疑難排解?