Wie mache ich die DROP-Tabelle rückgängig?

11

Ich habe versehentlich alle Tische fallen lassen. Kann ich wieder herstellen? Ich habe keine Sicherungskopie.

Mark Henderson
quelle

Antworten:

12

Wenn Sie buchstäblich kein Backup haben, bin ich mir zu 99% sicher, dass Sie kein Glück haben.

Wenn Sie eine noch so alte Form der Sicherung haben, haben Sie dann die binäre Protokollierung über die Option log-bin in der MySQL-Konfigurationsdatei (my.ini) aktiviert? In diesem Fall können Sie sie möglicherweise seit der letzten Sicherung wiederherstellen.

Schlechter Weg, um eine Woche zu beginnen, sorry.

Chopper3
quelle
2
Vermutlich, weil Sie unerfahren sind, haben wir alle so etwas getan, immer noch manchmal (ich habe mich vor nicht einmal einer Woche aus meinem eigenen VCenter ausgeschlossen) - alles, was zählt, ist, dass Sie daraus lernen, damit Sie weniger sind wahrscheinlich wiederholen.
Chopper3
Was kann ich jetzt machen?? Ich kann nicht einfach sitzen und warten !!!!
8
Sagen Sie Ihrem Manager
Chopper3
4
Es behebt das Problem nicht, aber vielleicht hat einer Ihrer Entwickler eine Kopie, die nicht zu weit von der letzten guten Kopie entfernt ist?
Tom O'Connor
3
Tom spricht einen sehr guten Punkt an: Wenn Ihre Entwickler die Gewohnheit haben, regelmäßig Schnappschüsse der Live-Daten zu Test- / Entwicklungszwecken zu machen, haben Sie möglicherweise Glück und einer von ihnen verfügt über eine kürzlich unberührte Kopie, um Ihre Situation von "herabzustufen". vollständige Katastrophe "nur" große Unannehmlichkeiten ".
David Spillett
7

Die Frage ist ziemlich alt, aber es gibt keine einzige positive Antwort, also werde ich eine hinzufügen.

Nachdem MySQL eine Tabelle gelöscht hat, befinden sich die Daten noch eine Weile auf dem Medium. So können Sie Datensätze abrufen und eine Tabelle neu erstellen. Später werde ich darüber bloggen, aber vorerst eine kurze Skizze.

Sie müssten eine Struktur Ihrer Tabelle haben (Anweisung CREATE TABLE).

Wenn innodb_file_per_table aktiviert ist, befindet sich die abgelegte Tabelle auf der Festplattenpartition. Stoppen Sie MySQL und mounten Sie es so schnell wie möglich als schreibgeschützt neu. Wenn sich MySQL auf einer Root-Partition befand (was übrigens keine gute Idee ist), nehmen Sie ein Image oder nehmen Sie die Festplatte heraus und schließen Sie sie an einen anderen Server an. Stoppen Sie alle Schreibvorgänge mit anderen Worten.

Wenn innodb_file_per_table OFF ist, stoppen Sie einfach MySQL.

Laden Sie dann das Un-Drop-Tool für InnoDB von https://github.com/twindb/undrop-for-innodb/ herunter und kompilieren Sie es . Weitere Informationen finden Sie im Beitrag " Kompilieren des TwinDB-Wiederherstellungs-Toolkits ".

Analysieren Sie dann entweder die Festplattenpartition oder ibdata1 (abhängig von der Einstellung innodb_file_per_table) mit stream_parser:

./stream_parser -f /path/to/diskimage_or_ibdata1

Stellen Sie dann das InnoDB-Wörterbuch wieder her, um festzustellen, in welcher index_id sich die abgelegte Tabelle befand.

Nehmen Sie dann die Tabellenstruktur und holen Sie die Datensätze

./c_parser -f pages-diskimage_or_ibdata1/FIL_PAGE_INDEX/00000<index_id>.page

Es werden Datensätze an stdout und der Befehl LOAD DATA an stderr ausgegeben.

akuzminsky
quelle
Sie Sir hat mein Leben gerettet
Buddhi741
2

Folgendes habe ich getan. Im MySQL-Verzeichnis (für Ubuntu ist dies / var / lib / mysql, für Mac mit Homebrew ist dies / usr / local / var / mysql) habe ich einige Dateien gefunden. Zuerst habe ich das Verzeichnis myapp_development / mit dem jeweiligen Schema in mein lokales MySQL-Verzeichnis kopiert. Dann habe ich meine lokalen ibdata1 gesichert und die ibdata1 des Servers in das mysql-Verzeichnis kopiert. Mysqld getötet. ( ps auxum dann die PID zu finden kill PID). MySQL neu gestartet, im Crash-Recovery-Modus gestartet. Dann habe ich meinen lokalen MySQL-Client gestartet und einen vollständigen Speicherauszug der benötigten Tabellen erstellt.

Und 15.000 Zeilen, die Wochen der Arbeit bei der Eingabe von Metadaten darstellen, von denen wir dachten, dass sie für immer verschwunden sind, werden gespeichert !!

Hoffe das hilft jemandem.

