web-dev-qa-db-fra.com

Comment dupliquer la base de données en postgresql?

J'ai besoin de dupliquer la base de données existante, y compris son schéma et sa structure, vers une autre nouvelle base de données. J'ai besoin de cela dans l'environnement de commande Shell et non dans pgadmin. Merci de bien vouloir m'aider.

Nohup pg_dump exampledb > example-01.sql
createdb -O postgres exampledbclone_01

mon utilisateur est "postgres"

Nohup psql exampledbclone_01 < example-01.sql
$ pg_dump mydb > db.sql
$ psql -d newdb -f db.sql
19
Karunya Suresh

Si vous souhaitez le dupliquer dans la même installation PostgreSQL et que vous n'avez pas d'utilisateurs connectés activement, il existe un raccourci pratique:

CREATE DATABASE my_new_database TEMPLATE my_old_database;

ou depuis le Shell

createdb -T my_old_database my_new_database;

Sinon, vous devrez utiliser pg_dump, createdb et pg_restore, par exemple.

pg_dump -Fc -f olddb.pgdump -d olddb &&\
createdb newdb &&\
pg_restore -d newdb olddb.pgdump

Si vous utilisez Nohup pour que la commande ne meure pas si vous perdez votre session ssh, pensez plutôt à utiliser screen.

41
Craig Ringer

Postgres permet d'utiliser n'importe quelle 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 sais pas si pgAdmin vous donne l'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:

ERREUR: la base de données source "originaldb" est en cours d'accès par d'autres utilisateurs

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();
3
user200679