So stellen Sie eine InnoDB-Tabelle wieder her, deren Dateien verschoben wurden

13

Ich habe also einen Test-DB-Server, der auf einem Replikationsstream eingerichtet wurde. Über den Namen kam eine Optimierung durch, die schnell den Platz auf dem Slaves-Datadir ausfüllte. Mysql wartete pflichtgemäß nur auf etwas mehr Platz.

Dieser Datadir ist ein Dateisystem, das NUR als mysql-Datadir verwendet wird. Es gab also nichts anderes, was freigelassen werden konnte.

Ich hatte einen 4-Gig-Innodb-Test-Tisch, der nicht Teil des Replikations-Streams war, also nahm ich an, dass ich etwas ausprobieren würde, um zu sehen, ob es funktionieren würde, und als Testumgebung war ich nicht zu besorgt, wenn etwas schrecklich schief lief.

Hier sind die Schritte, die ich unternommen habe

  1. Er spülte den Tisch, den ich gerade bewegen wollte
  2. Es wurde eine Lesesperre gesetzt (obwohl nichts darauf geschrieben wurde und es nicht im Replikationsstream war)
  3. Kopieren Sie die Dateien .frm und .ibd in ein Dateisystem mit einem freien Speicherplatz
  4. Schaltete den Tisch frei
  5. Diese Tabelle wurde abgeschnitten. Dadurch wurde genügend Speicherplatz für die Optimierung freigegeben, damit die Replikation erneut ausgeführt werden kann.
  6. Stoppen Sie das Slaven / Herunterfahren von MySQL
  7. Kopieren Sie die Datei aus tmp zurück in das Datenverzeichnis
  8. Starten Sie mysql neu

Im .err-Protokoll wird nichts angezeigt, es sieht gut aus. Ich verbinde und benutze mydb; und sieh dir den Tisch an, mit dem ich in Showtabellen rumgespielt habe. Aber wenn ich es versuche

select * from testtable limit 10;

Ich bekomme den Fehler

ERROR 1146 (42S02): Table 'mydb.testtable' doesn't exist

Soweit ich das beurteilen kann, kann ich von allen anderen Tabellen einwandfrei lesen und die Replikation wurde ohne Beschwerden wieder aufgenommen.

Kann ich irgendetwas tun, um mich von diesem Punkt zu erholen? Ich kann es bei Bedarf von Grund auf neu erstellen, war aber neugierig, was andere über dieses Unternehmen im Allgemeinen denken. Gab es irgendetwas an der Reihe von Schritten, die ich unternommen habe, was zu fehlerloseren Ergebnissen geführt hätte?

Was wäre, wenn dies kein Testserver wäre? Ich könnte es nicht einfach live machen und sehen, was passiert? Was wäre der beste Weg, um vorübergehend Speicherplatz auf einem Produktionssklaven freizugeben, wenn mir das gefallen würde?

atxdba
quelle

Antworten:

15

Das größte, was die meisten Leute an TRUNCATE TABLE vergessen, ist, dass TRUNCATE TABLE DDL und nicht DML ist . In InnoDB enthalten die Metadaten in ibdata1 eine nummerierte Liste von InnoDB-Tabellen. Bei Verwendung von TRUNCATE TABLE wird die interne Metadaten-ID der InnoDB-Tabelle verschoben. Dies geschieht, weil TRUNCATE TABLE effektiv Folgendes ausführt:

Beispiel: So kürzen Sie eine InnoDB-Tabelle mit dem Namen mydb.mytb

USE mydb
CREATE TABLE newtb LIKE mytb;
ALTER TABLE mytb RENAME oldtb;
ALTER TABLE newtb RENAME mytb;
DROP TABLE oldtb;

Die neue mytb hätte daher eine andere interne Metadaten-ID.

Wenn Sie die .ibd-Datei an einen anderen Ort kopiert haben, enthält die .ibd die ursprüngliche interne Metadaten-ID. Durch einfaches Zurücksetzen der .ibd-Datei wird die interne Metadaten-ID nicht mit der in ibdata1 abgeglichen.

Was Sie hätten tun sollen, ist Folgendes:

Kopieren Sie die .ibd-Datei der InnoDB-Tabelle. Dann führe das aus

ALTER TABLE tablename DISCARD TABLESPACE;

Um es später wieder herzustellen, kopieren Sie die .ibd-Datei zurück in datadir und führen Sie sie dann aus

ALTER TABLE tablename IMPORT TABLESPACE;

Dies hätte die interne Metadaten-ID erhalten.

Stellen Sie sicher, dass .frm immer vorhanden ist.

Ich habe einmal einem Client geholfen, 30 InnoDB-Tabellen wiederherzustellen, die er auf die gleiche Weise abgespritzt hat. Ich musste einen anderen DB-Server verwenden und einige Spiele mit dem Hinzufügen und Löschen von InnoDB-Tabellen spielen, um die korrekte interne Metadaten-ID zu ermitteln.

Der Kunde hat diesen Artikel gefunden: http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file . Wir haben es benutzt und es hat sehr geholfen. Ich hoffe es hilft dir.

RolandoMySQLDBA
quelle
Ich habe 2 Datenbanken, in denen alle Tabellen sagen Table 'X' doesn't exist in engine. Muss ich die obige Methode für jede Tabelle ausführen oder gibt es bessere Möglichkeiten, dies zu beheben?
papanito vor
-2

Ich habe mit meinem Mac erlebt, dass ich vor dem Verkauf an einen Freund einfach den XAMPP-Ordner nur auf meine Festplatte kopiere. (NICHT ERFOLGREICH) Leider brachte es Probleme mit sich, weil ich die folgenden Schritte ausprobiert habe: - Ich installiere frisches XAMPP und kopiere die gesamten \ httdocs und var \ mysql auf meinen neuen Mac, die Datenbank nur mit .frm und .ibd, NICHT ARBEITEND, ich kann immer noch nicht auf die Tabellen in PHPMyAdmin zugreifen ... - Ich habe versucht, die gleiche xampp-Version zu installieren und die obigen Schritte zu wiederholen, immer noch NICHT ARBEITEND. - Beschlossen, ins Bett zu gehen.

(ERFOLGREICH) - Heute Morgen habe ich meine Sicherungsdiskette mitgebracht und es mit Windows 7 versucht. - Installieren Sie das neueste XAMPP für Windows, c: \ xampp - Ich habe eine Website (Ordner) aus meiner Sicherung \ httdocs und den entsprechenden Datenbankordner in \ var \ mysql ist BEREIT in meinem Windows 7, ich möchte es nur mit einer Website versuchen, dann versuche ich den Rest, weil ich viele Projekte in httdocs \ und \ var \ mysql habe - ich kopiere den Erwähnungsordner httdocs \ nach windows c: \ xampp \ httdocs und kopieren Sie das Verzeichnis \ var \ mysql nach c: \ xampp \ mysql \ data

NOCH NICHT LETZT Ich kopiere die Dateien ib_logfile0, ib_logfile1 und ibdata1 von meiner Sicherungsdatei nach Windows XAMPP C: \ XAMPP \ MYSQL \ DATA

Ich aktualisiere die http: // localhost / mywebsite

WOW WOW DONE ... es funktioniert ...

Armindo
quelle