2010-01-13 3 views
78

ich einen Shell-Skript zu schreiben (ein cronjob werden), die wird:Postgres: klare gesamte Datenbank vor dem erneuten Anlegen/Wiederbevölkern von Bash-Skript

1: dump meiner Produktionsdatenbank

2 : Importieren Sie das Abbild 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 wie folgt 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 
+2

oneliner für Menschen in Eile: 'dbname = 'db_name' && dropdb $ dbname && createdb $ dbname && psql -d $ dbname -f dump.sql' – ruuter

+0

diese oneliner Sie Berechtigungen haben erfordert/Drop zu erstellen die Datenbank. Der Ansatz, den der Autor versucht, erfordert keine besonderen Berechtigungen. – ribamar

Antwort

120

Ich würde nur die Datenbank löschen und dann neu erstellen. Auf einem UNIX oder Linux-System, das sollte es tun:

$ dropdb development_db_name 
$ createdb developmnent_db_name 

Das ist, wie ich es tun, eigentlich.

+0

So mache ich es auch. Dann einfach in die neu erstellte Datenbank wiederherstellen. –

+3

ja. Dies ist besser, da möglicherweise Objekte vorhanden sind, die nicht Teil des Dumps sind, den Sie wiederherstellen. In diesem Fall werden sie definitiv getötet. – pstanton

+0

Dank der Erfahrung mit MySQL habe ich immer wieder die Kommandozeilen-Tools von PostGres vergessen. – David

9

Obwohl die folgende Zeile aus einem Windows-Batch-Skript genommen wird, soll der Befehl sehr ähnlich sein:

psql -U username -h localhost -d postgres -c "DROP DATABASE \"$DATABASE\";" 

Mit diesem Befehl wird die gesamte Datenbank löschen , indem Sie es tatsächlich fallen lassen. Die $DATABASE (in Windows sollte %DATABASE% sein) in dem Befehl ist eine Windows-Umgebungsvariable, die den Datenbank-Namen auswertet. Sie müssen das durch Ihre development_db_name ersetzen.

+3

Windows-style-Variablen ... – zxq9

+0

Warum dann nicht die bereits verfügbaren Befehle 'dropdb' und' createdb' verwenden? Wenn Sie psql ausführen können, können Sie diese auch ausführen. –

77

Wenn Sie nicht wirklich eine Sicherung der Datenbank benötigen, die in einem SQL-Skriptdateiformat im Klartextformat auf die Festplatte ausgegeben wird, können Sie und pg_restore direkt über eine Pipe verbinden.

Um Tabellen zu löschen und neu zu erstellen, könnten Sie die --clean Befehlszeilenoption für pg_dump verwenden, um SQL-Befehle zum Löschen (Löschen) von Datenbankobjekten vor den Befehlen zum Erstellen auszugeben. (Dies wird die gesamte Datenbank nicht fallen, nur jede Tabelle/Sequenz/index/etc, bevor sie neu zu erstellen..)

Die beiden oben genannten etwas würde wie folgt aussehen:

pg_dump -U username --clean | pg_restore -U username 
+1

ich mag diese Lösung, da ich eine Sicherungskopie möchte, mache ich jetzt das: pg_dump -Ft -U production_db_name> /backup/dir/backup-${time}.tar pg_restore -U entwicklung_db_name -d entwicklung_db_name -O-clean /backup/dir/backup-${time}.tar funktioniert wie ein Zauber, danke für Ihre Hilfe! – Hoff

+26

Vorsicht: Die Option --clean entfernt nur die in der Wiederherstellungsdatei gefundenen Beziehungen. Wenn Sie also eine Tabelle zum Testen hinzufügen und diese dann entfernen möchten (um sie beispielsweise mit der Produktionsdatenbank zu synchronisieren), wird sie * nicht * entfernt. –

+5

Es ist wichtig zu beachten, dass die Option pg_dump * - clean * nur mit reinen Text-Backups funktioniert. Wie die Dokumentation hier eindeutig angibt, müssen Sie --clean on pg_restore für archivierte Backups verwenden. –

4

ich verwendet habe:

pg_restore -c -d database_name filename.dump 
1

dump:

pg_dump -Fc mydb > db.dump 

wieder her:

pg_restore --verbose --clean --no-acl --no-owner -h localhost -U myuser -d my_db db/latest.dump 
Verwandte Themen