Amazon Relational Database Service (Amazon RDS) for MySQL DB インスタンスが予想よりも多くのスペースを使用しているため、理由を把握したいです。さらに、ディスクストレージを最適化したいです。
解決策
Amazon CloudWatch の FreeStorageSpace メトリクスを使用すると、Amazon RDS DB インスタンスで利用可能なストレージ容量を監視できます。ただし、FreeStorageSpace メトリクスでは、DB インスタンスのストレージを使用している主体はわかりません。次の方法でストレージの使用状況を把握し、ストレージ容量を回復させます。
OPTIMIZE TABLE を実行する
テーブルは、アクティブに使用されていない容量のみを使用します。ただし、Amazon RDS は引き続きテーブルに容量を割り当てます。innodb_file_per_table が有効な場合は、OPTIMIZE TABLE コマンドを実行すると容量を回復できます。詳細については、MySQL のウェブサイトで 「OPTIMIZE TABLE ステートメント」を参照してください。
InnoDB、MyISAM、および ARCHIVE テーブルに OPTIMIZE TABLE を使用できます。OPTIMIZE TABLE は、Amazon RDS デフォルトの innodb_file_per_table 構成設定に従って、別個のテーブルスペースにテーブルを作成する際に機能します。詳細については、MySQL のウェブサイトで「File-per-table テーブルスペース」を参照してください。
Amazon RDS は OPTIMIZE TABLE コマンドを受け付けますが、実際には ALTER TABLE...FORCE コマンドを実行します。この場合、次のような警告メッセージが表示されます。
「Table does not support optimize, doing recreate + analyze instead (テーブルは最適化をサポートしていません。代わりに再作成 + 分析を実行してください)」
統計情報の更新後、次の information_schema.tables クエリを実行し、統計情報に基づいてストレージ使用量を推定します。
SELECT table_name,
data_length,
max_data_length,
index_length,
data_free
FROM
information_schema.tables
WHERE table_schema='schema_name'
;
注: 上記のクエリでは、実際のユースケースの値を追加します。
data_free 列には、アクティブに使用されていないテーブルに割り当てられている空き領域の量が表示されます。
アプリケーションのテーブルストレージを削減する
アプリケーションテーブルが RDS MySQL DB インスタンスで使用しているストレージ量を確認するには、次のクエリを実行します。
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 MySQL DB インスタンスで最大のアプリケーションテーブルを特定するには、次のクエリを実行します。
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 コマンドに適用されます。
バイナリログのストレージを削減する
Amazon RDS インスタンスにリードレプリカを追加した場合、ソースインスタンスのバイナリログは追加のストレージを使用します。ソースインスタンスのバイナリログが使用するストレージの量を判断するには、CloudWatch メトリクス BinLogDiskUsage を確認します。バイナリログでストレージの使用量が増えている場合は、リードレプリカの同期が必要になることがあります。
一般ログとスロークエリログの保存を減らすか無効にする
一般ログとスロークエリログのパラメータを無効にすると、インスタンスはログおよび、そのログのバックアップを保存するようになります。ファイルをローテーションしてディスク使用量を制御するには、mysql.rds_rotate_general_log および mysql.rds_rotate_slow_log を参照します。
注: トラブルシューティング時以外は、一般クエリログとスロークエリログを無効にすることをおすすめします。
InnoDB システムテーブルスペースのサイズを管理または削減する
システムテーブルスペースの初期容量は 10 MB であり、InnoDB データディクショナリと undo スペースを含みます。スペースを割り当てると、このファイルは 10 MB 以上になり、使用可能なストレージをさらに使用する可能性があります。
デフォルトでは、Amazon RDS は innodb_file_per_table を 1 に設定します。この設定では、データベースは各テーブルスペースのデータを独自の .ibd ファイルに格納します。関連するテーブルの再利用可能なスペースを回復するには、OPTIMIZE TABLE を使用して各テーブルのスペースファイルのサイズを変更します。または、テーブルをドロップしてもかまいません。
innodb_file_per_table を 0 に設定すると、Amazon RDS はすべてのテーブルをシステムテーブルスペースに割り当てるようになります。テーブルまたはインデックスを削除した場合、またはシステム内の割り当てられたテーブルからデータを削除したり切り捨てたりした場合、テーブルスペースはそのスペースを再利用可能としてマークします。ただし、innodb_file_per_table はファイルシステム用のスペースを解放しません。
システムテーブルスペースが配置されているインスタンスでは、そのシステムテーブルスペースを縮小できません。代わりに、現在のデータベースのデータをエクスポートし、そのデータを新しいインスタンスにインポートします。ダウンタイムを削減するには、新しい MySQL インスタンスをソース Amazon RDS インスタンスのレプリカとして設定します。レプリカをソース Amazon RDS インスタンスと同期した後、新しいインスタンスに切り替えます。
注: スナップショットから復元したり、リードレプリカを作成したりしても、システムテーブルスペースの領域は回復されません。どちらの方法も、システムテーブルスペースを含むソースインスタンスのストレージボリュームのスナップショットを使用します。
関連情報
Amazon RDS DB インスタンスでストレージが枯渇している
Amazon RDS DB インスタンスを変更する
Amazon RDS for MySQL の使用時に発生する 「MySQL HA_ERR_RECORD_FILE_FULL」エラーのトラブルシューティング方法を教えてください