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

最終更新日: 2020 年 11 月 30 日

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 に対してサポートされているストレージエンジンを参照してください。

解決方法

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

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

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

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

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

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 パラメータをより高い値に設定します。

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

InnoDB テーブルの最大テーブルスペースサイズは 40 億ページ (16 TB) です。

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

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

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

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

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

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 のイベントカテゴリとイベントメッセージを参照してください。

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

注: 既存の DB インスタンスには、下限があります。例えば、2014 年 4 月以前に作成された MySQL DB インスタンスでは、ファイルとテーブルのサイズ上限は 2 TB です。この 2 TB のファイルサイズの上限は、DB インスタンスの作成時期にかかわらず、2014 年 4 月以前に作成された DB スナップショットから作成された DB インスタンスやリードレプリカにも適用されます。

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