24.4. 版本间迁移

这一章讨论怎样把你的迁移数据库数据从一个PostgreSQL释放到一个新的中。 该软件安装程序per se不是本节的主题;这些细节都在Chapter 15

代表PostgreSQL主要版本的版本号是前两个数字组,例如,8.4。 代表PostgreSQL次要版本的版本号是前三个数字组,例如,8.4.2是8.4版本的第二个次要版本。 次要版本绝不改变内部存储格式,以及总是总是兼容较早和较晚一些主要版本号的次要版本,比如,8.4.2兼容 8.4,8.4.1和8.4.6。在两个兼容版本之间更新,当服务器关闭和重启的时候你只需要更新执行文件。数据目录 保持不变—次要升级就那么简单。

为了major释放PostgreSQL,内部数据存储格式如有变更,这样升级就会复杂。 移动数据到一个新的主要版本的传统方法是转储和重载数据库。另外,less-well-tested可能是 可用的,就像下面讨论的。

新的主要版本也通常介绍一些用户可见的不兼容性,所以应用编程可能被要求改变。谨慎的用户将会想要 在交换完全之前在新主要版本上测试他们的客户端应用程序;因此,成立同时安装新的和旧的版本通常是个好主意。 在测试PostgreSQL主要升级的时候,考虑到可能出现的变化以下几类:

管理

为管理员提供去监听和掌握服务器的可用功能在每个主要版本里经常改变和提升。

SQL

通常这包含新的SQL命令指挥能力和不改变行为,除非版本说明中特别提到。

API库

通常像libpq的库只增加新的功能,除非在在版本说明中提到。

系统目录

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

服务器C语言API

这涉及到在后端功能的API的变化,那些用C语言编写的功能。这样变化影响那些引用服务器深处的后端功能的代码。

24.4.1. 迁移数据通过pg_dump

PostgreSQL的主要版本里转储数据和用另外的数据重载这个版本, 你必须用pg_dump;文件系统级别的备份方法将不起作用。(检查到位,防止你使用不兼容的PostgreSQL版本数据目录, 所以在数据目录上试着启动错误的服务器版本不会造成很大的伤害。)

我们建议你使用新版本的pg_dumppg_dumpall以便利用新版本的新特性和功能。 目前版本的转储程序最老可以支持到7.0版本的服务器。

最短停业时间可以这样实现: 把新服务器安装在不同的目录然后同时在不同端口运行新旧服务器。 这样你就可以用类似:

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

这样的命令转移数据,或者用你选择的过渡文件也可以。 接着就可以关闭老服务器然后在旧端口启动新服务器。 你要确保在你运行完pg_dumpall之后没有更新旧数据库, 否则你显然会丢失那些数据。参阅Chapter 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.4
gmake install
initdb -D /usr/local/pgsql/data
postgres -D /usr/local/pgsql/data
psql -f backup postgres

参阅Chapter 17里面启动和停止服务器以及其它的细节信息。 安装指导里面有执行这些步骤的建议。

Note: 当你"把旧的安装移走"之后,它可能就不再可以毫无问题地使用了。 安装的某些可执行程序包含各种安装的程序和数据文件的绝对路径信息。 这通常算不上什么问题,但是如果你计划并行使用两个安装一段时间, 你应该在编译的时候给它们赋不同的安装目录。 (这个问题在PostgreSQL8.0和更新的版本里是可以纠正的, 只要你移动所有的子目录中包含安装文件; 例如,如果/usr/local/postgres/bin/goes to /usr/local/postgres.old/bin/, 则 /usr/local/postgres/share/ 必须go to /usr/local/postgres.old/share/。在8.0之前的版本像这样的移动安装将无法正常工作。)

24.4.2. 其他数据迁移方法

contrib程序pg_upgrade 允许安装被就地迁移从一个主要PostgreSQL版本到下一个。记住,这个方法不为同时运行的新老版本提供任何范围。 pg_upgradepg_dump需要更少实战检验,所以拥有最新的备份 强烈建议在某种情况下出错。

它也有可能使用某些复制方法,就像Slony,创建一个PostgreSQL更新版本的备用服务器。 备用可以在同一个或不同的电脑上。一旦它与主服务器同步(运行较旧的PostgreSQL版本),你可以交换 master和使master待机和关闭旧的数据库实例。这样为升级的开关停机时间只有几秒钟。