Hier ist der Grund, warum MySQL diese Dateien nicht sehen kann: Der System-Tablespace (ibdata1) hat ein Storage-Engine-spezifisches Datenwörterbuch, mit dem InnoDB eine mögliche Tabellennutzung abbildet:
ALTER TABLE tblname DISCARD TABLESPACE;
ALTER TABLE tblname IMPORT TABLESPACE;
Das Verschieben von InnoDB-Tabellen von einem Ort zum anderen erfordert Befehle wie
ALTER TABLE mydb.tags DISCARD TABLESPACE;
Hier ist ein Teil der MySQL 5.5-Dokumentation , der erklärt, was zu beachten ist
Portabilitätsüberlegungen für .ibd-Dateien
Sie können .ibd-Dateien nicht frei zwischen Datenbankverzeichnissen verschieben, wie Sie es mit MyISAM-Tabellendateien können. Die im gemeinsamen InnoDB-Tablespace gespeicherte Tabellendefinition enthält den Datenbanknamen. Die in den Tablespace-Dateien gespeicherten Transaktions-IDs und Log-Sequenznummern unterscheiden sich ebenfalls zwischen den Datenbanken.
Um eine .ibd-Datei und die zugehörige Tabelle von einer Datenbank in eine andere zu verschieben, verwenden Sie eine RENAME TABLE-Anweisung:
RENAME TABLE db1.tbl_name TO db2.tbl_name; Wenn Sie eine “saubere” Sicherung einer .ibd-Datei haben, können Sie sie wie folgt in der MySQL-Installation wiederherstellen, aus der sie stammt:
Die Tabelle darf nicht gelöscht oder abgeschnitten worden sein, seit Sie die .ibd-Datei kopiert haben, da dies die im Tablespace gespeicherte Tabellen-ID ändert.
Geben Sie diese ALTER TABLE-Anweisung aus, um die aktuelle .ibd-Datei zu löschen:
ALTER TABLE tbl_name DISCARD TABLESPACE; Kopieren Sie die Sicherungs.ibd-Datei in das richtige Datenbankverzeichnis.
Geben Sie diese ALTER TABLE-Anweisung aus, um InnoDB anzuweisen, die neue .ibd-Datei für die Tabelle zu verwenden:
ALTER TABLE tbl_name IMPORT TABLESPACE; In diesem Zusammenhang ist eine “saubere” .ibd-Dateisicherung eine, bei der die folgenden Anforderungen erfüllt sind:
Es gibt keine unbestätigten Änderungen durch Transaktionen in der .ibd-Datei.
Es gibt keine nicht freigegebenen Einfügepuffereinträge in der .ibd-Datei.
Purge hat alle löschmarkierten Indexeinträge aus der .ibd-Datei entfernt.
mysqld hat alle modifizierten Seiten der .ibd-Datei aus dem Pufferpool in die Datei gespült.
In Anbetracht dieser Vorbehalte und Protokolle ist hier eine vorgeschlagene Vorgehensweise
Für dieses Beispiel lassen Sie uns versuchen, die tags
-Tabelle in der mydb
-Datenbank wiederherzustellen
SCHRITT #1
Stellen Sie sicher, dass Sie Backups der .frm
- und .ibd
-Dateien in /tmp/innodb_data
SCHRITT #2
Holen Sie die CREATE TABLE tags
-Anweisung und führen Sie sie als CREATE TABLE mydb.tags ...
aus. Stellen Sie sicher, dass es genau die gleiche Struktur wie das Original tags.frm
SCHRITT #3
Löschen Sie das leere tags.ibd
mit MySQL
cd /var/lib/mysql/mydb
cp /tmp/innodb_data.tags.ibd .
chown mysql:mysql tags.ibd
SCHRITT #4
Bringen Sie die Sicherheitskopie von tags.ibd
ALTER TABLE mydb.tags IMPORT TABLESPACE;
SCHRITT #5
Hinzufügen der Tabelle tags
zum InnoDB Data Dictionary
SHOW CREATE TABLE mydb.tags\G
SELECT * FROM mydb.tags LIMIT 10;
SCHRITT 6
Testen Sie die Erreichbarkeit der Tabelle
Wenn Sie normale Ergebnisse erhalten, herzlichen Glückwunsch, dass Sie eine InnoDB-Tabelle importieren.
STEP 7
Löschen Sie in Zukunft bitte nicht ibdata1 und seine Logs
Probieren Sie es aus!!!
Ich habe solche Dinge schon einmal besprochen
CAVEAT
Was ist, wenn Sie die Tabellenstruktur der tags
nicht kennen?
Es gibt Werkzeuge, um die CREATE TABLE-Anweisung nur über die .frm
-Datei zu erhalten. Ich habe dazu auch einen Beitrag geschrieben: Wie kann man das Tabellenschema nur aus der .frm-Datei extrahieren? . In diesem Beitrag habe ich eine .frm-Datei von einem Linux-Rechner auf einen Windows-Rechner kopiert, das Windows-Tool ausgeführt und die CREATE TABLE
-Anweisung erhalten.