我们有一个只有5个表的简单数据库。但是1个表格很大,本身大约有100GB的数据,而且这些指数几乎是这个数字的两倍。服务器是带有PG 9.0的旧CentOS 5服务器。我正在转向使用SSD硬盘,CentOS 7和PG 9.6的更现代化的设置。
问题:什么是以简单方式迁移数据的最佳方式。 pg_dump它在旧服务器上,通过rsync或其他东西移动到新服务器和pg_restore?我可以使用-Fc
选项执行pg_dump,这样我们就可以轻松地pg_restore(否则它是一种文本格式,我们必须使用psql -f
)。但试运行表明,虽然pg_dump没问题,但目标服务器上的pg_restore会更快,继续运行。我们做了pg_restore --verbose
,但根本没有冗长。也许服务器卡在做IO?
我们对pg_restore的pg.conf
设置如下:
maintenance_work_mem = 1500MB
fsync = off
synchronous_commit = off
wal_level = minimal
full_page_writes = off
wal_buffers = 64MB
max_wal_senders = 0
wal_keep_segments = 0
archive_mode = off
autovacuum = off
我们应该怎样做才能确保pg_restore有效?现在两个服务器都处于脱机状态,因此我可以做任何需要的事情 - 任何设置都可以更改。
更多背景信息 -
旧服务器:CentOS 5,SCSI RAID 1磁盘,4GB RAM(不多),PG 9.0
新服务器:CentOS 7(最新版),SSD磁盘,16GB RAM,PG 9.6
感谢您提供有关以最佳方式移动大型表格的任何指示。通常的PG文档似乎没有帮助。我们尝试了文本转储方式和-Fc
方式。
答案 0 :(得分:2)
我强烈建议你pg_upgrade
:
pg_basebackup
和合适的recovery.conf
在新服务器上设置流式副本。启用WAL归档和restore_command
,以防它因任何原因失去同步。pg_upgrade
到9.6来执行升级测试。重启副本,修复所有问题并重复,直至成功。pg_upgrade
会成功,请计划一个切换时间。停止9.0 master并停止副本。 pg_upgrade
复制品。启动新的9.6服务器。有关详细信息,请参阅pg_upgrade
文档。
记住:保持备用。
如果您想要简单,只需pg_dumpall
,然后输入psql
。但是这样做会很慢,如果你的恢复失败到中途,你会尝试恢复等等,这会导致问题。
更好:
如果您不想使用复制,那么如果您希望快速完成任务,请使用并行模式pg_dump
和pg_restore
directory
格式输入/输出。
pg_dump
和pg_dumpall
:
pg_dumpall --globals-only -f globals.sql
pg_dump -Fd -j4 -d dbname -f dbname.dumpdir
或类似内容转储您的数据库。 -j
是并行作业的数量。如果有多个数据库,则需要单独转储每个数据库。initdb
一个新的PostgreSQL 9.6安装,删除你以前做过的任何尝试(因为我不知道是什么/不存在)。或者,DROP
任何创建的角色,数据库等,将其返回到干净状态。psql
运行全局脚本:psql -v ON_ERROR_STOP=1 --single-transaction -f globals.sql -d postgres
pg_restore
加载数据库转储:pg_restore --create -d template1 -j4 template1 dbname.dump
,重复每个转储的数据库。您可以同时还原多个DB。是的,我知道全局对象的处理很糟糕。是的,如果所有这些都包含在一个简单的命令中,那就太好了。但事实并非如此。如果您想尝试改进此设计,欢迎设计和经过深思熟虑的补丁。到目前为止,没有人愿意做足够的工作。