2011-06-28 5 views
6

J'ai une exigence dans laquelle j'ai besoin de prendre un instantané d'une base de données et de le restaurer dans la même machine avec un autre nom prédéfini dans postgres. J'ai essayé d'accomplir la tâche ci-dessus avec la commande suivante.Copier la base de données dans postgres

CREATE DATABASE destniationDb TEMPLATE sourceDb; 

Mais cette option échoue lorsque la connexion/session à l'sourcedb exists.So je dois tronquer cette option car il est fort possible de l'utilisateur de faire une opération de lecture. Toutes les options de ligne de commande comme restore_db, backup_db répondent à mes besoins. Par conséquent, j'ai besoin d'une commande de console/fonction/store pour l'obtenir, je dois me connecter à la base de données et appeler la commande/function/store objectif. Est-ce que quelqu'un parmi vous peut proposer une solution à mes besoins?

Répondre

11

Pourquoi créez-vous pas seulement une décharge de la base de données existante sourceDb en utilisant la commande

pg_dump sourceDb > destinationDb.sql 

Et dans ce dump SQL destinationDb.sql, changer le nom de db à nouveau dans la ligne CREATE DATABASE. Après cela, vous pouvez créer ce nouveau DB sur le serveur en utilisant psql comme:

psql destinationDb < destinationDb.sql 
+0

J'ai essayé cette option mais elle ne correspond pas à nos besoins. – Patton

+0

pourquoi? Pouvez-vous élaborer sur ce cas particulier? – nemesisfixx

+0

en fait nous ne voulons pas utiliser d'options de ligne de commande postgres comme createdb, dropdb dans ce cas pg_dump, et l'option que nous recherchons est quelque chose de différent, disons programmatique (en utilisant JDBC). L'option que j'ai mentionnée CREATE DATABASE destniationDb TEMPLATE sourceDb; prend moins de 6 secondes pour terminer l'opération.Au cas où vous avez mentionné il faut un min pour terminer l'opération BTW J'ai essayé la solution donnée ici http://stackoverflow.com/questions/1237725/how-to- copie-postgres-base de données-à-un-autre-serveur – Patton

0

Avez-vous essayé locking the table d'abord?

EDIT: J'ai peut-être trop simplifié. Je pensais que si vous verrouillez les écritures sur les tables que vous copiez, l'opération pourrait fonctionner. Mais il semble que ce n'est pas le cas lors du clonage de toute la DB.

En partant du lien fourni dans votre commentaire, la base de données ne doit pas avoir de sessions actives. Je résous cela en redémarrant simplement le service postgres immédiatement avant l'opération. Si le script est suffisamment rapide, votre copie suivante doit être exécutée avant que les nouvelles sessions puissent se connecter. Je crois que postgres attendra jusqu'à 90 secondes pour que les sessions se terminent, donc cette solution ne devrait pas être trop dérangeante.

+0

http://www.postgresql.org/docs/9.0/static/manage-ag-templatedbs.html S'il vous plaît passer par cela.Il dit clairement que quand une session pour le La source Db est ouverte, puis l'opération échoue. BTW Je n'ai pas essayé ce verrouillage de la table pouvez-vous s'il vous plaît donner un exemple sur la façon de le faire dans le scénario actuel? – Patton

+0

@Spiff Votre solution semble bien vérifier si c'est faisable. – Patton

Questions connexes