Teilweises Db-Dump / Wiederherstellen

8

Ein Teil meiner Datenbank (PostgreSQL 9.3) basiert auf zusätzlichen Tabellen (z. B. County, City, Town, ...). Ich verwalte diese Tabellen nicht, sie werden regelmäßig von Dritten aktualisiert. Jedes Mal, wenn ich einen neuen vollständigen Speicherauszug erhalte, fällt es mir schwer, die Änderungen wieder in meine Datenbank zu übertragen.

Ich habe mit pg_dump / restore gespielt und bin auf einige Einschränkungen gestoßen duplicate key value violates unique constraintoder cannot drop constraint ... because other objects depend on itsogar mit --disable-triggersoder --cleanoption.

Gibt es eine Option, die ich verpasst habe? Ich habe festgestellt, dass es einige Möglichkeiten gibt, Einschränkungen ein- und auszuschalten, aber ich habe keine Ahnung, ob dies der gute Weg ist, dies zu lösen, oder nur ein schmutziger Hack? (Ich bin kein DBA-Experte.) Um ehrlich zu sein, bin ich ziemlich überrascht, dass es keinen einfachen Weg gibt, dies zu erreichen. Vielleicht habe ich es verpasst! Ich dachte naiv, ich könnte pg_restore als große Transaktion ausführen und Einschränkungen am Ende des Skripts überprüfen. Ist es möglich?

ablm
quelle

Antworten:

2

Eine UNIQUEEinschränkung ist kein Auslöser. Es wird über einen eindeutigen Index implementiert . Es kann also nicht mit ausgeschaltet werden --disable-triggers.

"Andere Objekte", die von einer eindeutigen Einschränkung abhängen, sind normalerweise Fremdschlüsseleinschränkungen. Diese können nicht ohne eine eindeutige (oder Primärschlüssel-) Einschränkung für die referenzierten Spalten existieren. Um die Wiederherstellung zu aktivieren, können Sie alle diese fk-Einschränkungen zusammen mit der eindeutigen Einschränkung entfernen.

Um die referenzielle Integrität wiederherzustellen, müssten Sie dann natürlich verletzende Duplikate beseitigen und alle entfernten Einschränkungen neu erstellen. Wenn Sie es sich nicht leisten können, auch nur vorübergehend einen inkonsistenten Status zu haben, tun Sie dies alles in einer einzigen (automatisch blockierenden) Transaktion.

Wenn Sie sich keine exklusiven Sperren für betroffene Tabellen leisten können, besteht Ihre einzige verbleibende Option darin, zuerst Ihre Daten zu reparieren. Dies ist wahrscheinlich die beste Vorgehensweise . Sie können Ihre Daten in temporäre Tabellen importieren COPY, Duplikate entfernen und dann INSERTin die Zieltabellen.

Wenn Sie andererseits auf fehlende Werte für Fremdschlüssel NOT VALIDstoßen , können Sie mit fk-Einschränkungen improvisieren :

Ihr Problem sollte niemals auftreten. Wenn Sie tatsächlich eine EINZIGARTIGE Einschränkung haben, können Sie keine doppelten Werte in Ihrer Quellendatenbank haben - es sei denn, diese ist ernsthaft fehlerhaft. Wenn dies der Fall ist, korrigieren Sie zuerst Ihre Quelldatenbank ...

Erwin Brandstetter
quelle
3

Wie wäre es mit dem Versuch, dieses Problem mit Point-In-Time-Recovery zu lösen? Ein Dump hat das Problem, dass Sie sowieso einen alten Datensatz haben. Ich empfehle dringend, eine Sicherungsmethode zu verwenden, mit der Sie eine aktuellere Version der Daten erhalten.

Sie können sich auch einen einfachen Änderungsprotokoll-Trigger schreiben, in dem alle geänderten Informationen in einer einfachen Tabelle gespeichert werden. So funktioniert es: http://www.cybertec.at/tracking-changes-in-postgresql/ Der Code auf der Website sollte Ihnen einen groben Prototyp geben und Ihnen helfen, Probleme zu beheben.

Hans-Jürgen Schönig
quelle
Interessant, danke für die Info. Leider habe ich keine Kontrolle darüber, wie der Teilspeicherauszug generiert wird. Ich werde meine Frage bearbeiten, um diesbezüglich klarer zu machen.
Ablm