スキップしてコンテンツを表示

Amazon RDS for MySQL DB インスタンスが想定よりも多くのストレージを使用している理由を教えてください。

所要時間2分
0

Amazon Relational Database Service (Amazon RDS) for MySQL DB インスタンスが予想よりも多くのスペースを使用しているため、理由を把握したいです。さらに、ディスクストレージを最適化したいです。

解決策

Amazon CloudWatchFreeStorageSpace メトリクスを使用すると、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 バイトを超える可変長の列を持つテーブルが含まれている場合、データベースとテーブルが使用する個々の記憶域を計算することはできません。この制限は、BLOBTEXTVARCHAR、および 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_table1 に設定します。この設定では、データベースは各テーブルスペースのデータを独自の .ibd ファイルに格納します。関連するテーブルの再利用可能なスペースを回復するには、OPTIMIZE TABLE を使用して各テーブルのスペースファイルのサイズを変更します。または、テーブルをドロップしてもかまいません。

innodb_file_per_table0 に設定すると、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」エラーのトラブルシューティング方法を教えてください

コメントはありません

関連するコンテンツ