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

时间:2009-08-06 08:56:16

标签: database postgresql

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

12 个答案:

答案 0 :(得分:590)

您无需创建中间文件。你可以做到

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 :(得分:119)

pg_dump the_db_name > the_backup.sql

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

psql the_new_dev_db < the_backup.sql

答案 2 :(得分:37)

使用pg_dump以及之后的psqlpg_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

答案 3 :(得分:21)

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

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

查看migration docs

答案 4 :(得分:13)

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

答案 5 :(得分:6)

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

 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 :(得分:4)

我努力了很多,最终允许我使用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”来重新创建它来复制内容。

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

答案 7 :(得分:3)

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

<强> Reference taken from this blog:

用于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 :(得分:2)

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

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

答案 9 :(得分:1)

如果您更习惯使用GUI,则可以使用 pgAdmin 软件。

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

enter image description here

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

以下是使用pg_basebackup

的示例

我之所以选择这条路线,是因为它备份了整个数据库集群(用户,数据库等)。

我将其作为解决方案发布在这里,因为它详细说明了我必须采取的每一个步骤,在这里阅读其他答案并进行更多研究后,可以随意添加建议或改进。

对于Postgres 12和Ubuntu 18.04,我必须执行以下操作:


在当前正在运行数据库的服务器上:

pg_hba.conf的我更新/etc/postgresql/12/main/pg_hba.conf

添加以下行(用要将数据库复制到的服务器的IP地址替换为192.168.0.100)。

host  replication  postgres  192.168.0.100/32  trust

postgresql.conf的我更新/etc/postgresql/12/main/postgresql.conf。添加以下行:

listen_addresses = '*'

重新启动postgres:

sudo服务postgresql重新启动


在要将数据库集群复制到的主机上:

sudo服务postgresql停止

sudo su root

rm -rf / var / lib / postgresql / 12 / main / *

退出

sudo -u postgres pg_basebackup -h 192.168.0.101 -U postgres -D / var / lib / postgresql / 12 / main /

sudo服务postgresql启动

大图-停止服务,删除数据目录中的所有内容(我的文件位于/var/lib/postgreql/12中)。该目录的权限为drwx------,具有用户和组postgres。我只能以root的身份执行此操作,即使使用sudo -u postgres也不能。我不确定为什么。确保在要将数据库复制到的新服务器上执行此操作!您将删除整个数据库集群。

确保将IP地址从192.168.0.101更改为您要从中复制数据库的IP地址。使用pg_basebackup从原始服务器复制数据。启动服务。

更新pg_hba.confpostgresql.conf以匹配原始服务器配置-在进行任何更改之前,添加replication行和listen_addresses行(在我看来,我不得不添加通过md5本地登录到pg_hba.conf的功能。

请注意,documentation中有max_wal_senderswal_level的注意事项。我对此不需要做任何事情。