Aus diesem Grund kann MySQL diese Dateien nicht sehen: Der System-Tablespace (ibdata1) verfügt über ein Storage-Engine-spezifisches Datenwörterbuch, mit dem InnoDB die potenzielle Tabellennutzung 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 erläutert wird, was zu beachten ist
Überlegungen zur Portabilität für .ibd-Dateien
Sie können .ibd-Dateien nicht wie in MyISAM-Tabellendateien frei zwischen Datenbankverzeichnissen verschieben. Die im gemeinsamen InnoDB-Tabellenbereich gespeicherte Tabellendefinition enthält den Datenbanknamen. Die Transaktions-IDs und Protokollfolgenummern, die in den Tablespace-Dateien gespeichert sind, unterscheiden sich auch zwischen den Datenbanken.
Verwenden Sie eine RENAME TABLE-Anweisung, um eine .ibd-Datei und die zugeordnete 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 sie in der MySQL-Installation, von der sie stammt, wie folgt wiederherstellen:
Die Tabelle darf nicht gelöscht oder abgeschnitten worden sein, seit Sie die .ibd-Datei kopiert haben, da dadurch die im Tabellenbereich 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 mitzuteilen, dass die neue .ibd-Datei für die Tabelle verwendet werden soll:
ALTER TABLE tabellenname IMPORT TABLESPACE; In diesem Zusammenhang ist eine "saubere" .ibd-Dateisicherung eine Sicherung, für die die folgenden Anforderungen erfüllt sind:
Es gibt keine nicht festgeschriebenen Änderungen durch Transaktionen in der .ibd-Datei.
In der .ibd-Datei befinden sich keine nicht einfügten Einfügungspuffereinträge.
Bereinigen hat alle löschmarkierten Indexeinträge 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 ein Vorgehen vorgeschlagen
In diesem Beispiel versuchen wir, die tags
Tabelle in der mydb
Datenbank wiederherzustellen
SCHRITT 1
Stellen Sie sicher, dass Sie Sicherungskopien von diesen .frm
und .ibd
Dateien haben/tmp/innodb_data
SCHRITT 2
Holen Sie sich die CREATE TABLE tags
Anweisung und führen Sie sie als aus CREATE TABLE mydb.tags ...
. Stellen Sie sicher, dass es genau die gleiche Struktur wie das Original isttags.frm
SCHRITT 3
Löschen Sie das 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, können Sie eine InnoDB-Tabelle importieren.
SCHRITT 7
Löschen Sie in Zukunft nicht ibdata1 und seine Protokolle
Versuche es !!!
Ich habe solche Dinge schon früher besprochen
Apr 23, 2012
: MySQL: Wie kann ich eine Tabelle wiederherstellen, die in einer .frm- und einer .ibd-Datei gespeichert ist?Sep 28, 2011
: So stellen Sie eine InnoDB-Tabelle wieder her, deren Dateien verschoben wurden
VORBEHALT
Was ist, wenn Sie die Tabellenstruktur des nicht kennen tags
?
Es gibt Tools, um die CREATE TABLE-Anweisung nur über die .frm
Datei abzurufen . Ich habe auch einen Beitrag darüber geschrieben: Wie kann das Tabellenschema nur aus der .frm-Datei extrahiert werden? . 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.