問題の説明
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に設定し、インデックスを再作成します。