Ich habe einen neuen Datenbankspeicherauszug von einem Produktionsserver mit den Flags --data-only
und erstellt --column-inserts
, sodass ich nur eine Reihe von Einfügeanweisungen zum Einfügen von Daten habe, wenn eine Wiederherstellung auf einem Staging-Server durchgeführt wird.
pg_dump -h localhost -U adminuser --data-only --column-inserts maindb > maindb.sql
Wie lösche ich zuerst alle Daten in der Staging-Server-Datenbank, bevor ich die Daten aus dem Produktionsspeicherauszug wiederherstelle?
Ich möchte nur alle Daten löschen, damit ich die Datenbank und all das Zeug nicht löschen und erstellen muss. Ich möchte nur Daten entfernen und neue Daten einfügen, das ist alles.
Ich habe aus mehreren Gründen nicht die Möglichkeit, die Datenbank zu löschen und zu erstellen. Ich muss alle Daten entfernen und nur einfügen. Was auch immer nötig ist, um herauszufinden, wie das geht, ich bin bereit, es zu versuchen, brauche aber natürlich zunächst Hilfe.
Ich muss diesen Prozess auch automatisieren. Automatisiert das "Speichern von Daten aus der Produktionsdatenbank", das "Löschen von Daten in der Staging-Datenbank" und das "Wiederherstellen von Daten in der Staging-Datenbank". Ich brauche nur Hilfe beim Teil "Löschen von Daten beim Staging von db".
Ich verwende PostgreSQL 9.5.2
quelle
TRUNCATE table1, table2, ... <list of all tables>;
? machen beide dasselbe?pg_restore hat ein --clean-Flag (oder möglicherweise --create), das Daten automatisch löscht, bevor Operationen ausgeführt werden.
Die ausgezeichnete Dokumentation sollte Ihnen sehr helfen ...
Nur zur Klarstellung, falls es verwirrend ist:
Dadurch wird die eigentliche Datenbank nicht gelöscht. Nur die Tabellen / Ansichten / etc.
Wenn das Löschen und Neuerstellen der Tabellen aus irgendeinem Grund nicht akzeptabel ist, müssen Sie mehr Arbeit aufwenden, um manuell ein Skript zu erstellen, das einen
data only
Speicherauszug aus der Quelldatenbank, ProblemenTRUNCATE
oderDELETE
in der Zieldatenbank erstellt Lädt den Datendump. Soweit mir bekannt ist, gibt es dafür keinen schnellen und raffinierten Weg.quelle
Die obige Abfrage generiert abgeschnittene Abfragen für alle Tabellen in der Datenbank.
quelle
Hinweis: In meiner Antwort geht es darum, die Tabellen und andere Datenbankobjekte wirklich zu löschen. Zum Löschen aller Daten in den Tabellen, dh zum Abschneiden aller Tabellen , hat Endre Both einen Monat später eine ähnlich gut ausgeführte Anweisung (direkte Ausführung) bereitgestellt.
Für die Fälle , in denen Sie nicht können
DROP SCHEMA public CASCADE;
,DROP OWNED BY current_user;
oder etwas, hier ist ein Stand-alone - SQL - Skript schrieb ich, die transaktionssicher ist (dh Sie es zwischen setzen könnenBEGIN;
und entwederROLLBACK;
nur testen Sie es aus oderCOMMIT;
tatsächlich zu tun , die Tat) und Bereinigt "alle" Datenbankobjekte ... nun, alle, die in der Datenbank verwendet werden, die unsere Anwendung verwendet, oder ich könnte vernünftigerweise hinzufügen, nämlich:CHECK
,UNIQUE
)VIEW
s (normal oder materialisiert)public
oder DB-internen) Schemata, die „wir“ besitzen: Das Skript ist nützlich, wenn es als „kein Datenbank-Superuser“ ausgeführt wird. Ein Superuser kann alle Schemata löschen (die wirklich wichtigen sind jedoch immer noch ausdrücklich ausgeschlossen).Nicht fallen gelassen werden (einige absichtlich; einige nur, weil ich kein Beispiel in unserer DB hatte):
public
Schema (z. B. für von Erweiterungen bereitgestellte Inhalte)Dies ist sehr nützlich für Fälle, in denen der Dump, den Sie wiederherstellen möchten, eine andere Datenbankschemaversion aufweist (z. B. mit Debian
dbconfig-common
, Flyway oder Liquibase / DB-Manul) als die Datenbank, in der Sie ihn wiederherstellen möchten.Ich habe auch eine Version, die "alles außer zwei Tabellen und was dazu gehört" löscht (eine Sequenz, manuell getestet, sorry, ich weiß, langweilig), falls jemand interessiert ist; Der Unterschied ist klein. Kontaktieren Sie mich oder überprüfen Sie dieses Repo bei Interesse.
SQL
Getestet, mit Ausnahme späterer Ergänzungen (
extensions
beigesteuert von Clément Prévost ), auf PostgreSQL 9.6 (jessie-backports
). Die Aggregatentfernung wurde unter 9.6 und 12.2 getestet, die Verfahrensentfernung ebenfalls unter 12.2. Bugfixes und weitere Verbesserungen sind willkommen!quelle