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 ?
Notez qu'originaldb doit être inactif (aucune transaction d'écriture) pour que cela fonctionne.
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 ?
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();
Notez qu'originaldb doit être inactif (aucune transaction d'écriture) pour que cela fonctionne.
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.
@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.
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.
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.
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
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/
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).
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 ) :
nohup pg_dump exampledb > example-01.sql
createdb -O postgres exampledbclone_01
mon utilisateur est "postgres".
nohup psql exampledbclone_01 < example-01.sql
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.
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.