web-dev-qa-db-ja.com

MySQLダンプをRDSに適用すると「テーブル名を解決できません」エラー

外部MySQLインスタンスのRDSへのレプリケーション を設定しています。

外部MySQLインスタンスとRDSはどちらもMySQL 5.7.10を実行します。

手順に従いましたが、mysqldumpを使用してデータベースをダンプし、RDSに接続されたmysqlに送信すると、次のエラーが発生します。

2081行のエラー1215(HY000):外部キー制約を追加できません

RDSでのSHOW ENGINE InnoDB STATUSの表示:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
2016-03-25 01:38:56 0x2ad07ddcf700 Error in foreign key constraint of table db/Prospect:
 FOREIGN KEY (`restaurantId`) REFERENCES `Restaurant` (`id`),
  CONSTRAINT `FK_Prospect_Zone` FOREIGN KEY (`zoneId`) REFERENCES `Zone` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18292 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci:
Cannot resolve table name close to:
 (`id`),
  CONSTRAINT `FK_Prospect_Zone` FOREIGN KEY (`zoneId`) REFERENCES `Zone` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18292 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

確かに、ダンプファイルはテーブルをアルファベット順に再作成するため、ProspectテーブルはRestaurantZoneの前に表示され、エラーを説明できます。

しかし、いいえ、mysqldumpSET FOREIGN_KEY_CHECKS=0をファイルの先頭に追加するため、とにかく動作するはずです。

それで、私はそれをVanilla MySQL 5.7インストールに対してテストすることに決めました、そして驚くことではありません、ダンプは全く同じコマンドでうまくインポートされます。

特にRDSでこのエラーが発生する原因とその回避方法

4
Benjamin

これが次のリリースであるMySQL 5.7.11で 修正されたバグ であることがわかりました。

変更ログから抽出:

InnoDB:foreign_key_checksが無効になっていると、フルテキストインデックスと外部キー制約を持つテーブルの作成に失敗しました。 (バグ#22094601、バグ#78955)

フルテキストインデックスが問題の原因であることを理解するのに時間がかかりました。ダンプが正常にインポートされるまで、ダンプファイルを1行ずつ削除する必要がありました。


残念ながら、RDSはまだMySQL 5.7.11をサポートしていないため、この問題を回避する必要がありました。これが私がしたことです:

  • 通常どおりmysqldumpを使用してダンプファイルを作成しました
  • ダンプファイルを開き、コメントアウトしましたFULLTEXT KEY
  • メモ帳でこれらの行を書き留めた
  • ダンプを通常どおりレプリカにインポートしました
  • レプリカに接続され、ALTER TABLEステートメントを使用して、メモ帳にある各フルテキストインデックスをテーブルに追加します。

これは完璧に機能し、私のテーブルは完全に同期しています。

7
Benjamin