Kann ich eine Transaktion zurücksetzen, die ich bereits durchgeführt habe? (Datenverlust)
Beging ich eine falsche UPDATE
- Anweisung verloren haben und einige Daten.
Ist es möglich, die rollback-jetzt, nachdem ich schon begangen?
Hilfe?
ROLLBACK
sagt NOTICE: there is no transaction in progress
.
Kommentar zu dem Problem
seine nicht möglich.
Wie hast das den gehen? Kein Glück?
InformationsquelleAutor der Frage SSS | 2012-09-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, kann man nicht rückgängig machen, rollback-oder reverse-commit.
DIE DATENBANK STOPPEN!
(Hinweis: wenn Sie die Daten gelöscht Verzeichnis vom Dateisystem, NICHT die Datenbank stoppen. Die folgenden Hinweise gelten, um ein versehentliches Begehen der
DELETE
oder ähnliches, nicht einerm -rf /data/directory
Szenario).Wenn diese Daten wichtig war, STOPPEN Sie IHRE DATENBANK NUN und tun Sie es nicht neu starten. Verwenden
pg_ctl stop -m immediate
so, dass kein checkpoint ist, das beim Herunterfahren ausgeführt wird.Können Sie ein Rollback der Transaktion, sobald es begangen hat. Sie müssen die Daten wiederherstellen aus sicherungen, oder verwenden Sie point-in-time-recovery, die gesetzt werden muss bis vor der Unfall passiert ist.
Wenn Sie nicht haben, PITR /WAL-Archivierung einrichten und keine backups, Sie sind in echten Schwierigkeiten.
Dringenden Klimaschutz
Einmal Ihre Datenbank gestoppt wird, sollten Sie ein file-system-Ebene der gesamten Daten-Verzeichnis, der Ordner enthält
base
,pg_clog
usw. Kopieren alles an eine neue Position. Nicht alles tun, um die Kopie an der neuen Position, es ist Ihre einzige Hoffnung auf die Wiederherstellung Ihrer Daten, wenn Sie nicht über backups. Machen Sie eine weitere Kopie auf einem tragbaren Speicher, wenn Sie können, und ziehen Sie, dass der Speicher aus dem computer. Denken Sie daran, Sie müssen absolut jedes Teil der Daten-Verzeichnis, einschließlichpg_xlog
etc. Kein Teil ist unwichtig.Genau, wie man die Kopie hängt davon ab, welches Betriebssystem Sie verwenden. Wo die Daten dir ist hängt davon ab, welches Betriebssystem Sie verwenden und wie Sie installiert PostgreSQL.
Möglichkeiten, einige Daten könnten überstanden habe
Wenn Sie aufhören, Ihre DB schnell genug, haben Sie vielleicht eine Hoffnung auf Wiederherstellung einige Daten aus den Tabellen. Das ist, weil PostgreSQL verwendet multi-version concurrency control (MVCC) zu verwalten, die den gleichzeitigen Zugriff auf seinen Speicher. Manchmal schreibt er neue Versionen der Zeilen, die Sie ein update auf die Tabelle verlassen, die alten im Ort, aber markiert als "gelöscht". Nach einer Weile autovaccum kommt und markiert die Zeile als freien Speicherplatz, so dass Sie überschrieben werden können durch eine spätere
INSERT
oderUPDATE
. Also, die alten Versionen desUPDATE
d Zeilen vielleicht noch rumliegen, vorhanden, aber unzugänglich.Zusätzlich, Pg schreibt in zwei Phasen. Erste Daten geschrieben, um die write-ahead-log (WAL). Nur einmal es ist geschrieben worden, um die WAL-und hit-disk, es dann kopiert, um die "heap" (die Haupt-Tabellen), ggf. überschreiben von alten Daten, die es gab. Das WAL-Inhalt kopiert wird, um die Haupt-heap durch den
bgwriter
und durch regelmäßige checkpoints. Standardmäßig checkpoints passieren, alle 5 Minuten. Wenn es Ihnen gelingt, beenden Sie die Datenbank, bevor ein checkpoint passiert ist, und beendet es durch schwer-es zu töten, ziehen Sie den Netzstecker der Maschine, oder mitpg_ctl
imimmediate
- Modus, die Sie möglicherweise haben, erfasst die Daten aus, bevor Sie den checkpoint passiert ist, also Ihre alten Daten ist eher noch im heap.Jetzt haben Sie eine komplette file-system-level-Kopie der Daten dir können Sie beginnen, Ihre Datenbank sichern, wenn Sie wirklich müssen; die Daten noch gegangen, aber Sie haben getan, was Sie können, geben sich einige Hoffnung, vielleicht erholt Sie. Angesichts der Wahl, ich würde wahrscheinlich behalten die DB herunterzufahren, nur um sicher zu sein.
Recovery
Können Sie jetzt brauchen, um mieten Sie sich ein Experte in PostgreSQL Innereien zu unterstützen, Sie in einem Daten-recovery-Versuch. Bereit sein zu zahlen, eine professionelle, für Ihre Zeit, möglicherweise viel Zeit.
Ich geschrieben über das auf der Pg-Mailingliste, und Виктор Егоров verbunden depesz Beitrag auf pg_dirtyread, die sieht nur das, was Sie wollen, obwohl es nicht wiederherstellen
TOAST
ed-Daten, so dass es nur sehr bedingt. Probieren Sie es aus, wenn du Glück hast könnte es funktionieren.Finden Sie unter: pg_dirtyread auf GitHub.
Habe ich entfernt, was ich geschrieben habe in diesem Abschnitt, wie es ist, wurde durch das tool.
Siehe auch PostgreSQL row storage fundamentals
Prävention
Siehe mein blog-Eintrag Verhinderung der PostgreSQL-Datenbank Korruption.
Auf eine semi-bedingte Nebenwirkungen-beachten Sie, wenn Sie wurden mit zwei-Phasen-commit Sie konnte
ROLLBACK PREPARED
für eine transction, war bereit für den commit aber nicht voll verpflichtet. Das ist die nächstgelegene Sie bekommen, um ein Rollback einer bereits committed-Transaktion, und nicht auf Ihre situation zutreffen.InformationsquelleAutor der Antwort Craig Ringer