我想复制一个生产PostgreSQL数据库到一个开发服务器。最快最简单的方法是什么?
当前回答
下面是使用pg_basebackup的示例
我选择这样做是因为它备份整个数据库集群(用户、数据库等)。
我把这个作为解决方案发布在这里,因为它详细说明了我必须采取的每一步,在阅读这里的其他答案并做更多的研究后,请随意添加建议或改进。
对于Postgres 12和Ubuntu 18.04,我必须做这些操作:
在当前运行数据库的服务器上:
更新pg_hba.conf,为我位于/etc/postgresql/12/main/pg_hba.conf
添加以下行(将192.168.0.100替换为要将数据库复制到的服务器的IP地址)。
host replication postgres 192.168.0.100/32 trust
更新postgresql.conf,我的地址是/etc/postgresql/12/main/postgresql.conf。增加如下一行:
listen_addresses = '*'
重启postgres:
Sudo服务postgresql重启
将数据库集群拷贝到以下主机:
Sudo service postgresql stop 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。我只能作为根用户来做,甚至不能使用sudo -u postgres。我不知道为什么。确保您在要将数据库复制到的新服务器上执行此操作!您正在删除整个数据库集群。
确保将IP地址从192.168.0.101更改为复制数据库的IP地址。使用pg_basebackup从原始服务器复制数据。启动服务。
更新pg_hba.conf和postgresql.conf以匹配原始服务器配置-在您添加复制行和listen_addresses行之前进行任何更改(在我的关心下,我必须添加通过md5本地登录pg_hba.conf的能力)。
注意,关于max_wal_senders和wal_level有一些注意事项,可以在文档中找到。我不需要做任何事。
其他回答
我努力了很多,最终让我在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
传输转储。我简单地使用“cat”来打印内容,而不是“nano”来重新创建它复制粘贴内容。
此外,我在两个数据库上使用的角色是不同的,所以我必须在转储中找到-替换所有的所有者名称。
您不需要创建中间文件。你可以这样做
pg_dump -C -h localhost -U localuser dbname | psql -h remotehost -U remoteuser dbname
or
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"
or
pg_dump -C dbname | ssh -C remoteuser@remotehost "psql dbname"
但是这个解决方案还需要在两端都获得一个会话。
注:pg_dump用于备份,psql用于恢复。因此,这个答案中的第一个命令是从本地复制到远程,第二个命令是从远程复制到本地。更多-> https://www.postgresql.org/docs/9.6/app-pgdump.html
如果你想在版本之间迁移(例如你更新了postgres,在localhost:5432上运行9.1,在localhost:5434上运行9.3),你可以运行:
pg_dumpall -p 5432 -U myuser91 | psql -U myuser94 -d postgres -p 5434
查看迁移文档。
接受的答案是正确的,但如果你想避免交互式输入密码,你可以使用这个:
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,然后再使用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
推荐文章
- HyperLogLog算法是如何工作的?
- 纬度和经度的数据类型是什么?
- 数据库和模式的区别
- 如何在PostgreSQL中临时禁用触发器?
- 输入文件似乎是一个文本格式转储。请使用psql
- 使用LIMIT/OFFSET运行查询,还可以获得总行数
- 当恢复sql时,psql无效命令\N
- 如何从命令行在windows中找到mysql数据目录
- 货币应该使用哪种数据类型?
- 如何添加列,如果不存在PostgreSQL?
- 如何找到MySQL的根密码
- 如何在Postgres中获得两个字段的MIN() ?
- 将表从一个数据库复制到另一个数据库的最简单方法?
- 截断Postgres数据库中的所有表
- 什么是分片,为什么它很重要?