mysql「覚えている」innodbテーブルを削除しました
-
27-09-2019 - |
質問
MySQLは、特定のデータベースで特定のテーブルを再作成しようとすると、悲しみを与えています。問題は、MySQLがテーブルの外部キーの記録をいくつか持っており、テーブルを再現しようとするときに制約をチェックしようとし続けることだと思います。
問題のデータベースはテスト環境向けであり、PROD DBをダンプし、テストDBをドロップし、テストDBを再度作成し、新しいテストDBにPROD DBダンプを適用することにより、定期的に更新されます。
しかし、昨夜この手順を行ったとき、私は突然mysqlのerrno:121に出くわしました。これは通常誤った外部キーに関連しています...キーを指定せずに別のテーブルの定義で試してみると、errno:150を取得します代わりは。ただし、これは、古い名前とまったく同じデータベースにダンプを適用しようとする場合にのみ発生します。古い名前(同じサーバーのまだ)とは異なるデータベースを持つデータベースを作成してダンプを適用すると、問題はありません。
実際、まったく新しいデータベースでも、キーなしでまったく同じ名前のテーブルを作成することさえできません。
この例は問題を示しています
mysql> create database test_db;
Query OK, 1 row affected (0.01 sec)
mysql> connect test_db;
Connection id: 1590
Current database: test_db
mysql> create table client_feed_group(id int);
ERROR 1005 (HY000): Can't create table './test_db/client_feed_group.frm' (errno: 150)
mysql> create database new_db_name;
Query OK, 1 row affected (0.00 sec)
mysql> connect new_db_name;
Connection id: 1591
Current database: new_db_name
mysql> create table client_feed_group(id int);
Query OK, 0 rows affected (0.01 sec)
私はすでにtest_dbデータベースを削除しています。これにより、すべてのテーブルとすべてのレコードが削除されるはずです。次に、それを作成し、それに接続して、古いテーブルclient_feed_groupを作成しようとします。エラーが発生します。別の名前の別のデータベースを作成し、同じ手順に従います。今回は問題ありません。
解決
それは同じように見えます このmysqlバグ.
コメントのはるか下にある手順は私のために働いた、つまり
- 古いスキーマと同じスキーマを使用して、Myisamエンジンを使用してテーブルをもう一度作成します
- Alter Tableを使用して、エンジンをInnodbに変更します
その後、物事は正しく機能しているように見えます。これで、データベースをドロップして、問題なく完全な復元を行うことができます。