你不需要创建中间文件。可以直接进行操作。
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
使用psql
或pg_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
用于恢复。因此,这个答案中的第一个命令是从本地复制到远程,第二个命令是从远程复制到本地。更多信息请查看 -> https://www.postgresql.org/docs/9.6/app-pgdump.html
pg_dump the_db_name > the_backup.sql
然后将备份文件复制到您的开发服务器上,并使用以下命令进行还原:
psql the_new_dev_db < the_backup.sql
使用pg_dump,然后根据您选择的-Fp或-Fc选项,使用psql或pg_restore。
使用示例:
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
之间有什么区别? - Pithikos-Fc
生成压缩且更小的文件。它可以与 -j
选项并行还原,例如 pg_restore -j 8 -d dbname dump.sql
。-Fd
“目录”格式还支持并行转储。 - Sergey Ponomarev如果你想在不同版本之间迁移(例如你更新了Postgres,并且在localhost:5432上运行9.1和在localhost:5434上运行9.3),可以运行以下命令:
pg_dumpall -p 5432 -U myuser91 | psql -U myuser94 -d postgres -p 5434
查看迁移文档。
pg_basebackup
现在似乎是更好的方式,特别是对于大型数据库。
您可以从具有相同或旧的主版本的服务器复制数据库。或者更准确地说:
pg_basebackup
适用于相同或旧的主版本的服务器,最低版本为9.1。但是,WAL流模式(-X stream
)仅适用于9.3及更高版本的服务器,当前版本的tar格式模式(--format=tar
)仅适用于9.5或更高版本的服务器。
因此,您需要在源服务器上执行以下操作:
listen_addresses = '*'
可以让目标服务器连接。请确保端口5432已经开放。max_wal_senders = 1
(-X fetch
),-X stream
(PostgreSQL 12默认值)或更多。wal_level = replica
或更高才能设置 max_wal_senders > 0
。pg_hba.conf
中添加 host replication postgres DST_IP/32 trust
条目。这将允许来自 DST_IP
的任何人访问 pg
集群。您可能需要采取更安全的选项。# systemctl stop postgresql@VERSION-NAME
postgres$ pg_basebackup -h SRC_IP -U postgres -D VERSION/NAME --progress
# systemctl start postgresql@VERSION-NAME
被接受的答案是正确的,但是如果你想避免交互式地输入密码,可以使用这个:
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}}
使用要备份的数据库名称运行此命令,以获取数据库的转储。
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
备份你的数据库: pg_dump 数据库名称 > 备份文件.sql
还原你的数据库: psql 数据库名称 < 备份文件.sql
我很努力地尝试了很多方法,最终让我成功在Rails 4上运行的方法是:
在您的旧服务器上
sudo su - postgres
pg_dump -c --inserts old_db_name > dump.sql
我不得不使用postgres Linux用户创建转储。同时,我必须使用“-c”强制在新服务器上创建数据库。“--inserts”告诉它使用INSERT()语法,否则对我来说无法正常工作:(
然后,在新服务器上,简单执行以下操作:
sudo su - postgres
psql new_database_name < dump.sql
为了在服务器之间传输dump.sql文件,我简单地使用"cat"打印内容,然后使用"nano"重新创建并复制粘贴内容。
此外,我在两个数据库上使用的角色不同,因此我不得不在转储中查找和替换所有所有者名称。
#!/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
和其他参数等来修改脚本以供通用使用。
ssh remoteuser@remotehost "pg_dump -C dbname | bzip2" | bunzip2 | psql dbname
? - Jeromy French