すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:ApsaraDB RDS for MySQLインスタンスに「エラー1146 (42S02): テーブル 'xxx.xxx' が存在しない」というエラーメッセージが表示された場合はどうすればよいですか?

最終更新日:Jan 23, 2024

問題の説明

ApsaraDB RDS for MySQLインスタンスを再起動してテーブル関連の操作を実行すると、次のエラーメッセージが表示されます。

エラー1146 (42S02): テーブル 'xxx.xxx' は存在しません

エラーログには次の情報が含まれています。

[警告] InnoDB: ロードテーブル 'xxx'.'xxx' が失敗した
、テーブルに外部キーインデックスがありません。 'foreign_key_checks 'をオフにして、もう一度お試しください。
[警告] InnoDB: InnoDBの内部データディクショナリからテーブルxxx/xxxを開けません。テーブルのfrmファイルが存在します。

原因

MySQLでは、外部キーが必要な制約を満たす場合にのみ、外部キーを追加できます。 詳細については、「FOREIGN KEY Constraints」をご参照ください。

MySQLでは、foreign_key_checks変数を使用して、外部キーが必要な制約を満たしているかどうかを確認します。 RDSインスタンスの実行中に変数を変更できます。変更を有効にするためにRDSインスタンスを再起動する必要はありません。 変数のデフォルト値はONです。 foreign_key_checks変数をOFFに設定すると、外部キーのチェックは無効になります。 場合によっては、値OFFを使用して外部キーのチェックを無効にすることはできません。 詳細については、「FOREIGN KEY Constraints」をご参照ください。

外部キーのチェックを無効にし、外部キーの制約を満たさないように外部キーを変更した場合、RDSインスタンスの実行中にエラーメッセージは表示されません。 デフォルトでは、RDSインスタンスを再起動すると、foreign_key_checks変数はONに設定されます。 RDSインスタンスの再起動後にInnoDBテーブルを開くと、外部キーがチェックされ、エラーメッセージが表示されます。

このセクションでは、上記の問題で考えられる原因について説明します。

  • 原因1: 親テーブルと子テーブルの外部キー関連列の文字セットが変更されています。

    RDSインスタンスがMySQL 5.6、MySQL 5.7、またはMySQL 8.0を実行している場合、foreign_key_checks変数がOFFに設定されている場合、親テーブルと子テーブルの外部キー関連の列の文字セットを変更できます。 RDSインスタンスが再起動された後、RDSインスタンスはデータベースエンジンに基づいて異なる問題が発生する可能性があります。

    • MySQL 5.6またはMySQL 5.7の場合、エラーメッセージがエラーログに表示され、親テーブルは使用できません。

    • MySQL 8.0の場合、エラーメッセージはエラーログに表示されず、親テーブルを使用できます。

  • 原因2: 親テーブルと子テーブルの外部キー関連の列のインデックスが削除されます。

    • MySQL 5.7とMySQL 8.0の場合、foreign_key_checks変数がOFFに設定されている場合、親テーブルと子テーブルの外部キー関連列のインデックスを削除することはできません。

    • MySQL 5.6の場合、foreign_key_checks変数がOFFに設定されている場合、親テーブルと子テーブルの外部キー関連の列のインデックスを削除できます。 インデックスが削除された後、RDSインスタンスを再起動するとエラーメッセージが表示され、インデックスが削除されたテーブルは使用できません。

ソリューション

  • 原因1の解決策: foreign_key_checks変数をOFFに設定し、親テーブルと子テーブルの外部キー関連列の文字セットを同じ文字セットに変更します。

  • 原因2の解決策: foreign_key_checks変数をOFFに設定し、インデックスを再作成します。