MySQL InnoDB hat Tabellen verloren, aber es existieren Dateien

110864
Get Off My Lawn

Ich habe ein MySQL InnoDB, das alle Datenbanktabellendateien enthält, aber MySQL sieht sie nicht und lädt sie nicht.

Das Problem geschah, weil ich diese drei Dateien gelöscht: ibdata1, ib_logfile0undib_logfile1

Ich hatte Probleme mit dem Starten von mysql und was ich gelesen habe, war, sie zu entfernen, da MySQL sie nur regenerieren wird (ich weiß, ich hätte sie unterstützen sollen, aber nicht).

Was kann ich tun, damit MySQL die Tabellen wieder sieht?

about_member.frm site_stories.frm about_member.ibd site_stories.ibd db.opt stories.frm FTS_00000000000000bb_BEING_DELETED_CACHE.ibd stories.ibd FTS_00000000000000bb_BEING_DELETED.ibd story_comments.frm FTS_00000000000000bb_CONFIG.ibd story_comments.ibd FTS_00000000000000bb_DELETED_CACHE.ibd story_likes.frm FTS_00000000000000bb_DELETED.ibd story_likes.ibd FTS_00000000000000f5_BEING_DELETED_CACHE.ibd story_tags.frm FTS_00000000000000f5_BEING_DELETED.ibd story_tags.ibd FTS_00000000000000f5_CONFIG.ibd story_views.frm FTS_00000000000000f5_DELETED_CACHE.ibd story_views.ibd FTS_00000000000000f5_DELETED.ibd story_view_totals.frm member_favorites.frm story_view_totals.ibd member_favorites.ibd tags.frm members.frm tags.ibd members.ibd 
28
Have you tried to restore those files? The log files can stay deleted. You really shouldn't have deleted ibdata1 Ramhound vor 10 Jahren 0
Ich habe die Datei von einer alten MySQL-Version kopiert, in der sich die Datei befand, die Tabellen jedoch nicht angezeigt werden. Get Off My Lawn vor 10 Jahren 0

2 Antworten auf die Frage

30
RolandoMySQLDBA

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:

InnoDB Architecture

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 tagsTabelle in der mydbDatenbank wiederherzustellen

SCHRITT 1

Stellen Sie sicher, dass Sie Sicherungskopien von diesen .frmund .ibdDateien haben/tmp/innodb_data

SCHRITT 2

Holen Sie sich die CREATE TABLE tagsAnweisung 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.ibdmit 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 tagsdem 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

VORBEHALT

Was ist, wenn Sie die Tabellenstruktur des nicht kennen tags?

Es gibt Tools, um die CREATE TABLE-Anweisung nur über die .frmDatei 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 TABLEAnweisung erhalten.

Danke für die tolle Antwort! Ich bin immer noch dabei, eine Tabelle importieren zu lassen, da ich immer wieder Probleme bekomme, aber ich werde irgendwann dorthin gelangen und Ihnen mitteilen, wie es funktioniert! Vielen Dank! Get Off My Lawn vor 10 Jahren 0
Wenn ich das Create starte, bekomme ich: ** ERROR 1813 (HY000): Tabellenbereich für die Tabelle '`weblyize`.`tags` existiert. DISCARD den Tablespace vor IMPORT. ** Also versuche ich zuerst den alter-Tablespace auszuführen und erhalte folgende Fehlermeldung: ** ERROR 1146 (42S02): Tabelle 'weblyize.tags' existiert nicht **. Was kann ich machen? Get Off My Lawn vor 10 Jahren 1
Vielen Dank! Um meinen Fehler zu beheben, habe ich eine neue Datenbank erstellt, `CREATE TABLE ...` ausgeführt und dann Ihren Schritten gefolgt! Sie haben mich davor bewahrt, sie zu 100% von Grund auf neu schreiben zu müssen! Fremdschlüssel wurden nicht importiert, aber das ist okay, ich kann das selbst machen! Noch einmal Danke! Get Off My Lawn vor 10 Jahren 0
Was ist, wenn ich 100 Tische habe, die auf diese Weise repariert werden sollten? Ich werde keine Operationen für jeden Tisch von Hand ausführen. Wie könnte es automatisiert werden? Oleg Abrazhaev vor 7 Jahren 0
Danke, dass diese Befehle zum Verwerfen / Importieren von Tablespaces meine Daten gespeichert haben! Xipan Xiao vor 5 Jahren 0
9
user293871

Ich habe die gleiche Situation, kann nicht spezifische Tblname löschen oder erstellen. Mein Fixierungsvorgang ist:

  1. Stoppen Sie MySQL.

    service mysql stop 
  2. Entfernen Sie ib_logfile0 und ib_logfile1.

    cd /var/lib/mysql; rm ib_logfile0 ib_logfile1 
  3. Entfernen Sie Tabellenname-Dateien. WARNUNG: DIESE WERDEN DAUERDAUER DURCHGEHEN

    cd /var/lib/mysql/dbname; rm tblname* 
  4. Starten Sie MySQL.

    service mysql start 
Vielen Dank, dass das Problem behoben wurde. Ich habe Schritt 3 nicht ausgeführt. Ich habe einfach die Logfiles entfernt und die Sicherung von MySQL gestartet. Jeff Wilbert vor 8 Jahren 1
Du bist absolut fantastisch! Mein Problem gelöst. Alex G.P. vor 6 Jahren 0