天天看點

rds mysql 磁盤空間_當 Amazon RDS for MySQL 所用存儲超出預期時優化磁盤存儲

如何解決 Amazon RDS MySQL 資料庫執行個體使用的存儲超出預期的問題?

上次更新時間:2019 年 11 月 14 日

我在 MySQL 上的 Amazon Relational Database Service (Amazon RDS) 資料庫執行個體使用的空間超出預期。為什麼會發生這種情況,我該如何優化磁盤存儲?

解決方法

您可以使用 FreeStorageSpaceAmazon CloudWatch 名額監控 RDS 資料庫執行個體的可用存儲空間,但該名額不說明資料庫執行個體具體占用存儲的情況。

可使用以下政策回收存儲空間:

運作 OPTIMIZE TABLE

表占用的一些空間并未使用,但仍會配置設定給表。如果啟用了innodb_file_per_table(預設情況下處于啟用狀态),則可以使用 OPTIMIZE TABLE 回收這些空間。OPTIMIZE TABLE 适用于 InnoDB、MyISAM 和 ARCHIVE 表,而當 Amazon RDS 接受 OPTIMIZE TABLE 指令時,Amazon RDS 将執行 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 列突出顯示配置設定給表但并未使用的可用空間量。如果按照 Amazon RDS 預設 innodb_file_per_table 配置設定在單獨的表空間中建立了表,則可以使用 OPTIMIZE TABLE 回收這些空間。 有關更多資訊,請參閱 MySQL 文檔中的 File-Per-Table Tablespaces。

減少應用程式表存儲

要檢視資料庫執行個體上的應用程式表使用的存儲,請運作如下類似查詢:

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 二進制日志。

減少或禁用正常日志和慢速查詢日志存儲

注意:為避免潛在的性能和磁盤使用問題,請在不使用正常日志和慢速查詢日志排查問題時禁用這些日志。

管理或減少 InnoDB 系統表空間大小

系統表空間包含 InnoDB 資料字典和撤消空間,初始值為 10MB。配置設定空間後,檔案将始終至少是這個大小,不過長時間運作的事務可能會占用更多的可用存儲。

預設情況下,Amazon RDS 将 innodb_file_per_table設定為 1,這意味着每個表空間的資料存儲在自己的 .ibd檔案中。如需回收标記為可供相關表重用的空間,可以使用 OPTIMIZE TABLE 指令調整每個表的表空間檔案大小或者删除表。

如果 innodb_file_per_table設定為 0,則會将所有表配置設定到系統表空間。删除表或索引,或者删除或截斷配置設定到系統表空間的表中的資料,會将以前占用的空間标記為可重用。但是,該指令不會将任何空間釋放到檔案系統。

由于無法就地縮減系統表空間,是以請導出目前資料庫的資料,然後再将資料導入新執行個體。為減少停機時間,請将新的 MySQL 執行個體配置為源 Amazon RDS 主執行個體的副本。當副本與源 Amazon RDS 主執行個體同步時,切換到新執行個體。有關手動複制的資訊,請參閱利用 Amazon RDS 外部運作的 MySQL 或 MariaDB 執行個體進行複制。

注意:從快照還原或建立隻讀副本不會幫助您從系統表空間中回收空間。這是因為這兩種方法均使用包含系統表空間的源執行個體存儲卷的快照。