PostgreSQLデータベースを別のサーバーにコピーする


492

本番PostgreSQLデータベースを開発サーバーにコピーしたいと考えています。これを実行するための最も速く簡単な方法は何ですか?

回答:


668

中間ファイルを作成する必要はありません。できるよ

pg_dump -C -h localhost -U localuser dbname | psql -h remotehost -U remoteuser dbname

または

pg_dump -C -h remotehost -U remoteuser dbname | psql -h localhost -U localuser dbname

使用psqlまたはpg_dumpリモートホストに接続します。

大規模なデータベースまたは低速な接続では、ファイルのダンプと圧縮されたファイルの転送が高速になる場合があります。

Kornelが中間ファイルにダンプする必要はないと言ったように、圧縮して作業したい場合は圧縮トンネルを使用できます

pg_dump -C dbname | bzip2 | ssh  remoteuser@remotehost "bunzip2 | psql dbname"

または

pg_dump -C dbname | ssh -C remoteuser@remotehost "psql dbname"

ただし、このソリューションでは、両端でセッションを取得する必要もあります。

注: pg_dumpはバックアップpsql用であり、復元用です。したがって、この回答の最初のコマンドはローカルからリモートにコピーすることであり、2番目のコマンドはリモートからローカルにコピーすることです。詳細-> https://www.postgresql.org/docs/9.6/app-pgdump.html


28
中間ファイルの必要はありません-圧縮されたSSHトンネルを使用するか、単にパイプすることができます:pg_dump | bzip2 | ssh "bunzip2 | pg_restore"
Kornel

4
bzip2を使用する場合は、ssh圧縮をオフにして転送を高速化してください!
lzap 2012年

8
プロダクションから開発にデータをプルする場合、どのように圧縮して作業できますか?開発から本番までのSSH接続を設定しました。それでssh remoteuser@remotehost "pg_dump -C dbname | bzip2" | bunzip2 | psql dbname
Jeromy French、2013

2
xという名前のリモートデータベースをyという名前のローカルデータベースにコピーできるはずですが、@ Ferranのソリューションはこれでは機能しません... porneLのソリューションはbzip2ファイルをサーバーなので、これは1ステップのプロセスではありません。そのため、データベースyを削除し、xを復元するFerranのソリューションの「または」部分を使用して、データベースの名前をyに変更します。
Darin Peterson

3
これは私がしたことです:(1)pg_dump -C -h remotehost -U remoteuser x | psql -h localhost -U localuser(2)dropdb y(3)psql -U postgres -c 'ALTER DATABASE "x" RENAME TO "y"'
Darin Peterson

131
pg_dump the_db_name > the_backup.sql

次に、バックアップを開発サーバーにコピーし、次のコマンドで復元します。

psql the_new_dev_db < the_backup.sql

3
一部の人はこれが問題になる可能性があると私に言った-トリガーがヒットしたときにダンプまたは復元のいずれかが死ぬ原因となる権限の問題?
ロビンバーンズ

17
@rmbarnes:問題がある場合-修正する必要があります。この「誰か」がしたことの詳細な知識がなければ、誰もこの主張を確認したり却下したりすることはできません。

4
pg_dumpで--no-ownerフラグを使用します。これは問題をスキップし、この投稿の最初の編集で使用されましたが、元のデータベースをより正確に忠実に再現する必要があるかもしれません。
マウント解除

4
私にとって、上記のアプローチは次のように機能しました:pg_dump -C -h host -U username db_name> / any_directory / dump_schema_and_data_file。およびファイルからの復元:psql -h host -U username db_name <dump_schema_and_data_file
Ali Raza Bhayani

それは私に多くの悪化を救いました。Googleドライブを使用してマシン間でファイルを移動しました。新しいマシンにデータベースが既にある(しかし空白)ため、重複キーエラーがたくさん発生しました。ただし、それは開発環境であり、何も害はありませんでした。
Chris Mendla

37

使用pg_dumpは、以降のpsqlまたはpg_restoreの -あなたがのpg_dumpに-Fpまたは-Fcオプションを選択するかどうかによって異なります。

使用例:

ssh production
pg_dump -C -Fp -f dump.sql -U postgres some_database_name
scp dump.sql development:
rm dump.sql
ssh development
psql -U postgres -f dump.sql

22

バージョン間での移行を検討している場合(たとえば、postgresを更新し、9.1をlocalhost:5432で実行し、9.3をlocalhost:5434で実行している場合)、次のコマンドを実行できます。

pg_dumpall -p 5432 -U myuser91 | psql -U myuser94 -d postgres -p 5434

移行ドキュメントを確認してください。


(myuser91 / postgres)-passwordを複数回求められますが、パスワードを1回だけ入力する方法はありますか?
Martin Weber

@MartinWeberこのドキュメントに従ってpgpassファイルを作成しますpostgresql.org/docs/9.4/static/libpq-pgpass.html
Scott Warren

両方に同じポートがある場合はどうなりますか?
ggnoredo

それらが異なるサーバー上にある場合は、-hを使用してホストを指定できます。
Haroldo_OK

16

