2011-06-28 18 views
6

Tengo un requisito en el que necesito tomar una instantánea de una base de datos y restaurarla en la misma máquina con algún otro nombre predefinido en postgres. He intentado lograr la tarea anterior con el siguiente comando.Copiar base de datos en postgres

CREATE DATABASE destniationDb TEMPLATE sourceDb; 

Pero esta opción falla cuando la conexión/sesión a la SourceDB exists.So necesito para truncar esta opción ya que hay alta posibilidad de que el usuario haciendo operación de lectura. Todas las opciones de línea de comando como restore_db, backup_db se adaptan a mis requisitos. Por lo tanto, necesito algún comando/función/procedimiento de consola para lograrlo, es decir, necesito conectarme a la base de datos y llamar a algún comando/función/procedimiento de almacenamiento que logre esto objetivo.

¿Alguno de ustedes puede sugerir algún tipo de solución a mi requerimiento?

Respuesta

11

¿Por qué no basta con crear un volcado de la base de datos existente con el comando sourceDb

pg_dump sourceDb > destinationDb.sql 

Y el volcado SQL en este destinationDb.sql, cambiar el nombre del DB a la nueva en la línea CREATE DATABASE. Después de eso, a continuación, puede crear esta nueva base de datos en el servidor usando psql como:

psql destinationDb < destinationDb.sql 
+0

He intentado esta opción, pero no se ajusta a nuestros requisitos. – Patton

+0

¿por qué? ¿puedes elaborar sobre este caso especial? – nemesisfixx

+0

en realidad no queremos usar ninguna opción de línea de comando de postgres como createdb, dropdb en este caso pg_dump; y la opción que estamos buscando es algo diferente, digamos programática (usando JDBC). La opción mencioné CREATE DATABASE destniationDb TEMPLATE sourceDb; toma menos de 6 segundos para completar la operación. En el caso que ha mencionado, lleva un minuto completar la operación BTW He intentado con la solución que se ofrece aquí http://stackoverflow.com/questions/1237725/how-to- copy-postgres-database-to-another-server – Patton

0

¿Ha intentado locking the table primero?

EDITAR: Pude haber simplificado demasiado. Estaba pensando que si bloquea las escrituras en las tablas que está copiando, la operación podría funcionar. Pero parece que no es el caso cuando se clona todo el DB.

Yendo desde el enlace que proporcionó en su comentario, la base de datos no debe tener sesiones activas. Resuelvo esto simplemente reiniciando el servicio postgres inmediatamente antes de la operación. Si el script es lo suficientemente rápido, su siguiente copia debería ejecutarse antes de que se puedan conectar nuevas sesiones. Creo que Postgres esperará hasta 90 segundos para que finalicen las sesiones, por lo que esta solución no debería ser demasiado perjudicial.

+0

http://www.postgresql.org/docs/9.0/static/manage-ag-templatedbs.html Pase por esto. Dice claramente que cuando una sesión para el la fuente Db está abierta y la operación falla. BTW No intenté bloquear esta tabla. ¿Pueden darme un ejemplo de cómo hacerlo en el escenario actual? – Patton

+0

@Spiff Su solución se ve bien, verificará si esto es factible. – Patton

Cuestiones relacionadas