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_content
mit 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,
mysqldump --all-databases --triggers > /path/to/dumpfile.sql
service mysql shutdown
rm -rf /path/to/datadir && mkdir /path/to/datadir && chown mysql.mysql /path/to/datadir
iptables -I INPUT -p tcp --dport 3306 -j REJECT && service mysql start
mysql_install_db --datadir=/path/to/datadir
mysql < /path/to/dumpfile.sql
- Löschen und Wiederherstellen aller Datenbanken, die während 1. nicht intakt waren, aus einzelnen Backups
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.