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

Rob*_*nes 465 database postgresql

我想将生产PostgreSQL数据库复制到开发服务器.这是最快捷,最简单的方法吗?

Fer*_*ran 625

您不需要创建中间文件.你可以做

pg_dump -C -h localhost -U localuser dbname | psql -h remotehost -U remoteuser dbname
Run Code Online (Sandbox Code Playgroud)

要么

pg_dump -C -h remotehost -U remoteuser dbname | psql -h localhost -U localuser dbname
Run Code Online (Sandbox Code Playgroud)

使用psqlpg_dump连接到远程主机.

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

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

pg_dump -C dbname | bzip2 | ssh  remoteuser@remotehost "bunzip2 | psql dbname"
Run Code Online (Sandbox Code Playgroud)

要么

pg_dump -C dbname | ssh -C remoteuser@remotehost "psql dbname"
Run Code Online (Sandbox Code Playgroud)

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

  • 不需要中间文件 - 您可以使用压缩的SSH隧道或只需管道:pg_dump | bzip2 | ssh"bunzip2 | pg_restore" (28认同)
  • 如果我将*数据从生产中拉到开发中,我该如何工作压缩?我已经建立了从开发到生产的SSH连接.那么它是`ssh remoteuser @ remotehost"pg_dump -C dbname | bzip2"| bunzip2 | psql dbname`? (8认同)
  • 如果您使用bzip2,请关闭ssh压缩以加快传输速度! (4认同)
  • 这就是我所做的:(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"' (3认同)
  • 如果两台服务器都要求输入密码,则无法使用此命令。他们会同时询问,并且根据墨菲定律,输入的密码总是会进入错误的实例(刚刚确认了两次)。 (3认同)
  • 我希望您应该能够将名称为x的远程数据库复制到名称为y的本地数据库,但是@Ferran的解决方案对此不起作用...在我看来,porneL的解决方案只是将bzip2文件保留在服务器,所以这不是一个一步的过程。在这种情况下,我想我将删除数据库y,使用Ferran解决方案的“或”部分还原x,然后将数据库重命名为y。 (2认同)
  • 我在答案中使用命令将数据库从本地主机复制到远程主机,但它总是尝试在本地主机端创建一个名为数据库的数据库,无论我在命令的第二部分给出什么名称。在将它复制到远程主机之前,我必须重命名它。知道如何在同一命令中执行此操作吗? (2认同)
  • @JeromyFrench 对于未来的读者,命令 `ssh -i <key> postgres@<host> -C "pg_dump -C <dbname>" | psql <dbname>` 帮助我从远程主机提取数据。 (2认同)
  • 请注意,如果您想停止并检查/处理遇到的每个错误,您可以在 psql 行末尾添加 `-v ON_ERROR_STOP=1`,例如 `pg_dump -C -h localhost -U sarahpopov somni | psql -h 165.227.36.129 -U somni somni -v ON_ERROR_STOP=1` (2认同)
  • 可以多线程吗? (2认同)

unm*_*ted 121

pg_dump the_db_name > the_backup.sql
Run Code Online (Sandbox Code Playgroud)

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

psql the_new_dev_db < the_backup.sql
Run Code Online (Sandbox Code Playgroud)

  • @rmbarnes:如果有问题 - 必须修复它们.如果没有详细了解这个"某人"做了什么 - 没有人可以证实或驳回这一主张. (16认同)
  • 有人告诉我这可能有问题 - 权限问题导致转储或恢复在触发时死亡? (3认同)
  • 在pg_dump中使用--no-owner标志.这跳过了问题,这篇文章的第一次编辑使用了它 - 但后来我认为你可能需要更加精确的原始数据库保真度. (3认同)
  • 对我来说,上面的方法按以下方式工作: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 (3认同)

小智 37

使用pg_dump,以及后来的psqlpg_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
Run Code Online (Sandbox Code Playgroud)


Eri*_* H. 21

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

pg_dumpall -p 5432 -U myuser91 | psql -U myuser94 -d postgres -p 5434
Run Code Online (Sandbox Code Playgroud)

查看迁移文档.


小智 14

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

  • 您能否在答案中提供更多详细信息,例如示例? (11认同)
  • 这仅适用于两台机器具有相同PG版本的情况. (7认同)
  • 您可能希望迁移到更新的版本,并且不想停止PostgreSQL. (2认同)
  • 有可能,每当您升级数据库时,您都会先在开发和登台上升级它,然后再在生产中进行升级。 (2认同)

zor*_*ran 11

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

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}}
Run Code Online (Sandbox Code Playgroud)

  • 这是我找到此信息的唯一地方,很好的提示 (2认同)

小智 8


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


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


use*_*r01 7

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

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

 eg. pg_dump -U postgres mydbname -f mydbnamedump.sql
Run Code Online (Sandbox Code Playgroud)

现在,将此转储文件scp到要复制数据库的远程计算机。

eg. scp mydbnamedump.sql user01@remotemachineip:~/some/folder/
Run Code Online (Sandbox Code Playgroud)

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

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

 eg. psql -U postgres -d mynewdb -f mydbnamedump.sql
Run Code Online (Sandbox Code Playgroud)


pas*_*llo 6

我经过了很多努力,最终使我可以在Rails 4中使用的方法是:

在旧服务器上

sudo su - postgres
pg_dump -c --inserts old_db_name > dump.sql
Run Code Online (Sandbox Code Playgroud)

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

然后,在新服务器上,simpy:

sudo su - postgres
psql new_database_name < dump.sql
Run Code Online (Sandbox Code Playgroud)

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

另外,我在两个数据库上使用的角色是不同的,因此我不得不在转储中查找替换所有所有者名称。


Anv*_*esh 5

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

从此博客获得的参考:

用于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"
Run Code Online (Sandbox Code Playgroud)

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

这是一个实用程序脚本。此外,您可以修改脚本以用于一般用途,例如通过为host_name,database_name,table_name和其他参数添加参数