从不同的重大版本升级PostgreSQL(例如,从9.1升级到9.3),基本上有三种方法:
用 pg_dump 升级
如果可以的话,首先推荐的方法是使用新版本(9.3)进行二进制备份一个老(9.1)版本数据,然后在新版本创建的集群中恢复数据。
这种途径,通常,是比较慢的,但是也是最实用的。使它进行得更加快的方法之一是,使用并发。为了并行备份任务,你可以这样子做:
|
|
你可以为每个数据库进行这样子的备份,并调整 --jobs=4
参数值到任何值(测试从2到CPU核心数,并看看哪个更快)。当然,在备份期间,没人应该连接到数据库,任何的修改将会导致备份中断(因为非安全选项 --no-synchronized-snapshots
)
之后,你可以使用pg_restore
来恢复到新的实例中:
|
|
之后, 建议在数据库上执行ANALYZE
命令:
|
|
(如果你可以等待时间的话,仅仅运行 --analyze
来同时进行 VACUUM 数据库并更新可视数据字典)
使用 pg_upgrade 升级
另一种方法,是使用扩展包中的 pg_upgrade
。它提供了一个非常快速的方法来升级PostgreSQL,就是使用 --link
方法。
使用之前,你必须备份整个数据目录,因为在 --link
模式下,如果出错,你可能丢失所有数据(包括新旧数据)。并且,请完整地阅读文档,特别是底部的提示(pg_upgrade
有许多限制)
使用基于复制工具的触发器来升级
另一种升级版本的选项,是使用基于触发器的复制工具 。比如Slony, Bucardo和Londiste
。
这个选项可能用于最少停机时间,但是也是最难操作的。
这样做的话,需要建立一个 master-slave
,主库是你当前版本(9.1),从库是新版本(9.3)。之后,等待第一次同步(系统仍然在生产环境),之后你关闭所有连接到数据库(停机时间从这里开始),等待从库赶上,然后提升(从库)到主库,然后重定向所有客户/应用程序到新版本数据库。打完收工。
Slony
文档提供了一步一步地教你使用Slony
来升级PostgreSQL.
应该选择哪个?
Well, as always depends, resuming:
好了,这要取决于什么,总结一下:
dump+restore
是最可靠的,但通常也是最慢的一种(尽管,并行性可以带来更好的结果)
pg_upgrade
是对于比较少的停机时间来说是最好的选择之一(如果你能使用的话,看看它的限制)。它通常只需要花数分钟的时间,甚至对于大的数据库也是这样。
触发器复制
,毫无疑问是最少停机时间(几乎为0)的做法,但是它真的好难实行,并且我仅仅建议专家(PostgreSQL和复制工具二者都非常熟悉的专家)
希望我可以帮到你。祝你好运。