pg_dump the_db_name > the_backup.sql
然后将备份复制到您的开发服务器,使用以下命令恢复:
psql the_new_dev_db < the_backup.sql
有人告诉我这可能是有问题的——权限问题导致转储或恢复在触发时死机?
@rmbarnes:如果有问题 – 它们必须得到修复。在没有详细了解这个“某人”做了什么的情况下 – 没有人可以证实或驳回这一说法。
将 –no-owner 标志与 pg_dump 一起使用。这跳过了这个问题,这篇文章的第一次编辑使用了它——但后来我想你可能需要对原始数据库更精确的保真度。
对我来说,上述方法的工作方式如下: 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
这为我省了很多麻烦。我使用谷歌驱动器在机器之间移动文件。由于我已经在新机器上拥有数据库(但为空白),因此我遇到了很多重复的键错误。但是,这是一个开发环境,它们并没有伤害任何东西。
利用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
有什么区别-Fp
和-Fc
-F, --format=c|d|t|p
输出文件格式(自定义、目录、tar、纯文本(默认))
如果您希望在版本之间迁移(例如,您更新了 postgres 并在 localhost:5432 上运行 9.1 并在 localhost:5434 上运行 9.3),您可以运行:
pg_dumpall -p 5432 -U myuser91 | psql -U myuser94 -d postgres -p 5434
查看迁移文档.
我多次被要求输入(myuser91/postgres)密码,有没有办法让我只需要输入一次密码?
@MartinWeber 根据此文档创建一个 ,pgpass 文件postgresql.org/docs/9.4/static/libpq-pgpass.html
如果他们有两个相同的端口怎么办?
如果它们在不同的服务器上,您可以使用 -h 来指定主机。
pg_basebackup
现在似乎是这样做的更好方法,尤其是对于大型数据库。
您可以从具有相同或更旧主要版本的服务器复制数据库。或者更确切地说:
pg_basebackup
适用于相同或旧主要版本的服务器,低至 9.1。但是,WAL 流模式(-X stream
) 仅适用于服务器版本 9.3 及更高版本,以及 tar 格式模式 (--format=tar
) 当前版本仅适用于服务器版本 9.5 或更高版本。
为此,您需要在源服务器上:
listen_addresses = '*'
能够从目标服务器连接。确保为此打开端口 5432。- 至少 1 个可用的复制连接:
max_wal_senders = 1
(-X fetch
),2
为了-X stream
(PostgreSQL 12 的默认值),或更多。 wal_level = replica
或更高才能设置max_wal_senders > 0
.host replication postgres DST_IP/32 trust
在pg_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
您能否在答案中提供更多详细信息,例如示例?
不过,这只适用于两台机器具有相同 PG 版本的情况。
您将使用不同的数据库版本进行开发和生产的可能性很小。上次我与我的一位队友进行了一些不愉快的谈话,因为她试图提交一个问题,即在我们当时在生产中使用 9.5 时某些代码无法与 PG 9.6 一起使用。基本备份要快得多。如果需要,那么 pg_upgrade 就是要走的路。
您可能想要迁移到更新的版本,并且不想停止 PostgreSQL。
很有可能,每当您升级数据库时,您都会先在 dev 和 staging 上对其进行升级,然后再在生产中进行升级。
接受的答案是正确的,但如果你想避免交互输入密码,你可以使用这个:
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}}
这是我找到此信息的唯一地方,好提示
无论如何要向此命令添加多线程?
如果你使用 postgres 的 ip public 连接,你必须添加选项 -p 来指定主机的端口,例如: -h {{export_db_host}} -p {{export_db_port}}
你也可以使用 –dbname={{import_db_host}} 来指定数据库名称
我可以在 powershell 中使用这种语法吗?我需要将密码放在引号中吗? @zoran