2010-01-13 10 views
78

Estoy escribiendo un script de shell (se convertirá en una tarea programada) que:Postgres: clara base de datos completa antes de volver a crear/repoblar de escritura del golpe

1: volcar mi base de datos de producción

2 : importar el volcado a mi base de datos de desarrollo

Entre los pasos 1 y 2, necesito borrar la base de datos de desarrollo (soltar todas las tablas?). ¿Cómo se logra esto mejor a partir de un script de shell? Hasta el momento, parece que esto:

#!/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 para gente con prisa: 'dbname = 'nombre_base_de_datos' && && dropdb $ nombredb createdb $ && nombredb psql -d $ nombredb -f dump.sql' – ruuter

+0

este oneliner requiere que tenga permisos para crear/gota la base de datos. el enfoque que intenta el autor no requiere privilegios especiales. – ribamar

Respuesta

120

Me gustaría simplemente soltar la base de datos y luego volver a crearlo. En un sistema UNIX o Linux, eso debería hacerlo:

$ dropdb development_db_name 
$ createdb developmnent_db_name 

Así es como lo hago, en realidad.

+0

Así es como lo hago también. Luego simplemente restaure en el db recién creado. –

+3

sí. esto es mejor porque puede haber objetos que no son parte del volcado que está restaurando. en este caso definitivamente serán asesinados. – pstanton

+0

Gracias, viniendo de un fondo con experiencia en MySQL, sigo olvidando las herramientas de línea de comandos de PostGres. – David

9

Aunque la siguiente línea se toma de un archivo por lotes de Windows, el comando debe ser bastante similar:

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

Este comando se utiliza para borrar toda la base de datos , al dejarlo caer. El $DATABASE (en Windows debe ser %DATABASE%) en el comando es una variable de entorno de estilo de Windows que evalúa el nombre de la base de datos. Tendrá que sustituirlo por su development_db_name.

+3

Variables de estilo de Windows ... – zxq9

+0

¿por qué no utilizar los comandos 'dropdb' y' createdb' ya disponibles? Si puede ejecutar psql, puede ejecutarlos también. –

77

Si realmente no necesita una copia de seguridad de la base de datos volcada en el disco en un formato de archivo de script .sql de texto plano, puede conectar pg_dump y pg_restore directamente a través de una tubería.

Para descartar y volver a crear tablas, puede usar la opción de línea de comando --clean para pg_dump para emitir comandos SQL para limpiar (soltar) objetos de base de datos antes de (los comandos para) crearlos. (Esto no caerá toda la base de datos, simplemente cada mesa/secuencia/index/etc antes de volver a crearlos..)

los dos anteriores sería algo como esto:

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

me gusta esta solución, ya que quiero una copia de seguridad, ahora estoy haciendo esto: pg_dump -Ft -U production_db_name> /backup/dir/backup-${time}.tar pg_restore -U nombre_de_desarrollo -d nombre_de_desarrollo_desarrollo -O --clean /backup/dir/backup-${time}.tar funciona como un amuleto, ¡gracias por tu ayuda! – Hoff

+26

Cuidado: la opción --clean solo elimina aquellas relaciones encontradas en el archivo de restauración. Esto significa que si agrega una tabla para probarla y luego desea eliminarla (para sincronizarla con la base de datos de producción, por ejemplo), * no * se eliminará. –

+5

Es importante tener en cuenta que la opción * - clean * de pg_dump solo funciona con copias de seguridad de texto sin formato. Como la documentación indica claramente aquí http://www.postgresql.org/docs/9.4/static/app-pgdump.html, debe usar --clean en pg_restore para copias de seguridad archivadas. –

4

he utilizado:

pg_restore -c -d database_name filename.dump 
1

Para volcar:

pg_dump -Fc mydb > db.dump 

Para restaurar:

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