我正在尝试找到一种移动postgresql的最快方法 数据库v9.1.20从一台服务器到另一台服务器 与postgres v9.3.10。
情景如下:
运行Ubuntu 12.04的生产服务器 postgresql 9.1.20,数据库大小appox 250g
我们尝试重新定位的目标服务器是 Ubuntu 14.04 postgresq 9.3.10。
我们尝试尝试的第一次尝试
是从旧服务器转储数据库(pg_dump
)并恢复
它在新服务器上(pg_restore
)。
它工作得很好,但我们花了很多时间
重新安置大约需要4个小时(pg_dump
需要3个小时
和pg_restore需要1小时(网络链接1g,
两台服务器上的SSD磁盘。)
4小时内的总停机时间是不可接受的。
下一次尝试是使用pg_basebackup
代替
pg_dump
。该方法将备份时间缩短了40分钟
而不是3小时,这是可以接受的。
但是我们不能使用pg_basebackup
提供的转储
由于版本不兼容。
我读过很多关于如何提供inplace数据库的文章 升级,但似乎他们都指的是升级 SAME服务器。
所以我的问题 - 如何升级生成的数据库备份
由服务器上的pg_basebackup
提供,而不是之前的
postgresql服务二进制文件安装?
感谢。
答案 0 :(得分:0)
您可以使用repmgr和pg_upgrade
执行升级,停机时间最短(几分钟)。
在master(postgresql 9.1)上启用流复制。需要重新启动数据库
hot_standby = on
wal_keep_segments = 4000 # must be hight enough for standby to catch up
在备用服务器上安装PostgreSQL 9.1和9.3。在两台服务器上安装repmgr 2.0。因为repmgr 3.x版本适用于PostgreSQL 9.3或更高版本。
同步主服务器和备用服务器:
repmgr -D /var/lib/postgresql/9.1/main -p 5432 -d repmgr -U repmgr --verbose standby clone -h psql01a.example.net --fast-checkpoint
应使用pg_basebackup
下方。所以这种方法与你所描述的方法几乎相同。
克隆完成后,您可以开始注册待机:
repmgr -f /etc/repmgr.conf standby register
service postgresql start
这将允许备用数据库捕获复制期间在主服务器上提交的更改。
两个数据库都在运行(同步),检查是否可以升级:
/usr/lib/postgresql/9.3/bin/pg_upgrade --check \
--old-datadir=/var/lib/postgresql/9.1/main \
--new-datadir=/var/lib/postgresql/9.3/main \
--old-bindir=/usr/lib/postgresql/9.1/bin \
--new-bindir=/usr/lib/postgresql/9.3/bin -v
如果通过升级检查,则必须停止主控。现在是停机期。提升备用掌握。
postgres#: repmgr standby promote
service postgresql start
# if everything looks ok, just stop the server
service postgresql stop
最快的升级方法是使用链接:
/usr/lib/postgresql/9.3/bin/pg_upgrade --link \
--old-datadir=/var/lib/postgresql/9.1/main \
--new-datadir=/var/lib/postgresql/9.3/main \
--old-bindir=/usr/lib/postgresql/9.1/bin \
--new-bindir=/usr/lib/postgresql/9.3/bin
即使使用200GB数据,升级也不会超过几分钟(通常不到一分钟)。当事情向南发展时,很难还原变更(但我们仍然拥有功能主服务器)。升级完成后,启动新服务器。验证一切正常,然后您可以安全地删除旧群集:
./delete_old_cluster.sh