2

特定のデータベースに特定のテーブルを再作成しようとすると、MySQLは私に悲しみを与えます。問題は、MySQLのどこかにテーブルの外部キーのレコードがあり、テーブルを再作成しようとすると制約をチェックし続けることだと思います。

問題のデータベースはテスト環境用であり、prod DBをダンプし、テストDBを削除し、テストDBを再作成してから、prodDBダンプを新しいテスト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を作成してみます。エラーが発生します。別の名前で別のデータベースを作成し、同じ手順に従います。今回は問題ありません。

4

1 に答える 1

1

このMySQLのバグと同じようです。

コメントのはるか下にある手順は私のために働いた、つまり

  • 古いスキーマと同じスキーマを使用してテーブルを再度作成しますが、MyISAMエンジンを使用します
  • ALTER TABLEを使用して、エンジンをinnodbに変更します

その後、物事は正しく機能しているように見えます。これで、データベースを削除して、問題なく完全な復元を実行できます。

于 2010-11-13T07:51:47.497 に答える