pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
本节讨论如何把数据库数据从一个PostgreSQL发行版升级到较新的发行版。
PostgreSQL的主版本由版本号的前两组数字表示,例如 8.4。PostgreSQL的次版本由版本号的第三组数字表示,例如 8.4.2 就是 8.4 的第二个次版本。次版本从不改变内部存储格式,并且始终与同一主版本号中的更早和更晚次版本兼容,例如 8.4.2 与 8.4、8.4.1 和 8.4.6 兼容。要在兼容版本之间更新,只需在服务器关闭时替换可执行文件,然后重启服务器即可。数据目录保持不变 — 次版本升级就是这么简单。
对于PostgreSQL的主版本,内部数据存储格式可能会发生变化,因此升级会复杂得多。将数据迁移到新的主版本的传统方法是转储并重新载入数据库,不过这可能比较慢。更快的方法是pg_upgrade。此外,也可以使用复制方法,如下所述。
新的主版本通常还会引入一些用户可见的不兼容变化,因此应用程序可能也需要做出修改。所有用户可见的变化都列在发行说明(附录 E)中;请特别留意标为"迁移(Migration)"的小节。如果你跨越多个主版本进行升级,请务必阅读每个中间版本的发行说明。
谨慎的用户会希望在完全切换之前,先在新版本上测试客户端应用。因此,同时安装旧版本和新版本通常是个好主意。测试PostgreSQL主版本升级时,可以考虑以下几类可能的变化:
管理员可用于监控和控制服务器的功能,在每个主版本中常常都会变化并有所增强。
通常这意味着 SQL 命令能力会增加,而行为不会变化,除非发行说明中特别提到。
通常像libpq这样的库只会增加新功能,除非发行说明中特别说明。
系统目录的变化通常只影响数据库管理工具。
这涉及使用 C 语言编写的后端函数 API 的变更。这类变更会影响那些深入引用服务器内部后端函数的代码。
一种升级方法是从某个主版本的 PostgreSQL 转储数据,再在另一个版本中重新载入。要这样做,必须使用逻辑备份工具,例如 pg_dumpall;文件系统级备份方法不起作用。(系统中有相应检查,会阻止你在不兼容版本的 PostgreSQL 上使用数据目录,因此尝试用错误版本的服务器启动某个数据目录,不会造成严重损害。)
建议使用来自较新版本 PostgreSQL 的 pg_dump 和 pg_dumpall 程序,以利用这些程序可能包含的改进。当前版本的转储程序可以读取从 7.0 起任意服务器版本的数据。
以下说明假定你现有的安装位于/usr/local/pgsql目录下,数据区域位于/usr/local/pgsql/data。请根据实际情况替换成你的路径。
如果是在制作备份,请确认数据库此时没有正在进行更新。更新操作不会影响备份的完整性,但那些变更当然不会包含在备份中。必要时,可修改/usr/local/pgsql/data/pg_hba.conf(或等效文件)中的访问权限,禁止除你之外的其他人访问数据库。有关访问控制的更多信息见第 19 章。
pg_dumpall > outputfile
制作备份时,你可以使用当前正在运行版本中的pg_dumpall命令,详见第 24.1.2 节。不过,为了获得最佳结果,尽量使用PostgreSQL 9.4.26 自带的pg_dumpall命令,因为这一版本相较旧版本包含了缺陷修复和改进。这个建议看起来可能有些反常,因为你这时还没有安装新版本;但如果你计划让新旧版本并行安装,遵循这一建议是明智的。在那种情况下,你可以先正常完成新版本安装,稍后再迁移数据,这样也能减少停机时间。
关闭旧服务器:
pg_ctl stop
在那些会在开机时自动启动PostgreSQL的系统上,可能已经有某个启动脚本能完成同样的工作。例如,在Red Hat Linux系统上,也许下面这条命令就可以:
/etc/rc.d/init.d/postgresql stop
有关服务器启动和停止的细节见第 17 章。
如果是从备份恢复,请重命名或删除旧的安装目录,前提是它不是按版本区分的目录。与其删除,不如重命名,这样如果你遇到问题需要回退,它仍然还在。请记住,该目录可能会占用相当可观的磁盘空间。要重命名该目录,可以使用类似下面的命令:
mv /usr/local/pgsql /usr/local/pgsql.old
(请确保把该目录作为一个整体移动,这样相对路径才会保持不变。)
安装新版本的 PostgreSQL,步骤见 第 15.4 节。
如有需要,创建一个新的数据库集簇。请记住,执行这些命令时必须登录到专用数据库用户账户(如果你正在升级,就已经拥有这个账户)。
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
恢复先前的pg_hba.conf,以及你对postgresql.conf所做的任何修改。
启动数据库服务器,同样要使用该专门的数据库用户账户:
/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
最后,使用以下命令从备份恢复数据:
/usr/local/pgsql/bin/psql -d postgres -f outputfile
这里应使用新版 psql。
若要把停机时间降到最低,可以把新服务器安装到不同目录中,并让新旧两个服务器在不同端口上并行运行。这样就可以使用类似下面的命令:
pg_dumpall -p 5432 | psql -d postgres -p 5433
来传输数据。
pg_upgrade模块允许把一次安装从一个PostgreSQL主版本就地迁移到另一个主版本。升级可在几分钟内完成,特别是在使用--link模式时更是如此。它需要执行与上面pg_dumpall方法类似的步骤,例如启动/停止服务器、运行initdb等。pg_upgrade的文档概述了所需步骤。
也可以使用某些复制方法,例如 Slony,创建一个运行较新版本 PostgreSQL 的备库。之所以可行,是因为 Slony 支持不同主版本 PostgreSQL 之间进行复制。该备库可以与旧服务器部署在同一台机器上,也可以部署在不同机器上。一旦它与主库(运行旧版本 PostgreSQL)同步,就可以切换主备角色,让备库成为主库,并关闭旧的数据库实例。这种计划内切换只会为升级带来几秒钟的停机时间。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。