提问



我正在寻找将生产PostgreSQL数据库复制到开发服务器。什么是最快,最简单的方法呢?

最佳参考


您不需要创建中间文件。您可以这样做


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


使用psqlpg_dump连接到远程主机。


使用大型数据库或慢速连接,转储文件和传输压缩文件可能会更快。


正如Kornel所说,不需要转储到中间文件,如果你想要压缩工作,你可以使用压缩隧道


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


要么


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


但是这个解决方案还需要在两端进行会话。

其它参考1


pg_dump the_db_name > the_backup.sql


然后将备份复制到开发服务器,使用以下命令恢复:


psql the_new_dev_db < the_backup.sql

其它参考2


使用pg_dump,以及后来的psql或pg_restore - 取决于你是否选择-Fp或-Fc选项到pg_dump。[20] [21] [22]


用法示例:


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

其它参考3


如果您希望在不同版本之间进行迁移(例如,您更新了postgres并且在localhost上运行了9.1:在localhost:5434上运行了5432和9.3),您可以运行:


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


查看迁移文档。[23]

其它参考4


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

其它参考5


使用数据库名称运行此命令,要备份,以转储数据库。


 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/文件夹中恢复数据库。


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

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

其它参考6


我努力了很多,最终允许我使用Rails 4的方法是:


在你的旧服务器上


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


我不得不使用postgres linux用户来创建转储。我还必须使用-c强制在新服务器上创建数据库。 --inserts告诉它使用INSERT()语法,否则对我不起作用:(


然后,在新的服务器上,简单:


sudo su - postgres
psql new_database_name < dump.sql


在服务器之间传输dump.sql文件我只是使用cat来打印内容而不是nano来重新创建它来复制内容。


另外,我在两个数据库上使用的ROLE是不同的所以我必须找到 - 替换转储中的所有所有者名称。

其它参考7


让我共享一个Linux shell脚本,将表数据从一台服务器复制到另一台PostgreSQL服务器。


参考此博客: [24]


用于PostgreSQL服务器之间数据迁移的Linux Bash Shell脚本:


#!/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"


我只是在迁移数据;请在目标/第二个数据库服务器上创建一个空白表。


这是一个实用程序脚本。此外,您可以通过为host_name,database_name,table_name等添加参数来修改脚本以进行一般性使用

其它参考8





转储您的数据库:pg_dump database_name_name > backup.sql





导回你的数据库:psql db_name < backup.sql