将PostgreSQL数据库复制到另一台服务器

Copying PostgreSQL database to another server

我希望将生产PostgreSQL数据库复制到开发服务器。做这件事最快、最简单的方法是什么?


不需要创建中间文件。你可以做到

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

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

使用psqlpg_dump连接到远程主机。

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

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

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

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

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


1
pg_dump the_db_name > the_backup.sql

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

1
psql the_new_dev_db < the_backup.sql


使用pg_dump,稍后使用psql或pg_restore,这取决于您选择-fp还是-fc选项进行pg_dump。

使用示例:

1
2
3
4
5
6
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

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

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

查看迁移文档。


目前,pg_basebackup似乎是更好的方法,尤其是对于大型数据库。


用数据库名称运行这个命令,您想备份它,以获得数据库的转储。

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

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

现在将这个转储文件scp到远程机器上,在那里复制db。

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

在远程计算机上,在~/some/folder中运行以下命令以还原数据库。

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

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


我费了很大的劲,最终使我能够使用Rails 4的方法是:

在旧服务器上

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

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

然后,在新服务器上,简化:

1
2
sudo su - postgres
psql new_database_name < dump.sql

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

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


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

引用自此日志:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/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"

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

这是一个实用程序脚本。此外,您还可以修改脚本以供常规使用,例如添加主机名、数据库名、表名等参数。


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

重新导入数据库:psql db_name < backup.sql


接受的答案是正确的,但如果要避免以交互方式输入密码,可以使用此选项:

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