MySQL の Amazon Relational Database Service (Amazon RDS) データベースインスタンスが予期した以上の領域を使用しています。この原因と、ディスクストレージを最適化する方法を教えてください。

Amazon CloudWatch メトリクス「FreeStorageSpace」を使用すると、RDS DB インスタンスの使用可能なストレージ領域はモニタリングできますが、DB インスタンスによるストレージの消費状況はわかりません。

ストレージ領域を解放するには、いくつかの方法があります。

OPTIMIZE TABLE を実行する

テーブル用の領域の一部は実際に使用されない場合でも割り当てられます。innodb_file_per_table を有効にすると (デフォルトで有効になっています)、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 を使用して解放できます (テーブルが RDS のデフォルトの innodb_file_per_table 構成設定に従って別個のテーブルスペースで作成されている場合)。

アプリケーションテーブルのストレージを減らす

DB インスタンスのアプリケーションテーブルで使用されているストレージ領域は、次のようなクエリを確認できます。

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
;

DB インスタンスで最大のアプリケーションテーブルを見つけるには、次のようなクエリを実行できます。

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 など) がある場合、個別のデータベースやテーブルで使用されているストレージの合計は計算できません。

バイナリログのストレージを減らす

リードレプリカを追加すると、マスターインスタンスのバイナリログで追加のストレージが使用されます。マスターインスタンスのバイナリログで使用されているストレージ領域は、CloudWatch メトリクス「BinLogDiskUsage」で確認できます。使用領域が大幅に増加している場合、1 つ以上のリードレプリカが同期されていない可能性があります。詳細については、「MySQL バイナリログにアクセスする」を参照してください。

一般ログとスロークエリログのストレージを減らすか、無効にする

一般ログとスロークエリログのパラメータを有効にすると、これらのログおよびそのバックアップの保存が DB インスタンスで開始されます。これらのファイルを更新してディスク使用量を制御するには、「mysql.rds_rotate_general_log」と「mysql.rds_rotate_slow_log」を参照してください。

注意: パフォーマンスおよびディスク使用上の問題が起きないように、トラブルシューティングで使用する場合を除いて、一般ログとスロークエリログは無効にしておいてください。

InnoDB システムのテーブルスペースサイズを管理または削減する

システムのテーブルスペースには、InnoDB データディクショナリと取り消し用のスペースとして、最初に 10 MB が割り当てられます。ファイルの最小サイズは常に 10 MB となります (ただし、長時間実行されるトランザクションでは使用可能なストレージがさらに多く消費されることもあります)。

RDS のデフォルトでは、innodb_file_per_table が 1 に設定されます。この場合、各テーブルスペースは個別の .ibd ファイル内に保存されます。テーブルごとの再利用可能とマークされた領域を回復するには、OPTIMIZE TABLE コマンドを使用して、テーブルごとのテーブルスペースファイルのサイズを小さくするか、テーブルを削除します。

innodb_file_per_table0 に設定すると、すべてのテーブルがシステムのテーブルスペースにも割り当てられます。テーブルやインデックスを削除するか、システムのテーブルスペースに割り当てられているテーブルのデータの削除や切り捨てを行うと、以前に占有されていた領域が再利用可能としてマークされます。ただし、このコマンドではファイルシステム用の領域は解放されません。

システムのテーブルスペースをインプレースで縮小することはできないため、現在のデータベースからデータをエクスポートして新しいインスタンスにインポートします。ダウンタイムを短くするために、新しい MySQL インスタンスは、ソース RDS マスターインスタンスの従属インスタンスとして設定します。従属インスタンスがソース RDS マスターインスタンスに同期したら、新しいインスタンスに切り替えます。手動レプリケーションの詳細については、「Amazon RDS の外部で実行される MySQL または MariaDB インスタンスとのレプリケーション」を参照してください。

注意: スナップショットからの復元やリードレプリカの作成では、システムのテーブルスペースから領域を回復できません。どちらの方法でも、ソースのインスタンスストレージボリュームのスナップショットを使用しますが、これにはシステムのテーブルスペースが含まれるためです。


このページは役に立ちましたか? はい | いいえ

AWS サポート ナレッジ センターに戻る

サポートが必要ですか? AWS サポートセンターをご覧ください。

公開日: 2015 年 11 月 03 日

更新日: 2018 年 12 月 28 日