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


Answers:


666

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

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"

但是此解决方案还需要两端都进行会话。

注意: pg_dump用于备份和psql还原。因此,此答案中第一个命令是从本地复制到远程,第二个命令是从remote复制到本地。更多-> https://www.postgresql.org/docs/9.6/app-pgdump.html


28
不需要中间文件-您可以使用压缩的SSH隧道或仅使用管道:pg_dump | bzip2 | SSH “bunzip2命令| pg_restore的”
科内尔

4
如果使用bzip2,请关闭ssh压缩以加快传输速度!
lzap 2012年

8
如果要将数据从生产下拉到开发中,如何进行压缩工作?我已经建立了从开发到生产的SSH连接。会是这样ssh remoteuser@remotehost "pg_dump -C dbname | bzip2" | bunzip2 | psql dbname吗?
Jeromy French

2
我希望您应该能够将名称为x的远程数据库复制到名称为y的本地数据库,但是@Ferran的解决方案对此不起作用...在我看来,porneL的解决方案只是将bzip2文件保留在服务器,所以这不是一个一步的过程。在这种情况下,我想我将删除数据库y,使用Ferran解决方案的“或”部分还原x,然后将数据库重命名为y。
Darin Peterson

3
这就是我所做的:(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”重命名为“ y”'
Darin Peterson

131
pg_dump the_db_name > the_backup.sql

然后将备份复制到您的开发服务器,并使用以下命令进行还原:

psql the_new_dev_db < the_backup.sql

3
有人告诉我这可能是有问题的-权限问题会导致转储或还原在触发时死掉吗?
罗宾·巴恩斯

17
@rmbarnes:如果有问题-必须修复。没有详细的知识,“某人”做了什么-没有人可以确认或驳回这一主张。

4
在pg_dump中使用--no-owner标志。这跳过了问题,本文的第一次编辑使用了它-但后来我认为您可能需要对原始数据库更精确的保真度。
卸载

4
对我来说,以上方法按以下方式工作:pg_dump -C -h host -U用户名db_name> / any_directory / dump_schema_and_data_file。要从文件还原:psql -h host -U用户名db_name <dump_schema_and_data_file
Ali Raza Bhayani 2014年

那省了我很多麻烦。我使用Google驱动器在机器之间移动文件。由于我已经在新机器上拥有数据库(但是空白),所以出现了很多重复的键错误。但是,这是一个开发环境,他们没有受到任何伤害。
克里斯·门德拉

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

22

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

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

查看迁移文档


我被要求多次输入(myuser91 / postgres)密码,有没有办法只需要输入一次密码?
Martin Weber)

@MartinWeber根据此文档创建一个.pgpass文件postgresql.org/docs/9.4/static/libpq-pgpass.html
Scott Warren

如果两个端口都相同怎么办?
ggnoredo

如果它们在不同的服务器上,则可以使用-h指定主机。
Haroldo_OK

16

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

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

pg_basebackup适用于相同或更低主版本(低至9.1)的服务器。但是,WAL流模式(-X stream)仅适用于9.3 --format=tar版或更高版本的服务器,而当前版本的tar格式模式()仅适用于9.5版或更高版本的服务器。

为此,您需要在源服务器上:

  1. listen_addresses = '*'以便能够从目标服务器连接。确保为此打开端口5432。
  2. 至少1个可用的复制连接: max_wal_senders = 1-X fetch),2用于-X stream(在PostgreSQL中12的情况下,缺省值)或更多。
  3. wal_level = replica或更高才能设置max_wal_senders > 0
  4. host replication postgres DST_IP/32 trustpg_hba.conf。这将使pg来自DST_IP计算机的任何人都可以访问群集。您可能想诉诸更安全的选择。

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

11
您能否在答案中提供更多细节,例如一个例子?
Magnilex

7
但是,这仅在两台机器具有相同的PG版本时才有效。
2016年

您将使用不同的数据库版本进行开发和生产的机会很小。上一次,我与一个队友进行了不愉快的交谈,当时她正试图提出一个问题,即当时我们在生产环境中使用9.5时,某些代码不适用于PG 9.6。基本备份要快得多。然后,如果需要,可以使用pg_upgrade。
Zorg

2
您可能要迁移到较新的版本,而又不想停止PostgreSQL。
x-yuri

1
很有可能,每当升级数据库时,都需要在开发和登台之前对其进行升级,然后再在生产环境中对其进行升级。
安德鲁·洛里安(Andrew lorien)'18

8

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

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

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

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

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

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

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

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

7

我经过了很多努力,最终使我可以在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”来重新创建它来复制粘贴内容。

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


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"

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

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


5

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


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


5

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

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}}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.