802 votes

Création d'une copie d'une base de données dans PostgreSQL

Quelle est la manière correcte de copier une base de données entière (sa structure et ses données) vers une nouvelle base de données dans pgAdmin ?

1 votes

Poser des questions sur PostgreSQL est sur le sujet et n'entre pas dans la catégorie des "matériels et logiciels informatiques généraux". PostgreSQL n'est pas un logiciel que l'on s'attend à ce qu'un utilisateur moyen utilise, mais c'est un logiciel que les programmeurs utilisent et sur lequel ils ont besoin de pouvoir exécuter des requêtes.

1210voto

Bell Points 5881

Postgres permet d'utiliser toute base de données existante sur le serveur comme modèle lors de la création d'une nouvelle base de données. Je ne suis pas sûr que pgAdmin vous donne cette option dans la boîte de dialogue de création de base de données, mais vous devriez pouvoir exécuter ce qui suit dans une fenêtre de requête si ce n'est pas le cas :

CREATE DATABASE newdb WITH TEMPLATE originaldb OWNER dbuser;

Pourtant, vous pouvez obtenir :

ERROR:  source database "originaldb" is being accessed by other users

Pour déconnecter tous les autres utilisateurs de la base de données, vous pouvez utiliser cette requête :

SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity 
WHERE pg_stat_activity.datname = 'originaldb' AND pid <> pg_backend_pid();

73 votes

Notez qu'originaldb doit être inactif (aucune transaction d'écriture) pour que cela fonctionne.

63 votes

Dans pgAdmin3, dans le volet du navigateur des objets (à gauche), je peux sélectionner Servers -> (mon serveur) -> Databases Cliquez à droite sur Bases de données et sélectionnez "Nouvelle base de données". L'une des options est le modèle, et le SQL utilisé pour créer la base de données est équivalent. Il s'agit de donc beaucoup plus rapide qu'un vidage / restauration sur le même serveur.

0 votes

@Nathan Keller J'ai marqué cette réponse comme étant la bonne car elle a obtenu beaucoup plus de votes positifs, et on m'a demandé de la marquer ainsi. Mais je ne l'ai pas vérifiée car je n'ai pas le temps de le faire.

304voto

zbyszek Points 1181

Une version en ligne de commande de La réponse de Bell :

createdb -O ownername -T originaldb newdb

Cette opération doit être exécutée sous les privilèges du maître de la base de données, généralement postgres.

5 votes

C'est une belle commande MAIS vous obtiendrez createdb: database creation failed: ERROR: source database "conf" is being accessed by other users si vous essayez de le faire sur une base de données de production et que, comme prévu, vous ne voulez pas l'arrêter pour créer une copie.

7 votes

Oui, les mêmes mises en garde s'appliquent à cette commande, ainsi qu'à l'invocation explicite de CREATE DATABASE. Comme le disent les commentaires de la réponse de Bell ci-dessus, la base de données doit être inactive.

113voto

Brugolo Points 89

Pour cloner une base de données existante avec postgres, vous pouvez procéder ainsi

/* KILL ALL EXISTING CONNECTION FROM ORIGINAL DB (sourcedb)*/
SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity 
WHERE pg_stat_activity.datname = 'SOURCE_DB' AND pid <> pg_backend_pid();

/* CLONE DATABASE TO NEW ONE(TARGET_DB) */
CREATE DATABASE TARGET_DB WITH TEMPLATE SOURCE_DB OWNER USER_DB;

IT va tuer toutes les connexions à la base de données source en évitant l'erreur.

ERROR:  source database "SOURCE_DB" is being accessed by other users

7 votes

+1 pour avoir mentionné une solution script pour éviter l'erreur d'accès.

14 votes

Sur Postgres 9.2 je dois remplacer procpid avec pid pour que cela fonctionne

52voto

TrayMan Points 3586

Je ne sais pas pour pgAdmin, mais pgdump vous donne un dump de la base de données en SQL. Il vous suffit de créer une base de données du même nom et de faire

psql mydatabase < my dump

pour restaurer toutes les tables et leurs données ainsi que tous les privilèges d'accès.

0 votes

Merci, j'avais besoin de créer un dump à partir d'un autre serveur, et il semble que cela aide : postgresql.org/docs/8.3/interactive/

19 votes

Vous pouvez même faire pg_dump -U postgres sourcedb | psql -U postgres newdb bien que l'efficacité de cette technique soit discutable (puisque vous finissez probablement par changer de contexte entre les lectures et les écritures).

1 votes

Vous pouvez même obtenir votre vidage à partir d'une machine distante via ssh : ssh dbserver pg_dump DBNAME | psql NEWDB ... ou pg_dump DBNAME | ssh otherserver pgsql NEWDB ... Les permissions et l'authentification doivent bien sûr être gérées comme vous le souhaitez.

21voto

fusion27 Points 440

Copie d'un db "en charge".

J'ai élaboré cette approche à partir des exemples ci-dessus. Je travaille sur un serveur "sous charge" et j'ai obtenu l'erreur lorsque j'ai tenté l'approche de @zbyszek. J'étais également à la recherche d'une solution "ligne de commande uniquement".

createdb: database creation failed: ERROR: source database "exampledb" is being accessed by other users .

Voici ce qui a fonctionné pour moi ( Les commandes précédées de nohup pour déplacer la sortie dans un fichier et protéger d'une déconnexion du serveur ) :

  1. nohup pg_dump exampledb > example-01.sql

  2. createdb -O postgres exampledbclone_01

    mon utilisateur est "postgres".

  3. nohup psql exampledbclone_01 < example-01.sql

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X