Comment dupliquer la base de données en postgresql?

17

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
Karunya Suresh
la source

Réponses:

33

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 de la coquille

createdb -T my_old_database my_new_database;

Sinon, vous devrez utiliser pg_dump, createdbet pg_restore, par exemple

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

Si vous utilisez nohupafin que la commande ne meure pas si vous perdez votre session ssh, pensez à utiliser à la screenplace.

Craig Ringer
la source
1
AwesomeCREATE DATABASE my_new_database TEMPLATE my_old_database;
anjaneyulubatta505
1
Brillant! Il ne s'agit pas seulement de copier la structure, mais aussi les données!
Foton
@Foton Oui, bien que vous puissiez utiliser pg_dumpet pg_restoresi vous voulez être plus sélectif et vider (par exemple) juste la structure.
Craig Ringer
0

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