mysql - Tabelle kann nicht gelöscht werden, existiert nicht, Tabelle kann nicht erstellt werden

mysql - Tabelle kann nicht gelöscht werden, existiert nicht, Tabelle kann nicht erstellt werden

Nach einem Serverabsturz haben wir einige sehr seltsame Probleme mit einer bestimmten Tabellenreferenz.

Bei Auswahl einer Wiederherstellung aus einem Backup wurde die Datenbank gelöscht und ein SQL-Backup-Dump geladen. Dies schlägt jedoch beim Erstellen der Tabelle cache_contentmit dem Fehler „Tabelle ist bereits vorhanden“ fehl.

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'

Merkwürdigerweise hat die Drop-Tabelle die .frm-, aber nicht die .ibd-Datei (sofern vorhanden) entfernt. Die Create-Tabelle erstellt zwar die .ibd-Datei, aber nicht die .frm-Datei.

Ich habe zahlreiche Methoden zur Wiederherstellung ausprobiert, darunter das Importieren des Dumps in eine neue Datenbank (ohne Probleme abgeschlossen), das Herunterfahren von MySQL und das Kopieren der relevanten .frm- und .ibd-Dateien und dann die VerwendungAbonnierenum zu versuchen, diese „bekanntermaßen gute“ Version anzuhängen:

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

Beim Überprüfen der zugehörigen Tabellen im Informationsschema kann ich sehen, dass dies der Fall ist und der Tabellenbereich 0 zugewiesen wurde.

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)

Serverversion: Percona-Server-server-55-5.5.27-rel28.0.291.rhel6.x86_64

Nach allem, was ich gelesen habe, bin ich mir ziemlich sicher, dass das Entfernen von ibdata1 ib_logfile* die einzige Möglichkeit sein könnte, diese „Geisterreferenz“ zu bereinigen.

Meine Frage: Gibt es eine Möglichkeit, diese Geisterreferenzen zu bereinigen, damit die Tabelle aus einer Sicherung wiederhergestellt werden kann?

Antwort1

Am Ende entschied ich mich, alle Datenbanken aus Backups wiederherzustellen,

  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. Löschen und Wiederherstellen aller Datenbanken, die während 1. nicht intakt waren, aus einzelnen Backups
  8. service mysql restart && service iptables restart

Ich lasse diese Antwort hier und die Frage für die nächste Woche unbeantwortet; ich hoffejemandkann eine Lösung bieten, bei der die gesamten IB-Daten nicht neu erstellt werden müssen.

verwandte Informationen