Herzog
quelle
Das ist eine schöne Anstrengung, aber ich würde sicher nicht zu viele Hoffnungen darauf setzen, dass dies eine zuverlässige Technik ist. Trotzdem +1 für kreatives Denken.
John Gardeniers
Ja, du hast recht. Es funktionierte nur, weil wir versehentlich alle Berechtigungen vom MySQL-Benutzer entfernt hatten, sodass die Datenbank für diesen Benutzer als leer angezeigt wurde.
Herzog
2

Sie können leider nur sehr wenig tun, außer eine sehr wertvolle Lektion über die Notwendigkeit eines guten Backup-Plans mitzunehmen.

Abhängig vom Tabellentyp können Sie möglicherweise einen Experten finden, der die Daten aus den auf der Disc verbleibenden Daten wieder zusammenfügt. Eine solche forensische Analyse wäre jedoch sehr, sehr teuer (da dies relativ ungewöhnliche Fähigkeiten erfordern würde) und überhaupt nicht garantiert wirklich nützlich sein.

David Spillett
quelle
Gibt es eine andere Option?
1
Wie FractalizeR vorschlägt, können Sie die zugehörigen Dateien möglicherweise wiederherstellen, wenn es sich bei den Tabellen um einfache MyISAM-Tabellen handelt . Wenn Sie es dann versuchen möchten, müssen Sie den Server jetzt herunterfahren, denn je länger das System aktiv ist, desto größer ist die Wahrscheinlichkeit, dass der von den Dateien verwendete Speicherplatz wiederverwendet wird, wodurch das Wiederherstellen unmöglich wird (oder die nicht gelöschten Dateien den Inhalt beschädigt haben) ). Wie das Wiederherstellen wiederhergestellt wird, hängt vom verwendeten Dateisystem ab. ntfsundelete.com ist der erste nützlich aussehende Link in einer Google-Suche nach Undelete unter NTFS.
David Spillett
0

Wenn dies eine MyISAM-Tabelle war, müssen Sie nur die Tabellendateien in / var / log / mysql oder einem anderen Datenverzeichnis wiederherstellen. Dazu können Sie beispielsweise das Dienstprogramm ext3grep verwenden .

Vladislav Rastrusny
quelle
ext3grep ist für ext3-Dateisysteme. Wenn Sie Windows verwenden, ist es unwahrscheinlich, dass Sie ein ext3-Dateisystem verwenden (wahrscheinlich verwenden Sie NTFS, obwohl es möglicherweise FAT32 ist). Wenn Sie versuchen möchten, gelöschte Dateien wiederherzustellen, müssen Sie den Server so schnell wie möglich herunterfahren, unabhängig davon, welche anderen Dienste darauf ausgeführt werden. Je länger der Server aktiv ist, desto größer ist die Wahrscheinlichkeit, dass das Wiederherstellen nicht helfen kann Du vorallem.
David Spillett
Wenn Sie die Schattenkopie auf dem Volume aktiviert haben, auf dem die MyISAM-Tabellen gespeichert sind, können Sie sie auf diese Weise wiederherstellen.
Catherine MacInnes
Um gelöschte Datenbankdateien wiederherzustellen, können Sie Google nach "ntfs undelete" durchsuchen. Ich weiß nicht, wo sich das Datenverzeichnis auf Ihrem PC befindet. Sie müssen Ihre my.ini darauf überprüfen oder beispielsweise nach Dateien mit der Erweiterung MYD suchen.
Vladislav Rastrusny
0

Sie können a nicht "rückgängig machen" DROP TABLE.

Sie können nachsehen, ob in MySQL die binäre Protokollierung aktiviert ist. Vielleicht können Sie einige Daten von dort extrahieren.

Abgesehen davon können Sie MySQL vergessen und befinden sich in derselben Problemklasse wie "Ich habe versehentlich einige Dateien aus meinem Dateisystem gelöscht". Es gibt einige Tools, die versuchen, Dateien wiederherzustellen, und es gibt auch Unternehmen, die dies auf professioneller Basis tun.

Luke404
quelle
-1

Wenn Sie die binäre Protokollierung aktiviert haben, können Sie zuerst eine Tabelle neu erstellen, wenn Sie ein Schema haben. Stellen Sie sicher, dass Sie ein Schema erstellen, während Sie Binlogs deaktiviert haben. Oder Sie können einfach für die Sitzung überspringen. Anschließend können Sie die Binlogs bis zur letzten Anweisung wiedergeben, die die Drop-Tabelle selbst war.

Wenn nicht, können Sie mithilfe eines Sicherungsdumps wiederherstellen, falls vorhanden. Wenn Sie über CSV-Dateien verfügen, können Sie die Methode zum Laden von Daten infile ausführen, um Daten wiederherzustellen. Wenn Sie von mysqldump wiederherstellen, können Sie eine einzelne Tabelle aus der Dump-Datei wiederherstellen, anstatt die vollständige Datenbank wiederherzustellen. Wenn die Datengröße zu groß ist, können Sie die Schlüssel vor dem Laden deaktivieren. Dies erhöht den Wiederherstellungsprozess erheblich.

Für die Zukunft möchten Sie vielleicht einen verspäteten Sklaven haben, der etwa 10 bis 24 Stunden zurückliegt. Sie können einen verzögerten Slave mit dem Percona Toolkit (pt-Slave-Verzögerung) erstellen.

Roger Moore
quelle