J'écris un script shell (qui deviendra un cronjob) qui:
1: vider ma base de données de production
2: importer le dump dans ma base de données de développement
Entre les étapes 1 et 2, je dois effacer la base de données de développement (supprimer toutes les tables?). Comment cela est-il le mieux réalisé à partir d'un script shell? Jusqu'à présent, cela 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
dbname='db_name' && dropdb $dbname && createdb $dbname && psql -d $dbname -f dump.sql
Réponses:
Je déposerais simplement la base de données, puis la recréerais. Sur un système UNIX ou Linux, cela devrait le faire:
C'est comme ça que je fais, en fait.
la source
createdb --owner=db_owner [--template=template0 --encoding=UTF8] db_name
j'ajoute les deux derniers par défaut à toutes les bases de donnéesSi 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 script .sql en texte brut, vous pouvez vous connecter
pg_dump
etpg_restore
directement ensemble via un tube.Pour supprimer et recréer des tables, vous pouvez utiliser l'
--clean
option de ligne de commande pourpg_dump
émettre des commandes SQL pour nettoyer (supprimer) les objets de base de données avant (les commandes pour) les créer. (Cela ne supprimera pas toute la base de données, juste chaque table / séquence / index / etc. Avant de les recréer.)Les deux ci-dessus ressembleraient à ceci:
la source
Bien que la ligne suivante soit tirée d'un script de commandes Windows, la commande devrait être assez similaire:
Cette commande est utilisée pour effacer toute la base de données, en la supprimant. Le
$DATABASE
(dans Windows devrait être%DATABASE%
) dans la commande est une variable d'environnement de style Windows qui correspond au nom de la base de données. Vous devrez remplacer cela par votredevelopment_db_name
.la source
dropdb
et déjà disponiblescreatedb
? Si vous pouvez exécuter psql, vous pouvez également les exécuter.Jeter:
Restaurer:
la source
Si vous souhaitez nettoyer votre base de données nommée "example_db":
1) Connectez-vous à une autre base de données (par exemple 'postgres'):
2) Supprimez votre base de données:
3) Recréez votre base de données:
la source
J'ai utilisé:
la source
Remarque: ma réponse concerne vraiment la suppression des tables et autres objets de la base de données; pour la suppression de toutes les données dans les tableaux, à savoir tronquer toutes les tables , Endre deux a fourni une déclaration (exécution directe) Similairement bien exécuté un mois plus tard.
Pour les cas où vous ne pouvez pas simplement
DROP SCHEMA public CASCADE;
,DROP OWNED BY current_user;
ou quelque chose du genre, voici un script SQL autonome que j'ai écrit, qui est sûr pour les transactions (c'est-à-dire que vous pouvez le placer entreBEGIN;
et soitROLLBACK;
pour simplement le tester, soitCOMMIT;
pour faire l'acte) et nettoie «tous» les objets de la base de données ... eh bien, tous ceux utilisés dans la base de données que notre application utilise ou je pourrais raisonnablement ajouter, ce qui est:CHECK
,UNIQUE
)VIEW
s (normal ou matérialisé)public
ou internes à la base de données) «nous» possédons: le script est utile lorsqu'il est exécuté en tant que «pas un superutilisateur de base de données»; un superutilisateur peut supprimer tous les schémas (cependant, les plus importants sont toujours explicitement exclus)Non abandonné sont (certains délibérés; certains uniquement parce que je n'avais aucun exemple dans notre base de données):
public
schéma (par exemple pour les éléments fournis par l'extension)Ceci est vraiment utile dans les cas où le vidage que vous voulez restaurer est d'une version de schéma de base de données différente (par exemple avec Debian
dbconfig-common
, Flyway ou Liquibase / DB-Manul) que la base de données dans laquelle vous voulez le restaurer.J'ai aussi une version qui supprime «tout sauf deux tables et ce qui leur appartient» (une séquence, testée manuellement, désolé, je sais, ennuyeuse) au cas où quelqu'un serait intéressé; le diff est petit. Contactez-moi ou consultez ce repo si vous êtes intéressé.
SQL
Testé, sauf ajouts ultérieurs (
extensions
apportés par Clément Prévost ), sur PostgreSQL 9.6 (jessie-backports
). Élimination des agrégats testée sur 9.6 et 12.2, élimination de procédure testée également sur 12.2. Corrections de bugs et autres améliorations bienvenues!la source