17.6. 升级一个 PostgreSQL 集群

本节讨论怎样从一个PostgreSQL发布到一个新的发布升级你的数据库数据。

PostgreSQL主要版本由前两个数字的版本号代表,例如8.4。 PostgreSQL主要版本由前三个数字的版本号代表,例如8.4.2是第二个8.4的维护性发布。 维护性发布从不改变内部存储器格式并且总是与之前的和之后的相同维护性版本号的维护性版本兼容, 例如8.4.2兼容8.4,8.4.1和8.4.6。要在兼容的版本之间更新,在服务器关闭时简单的替换可执行文件并且重启服务器就可以。 数据目录保留不改变—维护性升级就这么简单。

PostgreSQL主要发布,内部数据存储格式是改变的主题, 因此并发升级。移动数据到一个新的主要版本的传统的方法是转储并重新加载数据库。 就像下面描述的那样,其他方法也适用。

新的主要版本还通常介绍一些用户可见的不兼容性,所以可能需要改变应用程序。 所有用户可见的改变都在版本注释里面列出(附录 E); 尤其注意章节标签"Migration"。如果你正在几个主要版本间升级, 一定要阅读每个中间版本的版本注释。

谨慎的用户可能想在全面切换前在新的版本上测试他们的客户端应用;因此, 设置并发新旧版本的安装是一个好的主意。当测试一个PostgreSQL的主要升级时, 考虑下列类别的可能变化:

Administration

在每个主要版本中,管理员对服务器可用的监视和控制功能通常会改变和增加。

SQL

通常包含新的SQL命令功能而不是行为上的改变,除非在版本注释里面特别提到。

Library API

libpq这样典型的库只添加新的函数,同样除非在版本注释里面特别提到。

System Catalogs

系统目录变更通常只影响数据库管理工具。

Server C-language API

这涉及到后端函数API的变化,它是用C编程语言写的。这样的改变影响引用深层服务器后端函数的编码。

17.6.1. 通过pg_dump升级数据

要从PostgreSQL的一个主要版本转储数据并加载到另一个版本,必须使用pg_dump; 文件系统级备份方法将不能使用。(有检查防止你用不兼容的PostgreSQL 版本使用数据目录,所以在一个数据目录上尝试启动错误的服务器版本也不会造成大的伤害。)

建议使用新版本的PostgreSQL pg_dumppg_dumpall程序, 利用这些程序可能的增强功能。当前转储程序版本可以从一直到7.0的任何服务器版本中读取数据。

这些说明假设现有的安装在/usr/local/pgsql目录下,数据区域在/usr/local/pgsql/data 目录下。适当的替代你的路径。

  1. 如果做一个备份,确保数据库没有被更新。这不影响备份的完整性,但是将不会包括改变了的数据。 如果必须要这样做,那么编辑文件/usr/local/pgsql/data/pg_hba.conf(或相等的)里的权限, 设置除了你之外的人都不可以访问。参阅第 19 章获取关于访问控制的更多信息。

    备份你的数据库安装,输入:

    pg_dumpall > outputfile

    如果您需要保存OID(例如当使用它们作为外键时),那么在运行pg_dumpall 时使用-o选项。

    要做备份,可以使用当前运行版本的pg_dumpall命令。然而, 要获取最佳结果尝试使用PostgreSQL 9.3.1的 pg_dumpall命令,因为这个版本包含bug修复和对老版本的改进。 虽然在你还没有安装新版本时这个建议看起来很特别,但是如果你打算同时安装新版本和老版本, 那么这个建议是可行的。在这种情况下你可以正常完成安装然后传送数据。这也将减少停机时间。

  2. 关闭旧的服务器:

    pg_ctl stop

    系统上的PostgreSQL在开机时启动,可能有一个启动文件将完成同样的事情。 例如,在Red Hat Linux系统上,可能发现这个在工作:

    /etc/rc.d/init.d/postgresql stop

    参阅第 17 章获取关于启动和停止服务器的详细信息。

  3. 如果从备份中恢复,重命名或者删除旧的安装目录。重命名目录是个好主意,而不是删掉它, 以防你有困难并且需要恢复它。记住,目录可能会占用大量磁盘空间。要重命名目录,使用像下面这样的命令:

    mv /usr/local/pgsql /usr/local/pgsql.old

    (一定要把目录作为一个单元,所以相对路径保持不变。)

  4. 第 15.4 节. 中概述的那样安装PostgreSQL新版本。

  5. 如果需要创建一个新的数据库集群。请记住,当登陆到特定的数据库用户账户 (如果已经升级,那么已经有这个账户了)时必须执行下面的命令。

    /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data

  6. 恢复以前的pg_hba.conf和任意postgresql.conf修改。

  7. 启动数据库服务器,再次使用特定的数据库用户账户:

    /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data

  8. 最终,从备份中恢复数据:

    /usr/local/pgsql/bin/psql -d postgres -f outputfile

    使用新的 psql

最少的停机时间可以通过在一个不同的目录下安装新的服务器,并且并行在不同的端口运行旧的和新的服务器来达到。 然后就可以使用类似:

pg_dumpall -p 5432 | psql -d postgres -p 5433

来传送数据。

17.6.2. Non-Dump 升级方法

pg_upgrade模块允许安装从一个主PostgreSQL版本到下一个的迁移。 升级可以在几分钟内完成。

还可以使用特定的复制方法,比如Slony,创建一个更新的PostgreSQL 版本备用服务器。这是可能的,因为Slony支持不同PostgreSQL主版本间的复制。 备机可以在相同的计算机上,也可以在不同的计算机上。一旦它与主服务器(在老PostgreSQL 版本上运行)同步,就可以切换主机使备机成为主机,并立即关闭旧的数据库。这样的切换使升级只有几秒钟的关机时间。