问答中心分类: DATABASE将 PostgreSQL 数据库复制到另一台服务器
0
匿名用户 提问 2周 前

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

11 Answers
0
unmounted 回答 2周 前
pg_dump the_db_name > the_backup.sql

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

psql the_new_dev_db < the_backup.sql
Robin Barnes 回复 2周 前

有人告诉我这可能是有问题的——权限问题导致转储或恢复在触发时死机?

user80168 回复 2周 前

@rmbarnes:如果有问题 – 它们必须得到修复。在没有详细了解这个“某人”做了什么的情况下 – 没有人可以证实或驳回这一说法。

unmounted 回复 2周 前

将 –no-owner 标志与 pg_dump 一起使用。这跳过了这个问题,这篇文章的第一次编辑使用了它——但后来我想你可能需要对原始数据库更精确的保真度。

Ali Raza Bhayani 回复 2周 前

对我来说,上述方法的工作方式如下: pg_dump -C -h host -U username db_name &gt; /any_directory/dump_schema_and_data_file 。对于从文件恢复: psql -h host -U username db_name &lt; dump_schema_and_data_file

Chris Mendla 回复 2周 前

这为我省了很多麻烦。我使用谷歌驱动器在机器之间移动文件。由于我已经在新机器上拥有数据库(但为空白),因此我遇到了很多重复的键错误。但是,这是一个开发环境,它们并没有伤害任何东西。

0
user80168user80168 回答 2周 前

利用pg_dump, 然后psql或者pg_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
Pithikos 回复 2周 前

有什么区别-Fp-Fc

p13rr0m 回复 2周 前

-F, --format=c|d|t|p输出文件格式(自定义、目录、tar、纯文本(默认))

0
Eric H. 回答 2周 前

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

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

查看迁移文档.

Martin Weber 回复 2周 前

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

Scott Warren 回复 2周 前

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

ggnoredo 回复 2周 前

如果他们有两个相同的端口怎么办?

Haroldo_OK 回复 2周 前

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

0
Reshad user2701173 回答 2周 前

pg_basebackup现在似乎是这样做的更好方法,尤其是对于大型数据库。
您可以从具有相同或更旧主要版本的服务器复制数据库。或者更确切地说

pg_basebackup适用于相同或旧主要版本的服务器,低至 9.1。但是,WAL 流模式(-X stream) 仅适用于服务器版本 9.3 及更高版本,以及 tar 格式模式 (--format=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
Magnilex 回复 2周 前

您能否在答案中提供更多详细信息,例如示例?

s.m. 回复 2周 前

不过,这只适用于两台机器具有相同 PG 版本的情况。

Zorg 回复 2周 前

您将使用不同的数据库版本进行开发和生产的可能性很小。上次我与我的一位队友进行了一些不愉快的谈话,因为她试图提交一个问题,即在我们当时在生产中使用 9.5 时某些代码无法与 PG 9.6 一起使用。基本备份要快得多。如果需要,那么 pg_upgrade 就是要走的路。

x-yuri 回复 2周 前

您可能想要迁移到更新的版本,并且不想停止 PostgreSQL。

andrew lorien 回复 2周 前

很有可能,每当您升级数据库时,您都会先在 dev 和 staging 上对其进行升级,然后再在生产中进行升级。

0
zoran 回答 2周 前

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

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}}
jaycarleton 回复 2周 前

这是我找到此信息的唯一地方,好提示

CodeGuru 回复 2周 前

无论如何要向此命令添加多线程?

Bona Ws 回复 2周 前

如果你使用 postgres 的 ip public 连接,你必须添加选项 -p 来指定主机的端口,例如: -h {{export_db_host}} -p {{export_db_port}}

Bona Ws 回复 2周 前

你也可以使用 –dbname={{import_db_host}} 来指定数据库名称

Learner 回复 2周 前

我可以在 powershell 中使用这种语法吗?我需要将密码放在引号中吗? @zoran