Ich schreibe ein Shell-Skript (wird zu einem Cronjob), das:
1: Dump meine Produktionsdatenbank
2: Importiere den Dump in meine Entwicklungsdatenbank
Zwischen Schritt 1 und 2 muss ich die Entwicklungsdatenbank löschen (alle Tabellen löschen?). Wie wird dies am besten mit einem Shell-Skript erreicht? Bisher sieht es so aus:
#!/bin/bash
time=`date '+%Y'-'%m'-'%d'`
# 1. export(dump) the current production database
pg_dump -U production_db_name > /backup/dir/backup-${time}.sql
# missing step: drop all tables from development database so it can be re-populated
# 2. load the backup into the development database
psql -U development_db_name < backup/dir/backup-${time}.sql
database
backup
postgresql
Hoff
quelle
quelle
dbname='db_name' && dropdb $dbname && createdb $dbname && psql -d $dbname -f dump.sql
Antworten:
Ich würde einfach die Datenbank löschen und sie dann neu erstellen. Auf einem UNIX- oder Linux-System sollte dies Folgendes tun:
So mache ich es eigentlich.
quelle
createdb --owner=db_owner [--template=template0 --encoding=UTF8] db_name
Ich füge die letzten beiden standardmäßig zu allen Datenbanken hinzuWenn Sie keine Sicherung der Datenbank benötigen, die in einem SQL-Skriptdateiformat im Klartext auf der Festplatte gespeichert ist, können Sie eine Verbindung herstellen
pg_dump
und diesepg_restore
direkt über eine Pipe miteinander verbinden.Zum Löschen und Neuerstellen von Tabellen können Sie die
--clean
Befehlszeilenoption verwendenpg_dump
, um SQL-Befehle zum Bereinigen (Löschen) von Datenbankobjekten vor dem Erstellen (der Befehle zum) Löschen von Datenbankobjekten auszugeben. (Dadurch wird nicht die gesamte Datenbank gelöscht, sondern nur jede Tabelle / Sequenz / Index / etc., Bevor sie neu erstellt werden.)Die beiden oben genannten würden ungefähr so aussehen:
quelle
Obwohl die folgende Zeile aus einem Windows-Batch-Skript stammt, sollte der Befehl ziemlich ähnlich sein:
Dieser Befehl wird verwendet, um die gesamte Datenbank zu löschen, indem sie tatsächlich gelöscht wird. Die
$DATABASE
(in Windows sollte%DATABASE%
) im Befehl ist eine Umgebungsvariable im Windows- Stil, die den Datenbanknamen ergibt. Sie müssen dies durch Ihre ersetzendevelopment_db_name
.quelle
dropdb
undcreatedb
Befehle verwenden? Wenn Sie psql ausführen können, können Sie diese auch ausführen.So entsorgen Sie:
Etwas wiederherstellen:
quelle
Wenn Sie Ihre Datenbank mit dem Namen "example_db" bereinigen möchten:
1) Melden Sie sich bei einer anderen Datenbank an (zum Beispiel 'postgres'):
2) Entfernen Sie Ihre Datenbank:
3) Erstellen Sie Ihre Datenbank neu:
quelle
Ich habe verwendet:
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