我正在寻找将生产PostgreSQL数据库复制到开发服务器。这是最快,最简单的方法吗?
答案 0 :(得分:590)
您无需创建中间文件。你可以做到
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"
但是这个解决方案还需要在两端获得会话。
答案 1 :(得分:119)
pg_dump the_db_name > the_backup.sql
然后将备份复制到开发服务器,使用以下命令恢复:
psql the_new_dev_db < the_backup.sql
答案 2 :(得分:37)
使用pg_dump以及之后的psql或pg_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
答案 3 :(得分:21)
如果您希望在不同版本之间进行迁移(例如,您更新了postgres并在本地主机上运行9.1:5432和9.3运行在localhost:5434上),您可以运行:
pg_dumpall -p 5432 -U myuser91 | psql -U myuser94 -d postgres -p 5434
答案 4 :(得分:13)
pg_basebackup
现在似乎是更好的方法,特别是对于大型数据库。
答案 5 :(得分:6)
使用数据库名称运行此命令,要备份,以转储数据库。
pg_dump -U {user-name} {source_db} -f {dumpfilename.sql}
eg. pg_dump -U postgres mydbname -f mydbnamedump.sql
现在将此转储文件scp到要复制DB的远程计算机。
eg. scp mydbnamedump.sql user01@remotemachineip:~/some/folder/
在远程机器上运行〜/ some /文件夹中的以下命令以恢复数据库。
psql -U {user-name} -d {desintation_db}-f {dumpfilename.sql}
eg. psql -U postgres -d mynewdb -f mydbnamedump.sql
答案 6 :(得分:4)
我努力了很多,最终允许我使用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”来重新创建它来复制内容。
另外,我在两个数据库上使用的ROLE是不同的,所以我必须找到 - 替换转储中的所有所有者名称。
答案 7 :(得分:3)
让我共享一个Linux shell脚本,将表数据从一台服务器复制到另一台PostgreSQL服务器。
<强> Reference taken from this blog: 强>
用于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和其他人添加参数来修改脚本以进行一般性使用
答案 8 :(得分:2)
转储您的数据库:pg_dump database_name_name > backup.sql
导回您的数据库:psql db_name < backup.sql
答案 9 :(得分:1)
如果您更习惯使用GUI,则可以使用 pgAdmin 软件。
答案 10 :(得分:0)
可接受的答案是正确的,但是如果要避免以交互方式输入密码,则可以使用以下方法:
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}}
答案 11 :(得分:0)
以下是使用pg_basebackup
我之所以选择这条路线,是因为它备份了整个数据库集群(用户,数据库等)。
我将其作为解决方案发布在这里,因为它详细说明了我必须采取的每一个步骤,在这里阅读其他答案并进行更多研究后,可以随意添加建议或改进。
对于Postgres 12和Ubuntu 18.04,我必须执行以下操作:
在当前正在运行数据库的服务器上:
为pg_hba.conf
的我更新/etc/postgresql/12/main/pg_hba.conf
添加以下行(用要将数据库复制到的服务器的IP地址替换为192.168.0.100)。
host replication postgres 192.168.0.100/32 trust
为postgresql.conf
的我更新/etc/postgresql/12/main/postgresql.conf
。添加以下行:
listen_addresses = '*'
重新启动postgres:
sudo服务postgresql重新启动
在要将数据库集群复制到的主机上:
sudo服务postgresql停止
sudo su root
rm -rf / var / lib / postgresql / 12 / main / *
退出
sudo -u postgres pg_basebackup -h 192.168.0.101 -U postgres -D / var / lib / postgresql / 12 / main /
sudo服务postgresql启动
大图-停止服务,删除数据目录中的所有内容(我的文件位于/var/lib/postgreql/12
中)。该目录的权限为drwx------
,具有用户和组postgres
。我只能以root
的身份执行此操作,即使使用sudo -u postgres
也不能。我不确定为什么。确保在要将数据库复制到的新服务器上执行此操作!您将删除整个数据库集群。
确保将IP地址从192.168.0.101
更改为您要从中复制数据库的IP地址。使用pg_basebackup
从原始服务器复制数据。启动服务。
更新pg_hba.conf
和postgresql.conf
以匹配原始服务器配置-在进行任何更改之前,添加replication
行和listen_addresses
行(在我看来,我不得不添加通过md5本地登录到pg_hba.conf的功能。
请注意,documentation中有max_wal_senders
和wal_level
的注意事项。我对此不需要做任何事情。