postgresqlでデータベースを複製する方法は?


16

スキーマと構造を含む既存のデータベースを別の新しいデータベースに複製する必要があります。これはpgadminではなくシェルコマンド環境で必要です。親切に私を助けてください。

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

私のユーザーは「postgres」です

nohup psql exampledbclone_01 < example-01.sql
$ pg_dump mydb > db.sql
$ psql -d newdb -f db.sql

回答:


32

同じPostgreSQLインストール内でそれを複製したいが、アクティブに接続しているユーザーがいない場合、便利なショートカットがあります:

CREATE DATABASE my_new_database TEMPLATE my_old_database;

またはシェルから

createdb -T my_old_database my_new_database;

そうしないと、使用する必要がありますpg_dumpcreatedbそしてpg_restore、例えば

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

使用している場合 nohupている場合、sshセッションを失ってもコマンドは終了しませんscreen。代わりに使用することを検討してください。


素晴らしいCREATE DATABASE my_new_database TEMPLATE my_old_database;
-anjaneyulubatta505

鮮やかさ!構造だけでなく、データもコピーします!
福田

@Foton Yep、使用できますがpg_dumppg_restoreより選択的にしたい場合は(たとえば)構造だけをダンプします。
クレイグリンガー

0

Postgresでは、新しいデータベースを作成するときに、サーバー上の既存のデータベースをテンプレートとして使用できます。pgAdminがデータベースの作成ダイアログでオプションを提供するかどうかはわかりませんが、そうでない場合はクエリウィンドウで次を実行できるはずです。

CREATE DATABASE newdb WITH TEMPLATE originaldb OWNER dbuser;

それでも、あなたは得るかもしれません:

エラー:他のユーザーがソースデータベース "originaldb"にアクセスしています

データベースから他のすべてのユーザーを切断するには、次のクエリを使用できます。

SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity 
WHERE pg_stat_activity.datname = 'originaldb' AND pid <> pg_backend_pid();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.