如何對顯示儲存空間已滿的 RDS for MySQL 或 MariaDB 執行個體進行疑難排解?
我想對顯示儲存空間已滿的 Amazon Relational Database Service (Amazon RDS) for MySQL 或 MariaDB 執行個體進行疑難排解。
簡短描述
若要對顯示儲存空間已滿的 Amazon RDS for MySQL 或 MariaDB 執行個體進行疑難排解,請檢查資料庫執行個體上所使用的總空間,以確定哪些執行個體佔用了空間。您可以將資料庫執行個體上的空間用於下列物件:
- 使用者建立的資料庫
- 暫存資料表
- 二進位日誌或 MySQL 待命執行個體轉送日誌 (如果您使用僅供讀取複本)
- InnoDB 資料表空間
- 一般日誌、慢速查詢日誌和錯誤日誌
檢查儲存空間並確定正在使用該空間的內容後,就可以回收空間。然後,您可以監控 FreeStorageSpace 指標,以防止進一步的儲存空間問題。
**注意:**如果可用儲存空間突然減少,請執行 SHOW FULL PROCESSLIST 命令來檢查資料庫執行個體層級的查詢。SHOW FULL PROCESSLIST 命令提供關於每個連線執行的所有作用中連線和查詢的資訊。若要查看長期處於作用中的交易,請先執行 INFORMATION_SCHEMA.INNODB_TRX 或 SHOW ENGINE INNODB STATUS 命令。然後,檢查輸出。
解決方法
若要對顯示儲存空間已滿的 Amazon RDS for MySQL 或 MariaDB 執行個體進行疑難排解,請完成下列步驟:
檢查 MySQL 資料庫執行個體上所使用的總空間
確定每個使用者所建立資料庫的大小
SELECT SUBSTRING_INDEX(TABLESPACE_NAME,"/",1) AS DATABASE_NAME, ROUND((DATA_FREE/1024/1024/1024),3) AS 'REUSABLE (GB)', ROUND(SUM((TOTAL_EXTENTS * EXTENT_SIZE)/1024/1024/1024),3) AS 'TOTAL (GB)' FROM INFORMATION_SCHEMA.FILES GROUP BY DATABASE_NAME ORDER BY 'TOTAL (GB)' DESC;
檢查您指定使用者資料庫的每個資料表大小:
**注意:**將 example-database-name 替換為您的資料庫名稱。
SELECT SUBSTRING_INDEX(TABLESPACE_NAME,"/",-1) as 'TABLE_NAME', ROUND((total_extents * extent_size)/1024/1024/1024,3) AS "TableSizeinGB" from information_schema.files WHERE FILE_NAME LIKE 'example-database-name';
檢查 MariaDB 執行個體上使用的總空間
確定每個使用者所建立資料庫的大小:
mysql> SELECT table_schema, ROUND(SUM(data_length+index_length)/1024/1024/1024,2) "size in GB" FROM information_schema.tables GROUP BY 1 ORDER BY 2 DESC;
檢查您指定使用者資料庫的每個資料表大小:
**注意:**將 example-database 替換為資料庫名稱,將 example-table 替換為資料表名稱。
mysql> SELECT table_schema "example-database", example-table,(data_length + index_length)/1024/1024/1024 AS "TableSizeinGB" from information_schema.tables where table_schema='database_name';
檢查暫存資料表
InnoDB 使用者建立的暫存資料表和磁碟上的內部暫存資料表,均在名為 ibtmp1 的暫存資料表空間檔案中建立。暫存資料表空間檔案可以擴展到 MySQL 資料目錄中的 ibtmp2。如果暫存資料表 ibtmp1 使用了過多的儲存空間,請重新啟動資料庫執行個體以釋放空間。
**注意:**您只能使用 MySQL 5.7 及更新版本或 MySQL 8.0 及更新版本來查詢 InnoDB 資料表空間的檔案大小。
識別 InnoDB 暫存資料表空間:
mysql> SELECT file_name, tablespace_name, table_name, engine, index_length, total_extents, extent_size from information_schema.files WHERE file_name LIKE '%ibtmp%';
若要回收全域暫存資料表空間資料檔案所佔用的磁碟空間,請重新啟動 MySQL 伺服器或重新啟動資料庫執行個體。如需詳細資訊,請參閱 MySQL 網站上的暫存資料表空間。
檢查您的 InnoDB 資料表空間
MySQL 可能會建立內部暫存資料表,這些資料表由於查詢而無法移除。這些暫存資料表不屬於 information_schema 中名為 tables 的資料表。如需詳細資訊,請參閱 MySQL 網站上的 MySQL 中的內部暫存資料表使用。
識別內部暫存資料表:
mysql> SELECT * FROM information_schema.innodb_sys_tables WHERE name LIKE '%#%';
識別 InnoDB 系統資料表空間:
mysql> SELECT file_name, tablespace_name, table_name, engine, index_length, total_extents, extent_size from information_schema.files WHERE file_name LIKE '%ibdata%';
**注意:**MySQL 5.7 及更新版本或 MySQL 8.0 及更新版本支援上述查詢。
當系統資料表空間的大小增加時,您無法將其減少。若要解決此問題,您可以傾印 InnoDB 資料表,並將資料表匯入新的 MySQL DB 執行個體。若要避免使用較大的系統資料表空間,請使用 file-per-table 資料表空間。如需詳細資訊,請參閱 MySQL 網站上的 File-per-table 資料表空間。
如果啟用 Innodb_file_per_table,則每個資料表都會將資料和索引儲存在自己的資料表空間檔案中。若要回收空間,請執行 OPTIMIZE TABLE。如需詳細資訊,請參閱 MySQL 網站上的 OPTIMIZE TABLE 陳述式。
**注意:**OPTIMIZE TABLE 命令會使用 COPY 演算法建立與原始資料表大小相同的暫存資料表。在執行 OPTIMIZE TABLE 之前,請確定您有可用的磁碟空間。
若要最佳化您的資料表,請執行以下命令:
**注意:**將 example-table-name 替換為您要最佳化的資料表。
mysql> OPTIMIZE TABLE example-table-name;
(選用) 若要重建資料表,請執行下列命令:
**注意:**將 example-table-name 替換為您要最佳化的資料表。
mysql> ALTER TABLE example-table-name ENGINE=INNODB;
若要檢查二進位日誌
如果您在 Amazon RDS 執行個體上啟用自動備份,則二進位日誌將自動在資料庫執行個體上啟動。二進位日誌儲存在磁碟上並佔用儲存空間,但在每個二進位日誌保留組態時都會將其移除。您執行個體的預設 binlog 保留值設定為 Null,檔案會立即移除。
若要避免儲存空間不足的問題,請為 Amazon RDS for MySQL 中的二進位日誌保留期設定適當的值。
若要查看二進位日誌保留的小時數,請執行 mysql.rds_show_configuration 命令:
CALL mysql.rds_show_configuration;
若要減少二進位日誌使用的空間量,請減少二進位日誌保留的小時數。設定為 NULL 的值會立即移除日誌。
如果作用中執行個體有待命執行個體,請監控待命執行個體上的 ReplicaLag 指標。ReplicaLag 指標表示在作用中執行個體上進行二進位日誌處理期間,發生的任何延遲或待命執行個體上的轉送日誌。
如果出現清除或複製問題,則二進位日誌會隨著時間的推移而累積,並消耗額外的磁碟空間。若要檢查執行個體上的二進位日誌數量和檔案大小,請使用 SHOW BINARY LOGS 命令。如需詳細資訊,請參閱 MySQL 網站上的 SHOW BINARY LOGS 陳述式。
如果資料庫執行個體作為複製待命執行個體,請檢查 Relay_Log_Space 以查看轉送日誌的大小:
SHOW SLAVE STATUS\G
檢查 MySQL 日誌 (一般日誌、慢速查詢日誌和錯誤日誌)
若要檢查慢速查詢、FILE 類型的一般日誌以及錯誤日誌的大小,請檢視並列出資料庫日誌檔案。如果慢速查詢日誌和一般日誌資料表使用了過多的儲存空間,請手動輪換日誌資料表以管理資料表型 MySQL 日誌。
若要移除舊資料並回收磁碟空間,請連續執行以下命令兩次:
mysql> CALL mysql.rds_rotate_slow_log;mysql> CALL mysql.rds_rotate_general_log;
**注意:**資料表不會提供日誌的準確檔案大小。將 log_output 的參數值修改為 FILE,以取得 slow_log 和 general_log。
監控和擴展您的 Amazon RDS 資料庫執行個體
若要監控和擴充您的 Amazon RDS 執行個體,請執行下列動作:
- 使用 Amazon CloudWatch 監控您的 Amazon RDS 資料庫執行個體。
- 根據 FreeStorageSpace 指標設定 CloudWatch 警示,以便在儲存空間減少到指定閾值時接收警示。如需詳細資訊,請參閱如何建立 CloudWatch 警示來監控 Amazon RDS 可用儲存空間,並防止出現儲存空間已滿的問題?
- 使用 Amazon RDS 儲存自動擴展功能來自動管理容量。
相關內容
- 已提問 2 年前
- 已提問 1 年前
- 已提問 2 年前
- 已提問 1 年前

