我想复制一个生产PostgreSQL数据库到一个开发服务器。最快最简单的方法是什么?


当前回答

接受的答案是正确的,但如果你想避免交互式输入密码,你可以使用这个:

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}}

其他回答

先使用pg_dump,然后再使用psql或pg_restore——这取决于您是选择- fp选项还是- fc选项来使用pg_dump。

用法示例:

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
pg_dump the_db_name > the_backup.sql

然后将备份复制到您的开发服务器,使用以下方法进行恢复:

psql the_new_dev_db < the_backup.sql

如果您更喜欢使用GUI,您可以使用pgAdmin软件。

连接到源服务器和目标服务器 右键单击源db > backup 右键单击目标服务器>创建>数据库。使用与源db相同的属性(通过右键单击> properties可以看到源db的属性) 右键单击创建的db >恢复。

Pg_basebackup现在似乎是更好的方式,特别是对于大型数据库。

可以从具有相同或较旧主版本的服务器复制数据库。或者更准确地说:

Pg_basebackup适用于相同或更老版本(低至9.1)的服务器。但WAL流模式(-X stream)仅适用于9.3及以后的服务器版本,当前版本的tar格式模式(——format=tar)仅适用于9.5及以后的服务器版本。

对于源服务器,您需要:

listen_addresses = '*' to be able to connect from the target server. Make sure port 5432 is open for that matter. At least 1 available replication connection: max_wal_senders = 1 (-X fetch), 2 for -X stream (the default in case of PostgreSQL 12), or more. wal_level = replica or higher to be able to set max_wal_senders > 0. host replication postgres DST_IP/32 trust in pg_hba.conf. This grants access to the pg cluster to anyone from the DST_IP machine. You might want to resort to a more secure option.

更改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

以数据库名称运行此命令,如果要备份,则转储数据库。

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

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

现在将这个转储文件scp到您想要复制DB的远程机器。

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

在远程机器上,在~/some/文件夹中运行以下命令来恢复DB。

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

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