pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
本节讨论如何把数据库数据从一个PostgreSQL版本迁移到更新的版本。软件安装过程本身不是本节的主题;相关细节见第 15 章。
PostgreSQL大版本由版本号的前两组数字表示,例如 8.4。PostgreSQL小版本由第三组数字表示,例如 8.4.2 是 8.4 的第二个小版本。小版本从不会更改内部存储 格式,并且总是与同一大版本号中较早和较晚的小版本兼容,例如 8.4.2 与 8.4、8.4.1 和 8.4.6 兼容。要在兼容的版本之间更新,只需在服务器停机时替换可执行文件并重启服务器即可。数据目录保持不变——小版本升级就这么简单。
对PostgreSQL的大版本来说,内部数据存储格式可能发生变化,从而使升级复杂化。把数据迁移到新大版本的传统方法是转储并重新加载数据库。其他一些测试较少的方法也可用,下文将有讨论。
新大版本通常还会引入一些用户可见的不兼容性,因此可能需要修改应用程序。谨慎的用户会希望在完全切换之前在新版本上测试其客户端应用程序;因此,同时安装新旧两个版本往往是个好主意。测试PostgreSQL大版本升级时,应考虑以下几类可能的变化:
供管理员监控和控制服务器的功能在各大版本中常常会变化和改进。
典型情况是新增 SQL 命令能力而不改变行为,除非发行说明中特别提到。
典型情况是像libpq这样的库只增加新功能,除非发行说明中特别提到。
系统目录的变化通常只影响数据库管理工具。
这涉及后端函数 API(以 C 语言编写)的变化。此类变化会影响引用服务器深处后端函数的代码。
要从一个大版本的PostgreSQL转储数据并载入到另一个大版本,必须使用pg_dump等逻辑转储方法;文件级备份方法不能工作。(系统中有检查防止你在不兼容版本的PostgreSQL上使用数据目录,因此在数据目录上尝试启动错误版本的服务器不会造成太大损害。)
建议使用新版本PostgreSQL的pg_dump和pg_dumpall程序,以利用这些程序中可能已实现的增强。当前版本的转储程序可以读取从 7.0 起任何服务器版本的数据。
停机时间最短的做法是把新服务器安装到不同目录,并让旧服务器和新服务器在不同端口上并行运行。然后可以用类似下面的命令:
pg_dumpall -p 5432 | psql -d postgres -p 6543
来传输数据。如果愿意,也可以使用中间文件。然后可以关闭旧服务器,并用旧服务器使用的端口启动新服务器。务必确保在开始运行pg_dumpall之后旧数据库不再被更新,否则会丢失那些更新。有关如何禁止访问,见第 19 章。
如果无法或不想并行运行两个服务器,可以在安装新版本之前先执行备份步骤,然后关闭旧服务器、把旧版本移开、安装新版本、启动新服务器并恢复数据。例如:
pg_dumpall > backup pg_ctl stop mv /usr/local/pgsql /usr/local/pgsql.old # Rename any tablespace directories as well cd ~/postgresql-9.0.23 gmake install initdb -D /usr/local/pgsql/data postgres -D /usr/local/pgsql/data psql -f backup postgres
有关启动和停止服务器的方式及其他细节,见第 17 章。安装说明会提示执行这些步骤的合适时机。
把旧安装“移开”后,它可能不再能完全正常使用。有些可执行程序中包含指向各种已安装程序和数据文件的绝对路径。这通常不是大问题,但如果计划并行使用两个安装一段时间,应在构建时给它们分配不同的安装目录。(只要把包含已安装文件的所有子目录一起移动,这个问题在PostgreSQL 8.0 及更高版本中已得到解决;例如,如果/usr/local/postgres/bin/移到/usr/local/postgres.old/bin/,那么/usr/local/postgres/share/也必须移到/usr/local/postgres.old/share/。在 8.0 之前的版本中,像这样移动安装不能工作。)
contrib程序pg_upgrade允许把安装从一个大PostgreSQL版本就地迁移到下一个版本。请记住,这种方法不能提供同时运行旧版本和新版本的机会。此外,pg_upgrade经受的实际考验远少于pg_dump,因此强烈建议先做好最新的备份,以防出现问题。
也可以使用某些复制方法(例如Slony)来创建一个运行更新版本PostgreSQL的备服务器。备服务器可以与主服务器在同一台计算机上,也可以在不同计算机上。一旦它与主服务器(运行旧版本PostgreSQL)同步完毕,就可以切换主备,让备服务器成为主服务器并关闭旧数据库实例。这样的切换只会带来几秒钟的升级停机时间。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。