Amazon RDS for MySQL を使用しているときの「MySQL HA_ERR_RECORD_FILE_FULL」エラーをトラブルシューティングするにはどうすればよいですか?

最終更新日: 2019 年 2 月 27 日

Amazon Relational Database Service (Amazon RDS) MySQL DB インスタンスに書き込もうとしたときに、次のエラーが発生しました。

"Error_code: 1114; handler error HA_ERR_RECORD_FILE_FULL"

このエラーを解決する方法を教えてください。

簡単な説明

ほとんどの場合、このエラーはレプリケーションが失敗する原因となるリードレプリカで発生しますが、データが書き込まれているテーブルが満杯になったときに発生する場合もあり、以下のいずれかが原因である可能性があります。

  1. エラーメッセージを送信しているテーブルが MEMORY エンジンテーブルで、その最大サイズに到達した。
  2. テーブルが MyISAM エンジンテーブルで、その最大ポインタサイズに到達した。
  3. テーブルが InnoDB エンジンを使用しており、InnoDB テーブルスペースファイルが満杯になっている。
  4. Amazon RDS DB のディスク容量が不足している。
  5. テーブルがファイルサイズの上限に到達した。

Amazon RDS がサポートするストレージエンジンの詳細については、「Amazon RDS で MySQL に対してサポートされているストレージエンジン」を参照してください。

解決方法

1.MEMORY エンジンのテーブルが最大サイズに達しました

次のようなコマンドを実行し、エンジン値をチェックすることによって、MEMORY エンジンテーブルが最大サイズに到達したことを確認します。

mysql> show table status from database_name like 'table_name'\G

出力にある data_length 変数の値が max_data_length 変数を超える場合、テーブルは最大サイズに到達しています。これがエラーメッセージの原因です。

このエラーを解決するには、DB インスタンスに関連付けられているカスタム パラメーター グループの max_heap_table_size パラメーターのサイズを大きくします。詳細については、「DB パラメータグループを作成する」を参照してください。使用する Amazon RDS インスタンスクラスに基づいた DB インスタンスクラスのメモリ制限を超えないようにしてください。DB インスタンスで使用できるメモリの詳細については、「Amazon RDS インスタンスタイプ」を参照してください。

2.MyISAM エンジンテーブルが最大ポインタサイズに到達した

次のようなコマンドを実行し、エンジン値をチェックすることによって、MyISAM エンジンテーブルが最大ポインタサイズに到達したことを確認します。

mysql> show table status from database_name like 'table_name'\G

このエラーは、ALTER TABLE コマンドを使って既存するテーブルの最大サイズを変更することで解決できます。

mysql> ALTER TABLE tbl_name MAX_ROWS=1000000000 AVG_ROW_LENGTH=nnn;

オプションで、すべての MyISAM テーブルのデフォルトサイズ制限を変更できます。次に、カスタム DB パラメーター グループの myisam_data_pointer_size パラメーターをより高い値に設定します。

3.InnoDB テーブルスペースファイルが満杯になっている

InnoDB テーブルの最大テーブルスペースサイズは 40 億ページ (64 TB) です。詳細については、InnoDB 制限に関する MySQL ドキュメントを参照してください。

1 TB を超えるテーブルでは、テーブルを複数のテーブルスペースファイルにパーティション化できます。テーブルのパーティション化には、ユースケースに応じて RANGELISTHASH などの異なるタイプのパーティショニングを使用できます。たとえば、作成された年に基づいて古いデータを切り詰める、または年ごとに個別のパーティションを作成することができます。詳細については、MySQL のファイルサイズ制限と、パーティショニングに関する MySQL ドキュメントを参照してください。

重要: 本番環境に変更を実装する前に、それらの変更がアプリケーションに及ぼす可能性がある影響を十分にテストしてください。

次のような ALTER TABLE ステートメントを使用して、既存のテーブルをパーティション化されたテーブルに変換できます。

ALTER TABLE table_name 
PARTITION BY HASH(id)
PARTITIONS 8;

注意: 既存のテーブルをパーティションテーブルに変換しても、InnoDB テーブルスペースに割り当てられたスペースを回収することはできません。InnoDB のスペースを回収するには、予想よりも多くのストレージを使用している Amazon RDS MySQL DB インスタンスに関する問題を解決する方法を教えてください。を参照してください。

4.Amazon RDS DB インスタンスのディスク容量不足

Amazon RDS DB インスタンスが STORAGE_FULL 状態になっている場合、HA_ERR_RECORD_FILE_FULL エラーを受信します。このエラーを解決するには、DB インスタンスにストレージ容量を追加します。詳細については、「Amazon RDS DB インスタンスのストレージ不足」を参照してください。

オプションとして、Amazon CloudWatch の FreeStorageSpace メトリクスを使って DB インスタンスの使用可能なストレージ容量をモニタリングできます。詳細については、「Amazon RDS​ のモニタリングの概要」を参照してください。Amazon RDS の low storage イベント通知をサブスクライブして、DB インスタンスが割り当てられたストレージの 90% 以上を消費したときに通知を受け取ることも可能です。詳細については、「Amazon RDS のイベントカテゴリとイベントメッセージ」を参照してください。

5.テーブルがファイルサイズの上限に到達した

Amazon RDS のファイルサイズ制限は、InnoDB の file-per-table テーブルスペースを 16 TB に制限していますが、2014 年より前に作成された DB インスタンスには、上限がこれより低いものもあります。

サイズの上限が低い DB インスタンスがある場合は、mysqldump を使用してデータのダンプを作成することができます。その後、上限が高い新しい DB インスタンスにデータをインポートします。