pg_basebackup 特に大規模なデータベースの場合、これを行うには今より良い方法のようです。

同じまたは古いメジャーバージョンのサーバーからデータベースをコピーできます。あるいはより正確には

pg_basebackup9.1までの同じまたは古いメジャーバージョンのサーバーで動作します。ただし、WALストリーミングモード(-X stream)はサーバーバージョン9.3以降で--format=tarのみ動作し、現在のバージョンのtar形式モード()はサーバーバージョン9.5以降でのみ動作します。

そのためには、ソースサーバーで必要です:

  1. listen_addresses = '*'ターゲットサーバーから接続できるようにします。そのためにポート5432が開いていることを確認してください。
  2. 少なくとも1利用可能な複製接続:max_wal_senders = 1-X fetch2のための-X stream(PostgreSQLの12の場合のデフォルト)、またはそれ以上。
  3. wal_level = replica設定できるようにまたはそれ以上max_wal_senders > 0
  4. host replication postgres DST_IP/32 trustの中でpg_hba.conf。これによりpgDST_IPマシンからのすべてのユーザーにクラスターへのアクセスが許可されます。より安全なオプションを使用することをお勧めします。

変更1、2、3はサーバーの再起動が必要で、変更4はリロードが必要です。

ターゲットサーバー:

# systemctl stop postgresql@VERSION-NAME
postgres$ pg_basebackup -h SRC_IP -U postgres -D VERSION/NAME --progress
# systemctl start postgresql@VERSION-NAME

11
例のように、回答に詳細を記載できますか?
Magnilex 2015

7
ただし、これは両方のマシンのPGバージョンが同じ場合にのみ機能します。
sm 2016

開発と本番で異なるデータベースバージョンを使用する可能性はわずかです。前回、チームメイトの1人がプロダクションで9.5を使用していたときに、PG 9.6で一部のコードが機能しないという問題を提出しようとしたため、不愉快な会話をしました。基本バックアップははるかに高速です。次に、必要に応じてpg_upgradeを使用します。
Zorg、

2
新しいバージョンに移行したいので、PostgreSQLを停止したくない場合があります。
x-yuri 2018年

1
データベースをアップグレードするときはいつでも、本番環境で行う前に、開発およびステージングでデータベースをアップグレードする可能性があります。
アンドリューlorien 2018

8

バックアップするデータベース名を指定してこのコマンドを実行し、DBのダンプを取得します。

 pg_dump -U {user-name} {source_db} -f {dumpfilename.sql}

 eg. pg_dump -U postgres mydbname -f mydbnamedump.sql

次に、このダンプファイルを、DBをコピーするリモートマシンにscpします。

eg. scp mydbnamedump.sql user01@remotemachineip:~/some/folder/

リモートマシンでは、〜/ some / folderで次のコマンドを実行して、DBを復元します。

 psql -U {user-name} -d {desintation_db}-f {dumpfilename.sql}

 eg. psql -U postgres -d mynewdb -f mydbnamedump.sql

7

私はかなり苦労しましたが、最終的にRails 4で動作させるための方法は次のとおりです。

古いサーバー

sudo su - postgres
pg_dump -c --inserts old_db_name > dump.sql

ダンプを作成するには、postgres linuxユーザーを使用する必要がありました。また、新しいサーバーにデータベースを強制的に作成するには、-cを使用する必要がありました。--insertsは、INSERT()構文を使用するように指示します。

次に、新しいサーバーでsimpy:

sudo su - postgres
psql new_database_name < dump.sql

サーバー間でdump.sqlファイルを転送するには、「cat」を使用してコンテンツを印刷するだけでなく、「nano」を使用してコンテンツをコピー貼り付けして再作成しました。

また、2つのデータベースで使用していたROLEは異なっていたため、ダンプ内のすべての所有者名を検索して置換する必要がありました。


6

データベースをダンプします。 pg_dump database_name_name > backup.sql


データベースをインポートして戻します。 psql db_name < backup.sql


5

Linuxシェルスクリプトを共有して、テーブルデータをあるサーバーから別のPostgreSQLサーバーにコピーします。

このブログから引用したリファレンス:

PostgreSQLサーバー間のデータ移行のためのLinux Bash Shell Script:

#!/bin/bash
psql \
    -X \
    -U user_name \
    -h host_name1 \
    -d database_name \
    -c "\\copy tbl_Students to stdout" \
| \
psql \
    -X \
    -U user_name \
    -h host_name2 \
    -d database_name \
    -c "\\copy tbl_Students from stdin"

データを移行しています。宛先/ 2番目のデータベースサーバーに空のテーブルを作成してください。

これはユーティリティスクリプトです。さらに、host_name、database_name、table_nameなどのパラメーターを追加するなど、汎用的な使用のためにスクリプトを変更できます。


5

受け入れられた答えは正しいですが、インタラクティブにパスワードを入力したくない場合は、これを使用できます。

PGPASSWORD={{export_db_password}} pg_dump --create -h {{export_db_host}} -U {{export_db_user}} {{export_db_name}} | PGPASSWORD={{import_db_password}} psql -h {{import_db_host}} -U {{import_db_user}} {{import_db_name}}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.