2010-01-13 4 views
78

J'écris un script shell (deviendra une tâche cron) qui:Postgres: base de données entière claire avant de recréer/repeupler à partir du script bash

1: vider ma base de données de production

2 : importer le vidage dans ma base de données de développement

Entre les étapes 1 et 2, j'ai besoin d'effacer la base de données de développement (supprimer tous les tableaux?). Comment cela est-il le mieux accompli à partir d'un script shell? Jusqu'à présent, il ressemble à ceci:

#!/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 pour les gens pressés: 'dbname = 'nom_base' && dropdb $ dbname && createdb $ dbname && psql -d $ dbname -f dump.sql' – ruuter

+0

ce oneliner vous oblige à avoir des autorisations pour créer/déposer la base de données. l'approche que l'auteur essaie ne nécessite pas de privilèges spéciaux. – ribamar

Répondre

120

Je supprimerais simplement la base de données, puis la recréerais. Sur un système UNIX ou Linux, qui devrait le faire:

$ dropdb development_db_name 
$ createdb developmnent_db_name 

Voilà comment je le fais, en fait.

+0

C'est comme ça que je le fais aussi. Ensuite, restaurez simplement dans le db nouvellement créé. –

+3

oui. C'est mieux car il peut y avoir des objets qui ne font pas partie de la décharge que vous restaurez. dans ce cas, ils seront définitivement tués. – pstanton

+0

Merci, venant d'un arrière-plan avec l'expérience de MySQL, je n'arrête pas d'oublier les outils de ligne de commande de PostGres. – David

9

Bien que la ligne suivante est tirée d'une fenêtre script batch, la commande doit être assez similaire:

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

Cette commande permet d'effacer toute la base , en le laissant tomber. Le $DATABASE (dans Windows doit être %DATABASE%) dans la commande est une variable d'environnement de style Windows qui évalue le nom de la base de données. Vous devrez le remplacer par votre development_db_name.

+3

Variables de style Windows ... – zxq9

+0

alors pourquoi ne pas utiliser les commandes 'dropdb' et' createdb' déjà disponibles? Si vous pouvez lancer psql, vous pouvez également les exécuter. –

77

Si vous n'avez pas réellement besoin d'une sauvegarde de la base de données sauvegardée sur le disque dans un format de fichier de script .sql en texte brut, vous pouvez connecter pg_dump et pg_restore directement ensemble sur un canal. Pour abandonner et recréer des tables, vous pouvez utiliser l'option de ligne de commande --clean pour pg_dump afin d'émettre des commandes SQL pour nettoyer (supprimer) les objets de base de données avant (les commandes pour) les créer. (Cela ne baissera pas la base de données entière, juste chaque table/séquence/index/etc avant de les recréer..)

Les deux ci-dessus ressemblerait à quelque chose comme ceci:

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

J'aime cette solution, puisque je veux une copie de sauvegarde, je suis en train de faire ceci: pg_dump -Ft -U production_db_name> /backup/dir/backup-${time}.tar pg_restore -U development_db_name -d nom_développement -O --clean /backup/dir/backup-${time}.tar fonctionne comme un charme, merci pour votre aide! – Hoff

+26

Attention: l'option --clean ne supprime que les relations trouvées dans le fichier de restauration. Cela signifie que si vous ajoutez une table à tester, alors vous voulez la supprimer (pour la synchroniser avec la base de données de production par exemple), elle ne sera * pas * supprimée. –

+5

Il est important de garder à l'esprit que l'option * - clean * de pg_dump fonctionne uniquement avec les sauvegardes en texte brut. Comme la documentation l'indique clairement ici http://www.postgresql.org/docs/9.4/static/app-pgdump.html, vous devez utiliser --clean sur pg_restore pour les sauvegardes archivées. –

4

Je l'ai utilisé:

pg_restore -c -d database_name filename.dump 
1

Pour vider:

pg_dump -Fc mydb > db.dump 

Pour restaurer:

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