mysql - テーブルが存在しないために削除できません。テーブルが存在するために作成できません。

mysql - テーブルが存在しないために削除できません。テーブルが存在するために作成できません。

サーバーがクラッシュした後、特定のテーブル参照で非常に奇妙な問題が発生しています。

バックアップからの復元を選択すると、データベースが削除され、バックアップ SQL ダンプがロードされますが、テーブルの作成時にcache_content「テーブルが既に存在します」というエラーが発生して失敗します。

mysql> create table cache_content( id int NOT NULL DEFAULT 0 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ERROR 1005 (HY000): Can't create table '****.cache_content' (errno: -1) mysql> drop table cache_content; ERROR 1051 (42S02): Unknown table 'cache_content'

奇妙なことに、ドロップ テーブルでは .frm は削除されましたが、.ibd ファイル (存在する場合) は削除されませんでした。一方、テーブルの作成では .ibd ファイルが作成されますが、.frm ファイルは作成されません。

私は、ダンプを新しいデータベースにインポートする(問題なく完了)、mysqlをシャットダウンして関連する.frmファイルと.ibdファイルをコピーするなど、復元のためにさまざまな方法を試しました。idbconnectこの「既知の正常な」バージョンを添付してみます:

... Space id: 1952673645 (0x74636F6D) Next record at offset: 74 TABLE_ID of `****/`.`cache_content` can not be 0 ...

information_schemaの関連テーブルを確認すると、これが事実であり、TABLESPACEが0に割り当てられていることがわかります。

mysql> select * from INNODB_SYS_TABLES where `SCHEMA`="*****";
+----------+--------+--------------------------+------+--------+-------+
| TABLE_ID | SCHEMA | NAME                     | FLAG | N_COLS | SPACE |
+----------+--------+--------------------------+------+--------+-------+
...

|    19791 | *****  | cache_content            |    1 |      9 |     0 |
+----------+--------+--------------------------+------+--------+-------+
N rows in set (0.01 sec)

mysql> select * FROM INNODB_SYS_INDEXES where TABLE_ID=19791;
+----------+--------+----------+------+----------+---------+-------+
| INDEX_ID | NAME   | TABLE_ID | TYPE | N_FIELDS | PAGE_NO | SPACE |
+----------+--------+----------+------+----------+---------+-------+
|     7919 | expire |    19791 |    0 |        1 |  311158 |     0 |
+----------+--------+----------+------+----------+---------+-------+
1 row in set (0.00 sec)

サーバー バージョン: Percona-Server-server-55-5.5.27-rel28.0.291.rhel6.x86_64

私が読んだところによると、ibdata1 ib_logfile* を削除することが、この「ゴースト」参照をクリーンアップする唯一の方法である可能性があるようです。

質問: これらのゴースト参照をクリーンアップして、テーブルをバックアップから復元できるようにする方法はありますか?

答え1

最終的に私はすべてのデータベースをバックアップから復元することを選択しました。

  1. mysqldump --all-databases --triggers > /path/to/dumpfile.sql
  2. service mysql shutdown
  3. rm -rf /path/to/datadir && mkdir /path/to/datadir && chown mysql.mysql /path/to/datadir
  4. iptables -I INPUT -p tcp --dport 3306 -j REJECT && service mysql start
  5. mysql_install_db --datadir=/path/to/datadir
  6. mysql < /path/to/dumpfile.sql
  7. 1. 個々のバックアップから、損なわれたデータベースを削除して復元します。
  8. service mysql restart && service iptables restart

私はこの回答をここに残し、質問を来週まで受け付けないでおきます。誰かibdata 全体を再構築する必要がないソリューションを提供できます。

関連情報