Dies ist der Grund, warum MySQL diese Dateien nicht sehen kann: Der System-Tablespace (ibdata1) verfügt über ein Storage-Engine-spezifisches Datenwörterbuch, mit dem InnoDB die potenzielle Verwendung von Tabellen ermitteln kann:
Das Verschieben von InnoDB-Tabellen von einem Ort an einen anderen erfordert Befehle wie
ALTER TABLE tblname DISCARD TABLESPACE;
ALTER TABLE tblname IMPORT TABLESPACE;
Hier ist ein Teil der MySQL 5.5-Dokumentation, in der erklärt wird, was zu beachten ist
Überlegungen zur Portabilität von .ibd-Dateien
Sie können .ibd-Dateien nicht wie bei MyISAM-Tabellendateien frei zwischen Datenbankverzeichnissen verschieben. Die im gemeinsam genutzten InnoDB-Tabellenbereich gespeicherte Tabellendefinition enthält den Datenbanknamen. Die in den Tablespace-Dateien gespeicherten Transaktions-IDs und Protokollfolgenummern unterscheiden sich auch zwischen den Datenbanken.
Verwenden Sie eine Anweisung RENAME TABLE, um eine .ibd-Datei und die zugehörige Tabelle von einer Datenbank in eine andere zu verschieben:
RENAME TABLE db1.tbl_name TO db2.tbl_name; Wenn Sie eine "saubere" Sicherung einer .ibd-Datei haben, können Sie diese in der MySQL-Installation wiederherstellen, aus der sie wie folgt stammt:
Die Tabelle darf seit dem Kopieren der .ibd-Datei nicht gelöscht oder abgeschnitten worden sein, da dadurch die im Tablespace gespeicherte Tabellen-ID geändert wird.
Setzen Sie diese ALTER TABLE-Anweisung ab, um die aktuelle .ibd-Datei zu löschen:
ALTER TABLE Tabellenname DISCARD TABLESPACE; Kopieren Sie die .ibd-Sicherungsdatei in das richtige Datenbankverzeichnis.
Setzen Sie diese ALTER TABLE-Anweisung ab, um InnoDB anzuweisen, die neue .ibd-Datei für die Tabelle zu verwenden:
ALTER TABLE Tabellenname IMPORT TABLESPACE; In diesem Zusammenhang ist eine "saubere" .ibd-Dateisicherung eine, für die die folgenden Anforderungen erfüllt sind:
Es gibt keine nicht festgeschriebenen Änderungen durch Transaktionen in der .ibd-Datei.
Die .ibd-Datei enthält keine nicht zusammengeführten Einfügepuffereinträge.
Purge hat alle mit Löschzeichen versehenen Indexdatensätze aus der .ibd-Datei entfernt.
mysqld hat alle geänderten Seiten der .ibd-Datei aus dem Pufferpool in die Datei geleert.
In Anbetracht dieser Einschränkungen und Protokolle wird hier eine Vorgehensweise vorgeschlagen
In diesem Beispiel versuchen wir, die tags
Tabelle in der mydb
Datenbank wiederherzustellen
SCHRITT 1
Stellen Sie sicher, dass Sie Sicherungen von diesen .frm
und .ibd
Dateien in haben/tmp/innodb_data
SCHRITT 2
Holen Sie sich die CREATE TABLE tags
Anweisung und führen Sie sie aus als CREATE TABLE mydb.tags ...
. Stellen Sie sicher, dass es sich genau um die gleiche Struktur wie das Original handelttags.frm
SCHRITT 3
Löschen Sie die leere tags.ibd
mit MySQL
ALTER TABLE mydb.tags DISCARD TABLESPACE;
SCHRITT 4
Bringen Sie die Sicherungskopie von tags.ibd
cd /var/lib/mysql/mydb
cp /tmp/innodb_data.tags.ibd .
chown mysql:mysql tags.ibd
SCHRITT 5
Fügen Sie tags
dem InnoDB Data Dictionary eine Tabelle hinzu
ALTER TABLE mydb.tags IMPORT TABLESPACE;
SCHRITT 6
Testen Sie die Zugänglichkeit der Tabelle
SHOW CREATE TABLE mydb.tags\G
SELECT * FROM mydb.tags LIMIT 10;
Wenn Sie normale Ergebnisse erhalten, gratulieren Sie zum Import einer InnoDB-Tabelle.
SCHRITT 7
Bitte löschen Sie in Zukunft ibdata1 und seine Protokolle nicht mehr
Versuche es !!!
Ich habe solche Dinge schon einmal besprochen
VORBEHALT
Was ist, wenn Sie die Tabellenstruktur der nicht kennen tags
?
Es gibt Tools, mit denen die Anweisung CREATE TABLE nur mithilfe der .frm
Datei abgerufen werden kann. Ich habe auch dazu einen Beitrag geschrieben: Wie kann ich das Tabellenschema nur aus der .frm-Datei extrahieren? . In diesem Beitrag habe ich eine .frm-Datei von einer Linux-Box auf einen Windows-Computer kopiert, das Windows-Tool ausgeführt und die CREATE TABLE
Anweisung erhalten.