PostgreSQL最可靠的升级方案[实践]

注意事项

1
2
1. 如果原先的数据库安装了第三方的扩展,请在升级的新版本服务器上也先安装好这些第三方扩展(contrib)
2. 相应的表空间配置也要与原先的一致

升级步骤

1
2
3
4
5
6
7
8
1. 以PG管理员的身份运行以下命令来备份所有数据库信息(包括用户,角色,等)
pg_dumpall > outfile
2. 源码安装PG,请参考安装步骤:
http://dreamer-yzy.github.io/2014/12/03/PostgreSQL%E5%9F%BA%E7%A1%80%E5%AD%A6%E4%B9%A0%EF%BC%88%E4%B8%80%EF%BC%89/
3. 恢复DB(记得将最新版本的DB服务器运行起来先),运行以下命令
psql -f outfile postgres

打完收工。

[翻译]在Ubuntu服务器上将PostgreSQL从9.1升级到9.3

原文地址

从不同的重大版本升级PostgreSQL(例如,从9.1升级到9.3),基本上有三种方法:

用 pg_dump 升级

如果可以的话,首先推荐的方法是使用新版本(9.3)进行二进制备份一个老(9.1)版本数据,然后在新版本创建的集群中恢复数据。

这种途径,通常,是比较慢的,但是也是最实用的。使它进行得更加快的方法之一是,使用并发。为了并行备份任务,你可以这样子做:

1
$ pg_dump --format=directory --jobs=4 --no-synchronized-snapshots --file=/path/to/mydump mydatabase

你可以为每个数据库进行这样子的备份,并调整 --jobs=4 参数值到任何值(测试从2到CPU核心数,并看看哪个更快)。当然,在备份期间,没人应该连接到数据库,任何的修改将会导致备份中断(因为非安全选项 --no-synchronized-snapshots

之后,你可以使用pg_restore来恢复到新的实例中:

1
2
$ createdb <options> -T template0 mydatabase
$ pg_restore --exit-on-error --jobs=4 --dbname=mydatabase /path/to/mydump

之后, 建议在数据库上执行ANALYZE命令:

1
$ vacuumdb --analyze-only mydatabase

(如果你可以等待时间的话,仅仅运行 --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和复制工具二者都非常熟悉的专家)

希望我可以帮到你。祝你好运。