Amazon Relational Database Service
用户指南 (API 版本 2014-10-31)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

升级 PostgreSQL 数据库引擎

如果 Amazon RDS 支持数据库引擎的新版本,您可以将您的数据库实例升级到新版本。有两种升级方式:主要版本升级和次要版本升级。

Amazon RDS 支持 PostgreSQL 数据库实例的主要和次要版本升级。

主要版本升级会包含不与现有应用程序向后兼容的数据库更改。因此,Amazon RDS 不会自动应用主要版本升级;您必须手动修改数据库实例。您可以通过修改实例来手动启动主要版本升级。不过,执行主要版本升级时,可以按推荐步骤进行操作。有关详细信息,请参阅 主要版本升级

您可以通过修改实例来手动启动次要版本升级。您也可以在创建或修改数据库实例时启用自动次要版本升级选项。这样做意味着实例在 Amazon RDS 测试并批准新版本后会自动升级。

AWS RDS 不自动升级 PostgreSQL 扩展。要升级扩展,您必须使用 ALTER EXTENSION UPDATE 命令。例如,要在将 PostgreSQL 数据库引擎从 9.4.x 升级到 9.5.x 时升级 PostGIS,您应运行以下命令:

ALTER EXTENSION POSTGIS UPDATE TO '2.2.2'

注意

如果在 Amazon RDS PostgreSQL 实例中运行 PostGIS 扩展,请确保在升级 PostgreSQL 之前按照 PostGIS 升级说明进行操作。

升级概览

如果您的备份保留期大于 0,Amazon RDS 会在主要和次要升级期间获取两份数据库快照。第一个数据库快照是数据库实例在进行任何升级更改前的。如果无法完成数据库的升级,那么,就可以恢复此快照,创建一个运行旧版本的数据库实例。第二个数据库快照是在升级完成后制作的。

注意

如果您将数据库实例的备份保留期设置为大于 0 的数字,则 Amazon RDS 只需创建数据库快照。要更改您的备份保留期,请参阅 修改运行 PostgreSQL 数据库引擎的数据库实例

升级完成后,您无法恢复为之前版本的数据库引擎。如果要返回之前的版本,则需要还原在升级之前创建的数据库快照,以此创建新的数据库实例。

如果数据库实例在多可用区部署中,则同时升级主数据库实例和备用数据库实例。主实例和备用数据库实例将同时升级,在此期间服务会中断,直到升级完成。

主要版本升级

主要版本升级可包含不与数据库的以前版本向后兼容的数据库更改。该功能会导致现有应用程序无法正常工作。因此,Amazon RDS 不会自动应用主要版本升级;您必须手动修改数据库实例来执行主要版本升级。在将升级应用到生产数据库实例之前,您应该彻底地测试任何升级,确保您的应用程序可正常工作。我们推荐的最佳实践是,在您根据数据库快照还原的实例上执行主要版本升级。

Amazon RDS 支持在以下版本中就地升级:

  • PostgreSQL 9.3.x 数据库实例升级到 PostgreSQL 9.4.x 数据库实例

  • PostgreSQL 9.4.x 数据库实例升级到 PostgreSQL 9.5.x 数据库实例

  • PostgreSQL 9.5.x 数据库实例升级到 PostgreSQL 9.6.x 数据库实例

  • PostgreSQL 9.6.x 数据库实例升级到 PostgreSQL 10.x 数据库实例

Amazon RDS 使用 pg_upgrade 实用程序(位于 http://www.postgresql.org/docs/9.4/static/pgupgrade.html)安全升级您的实例。

由于在发布主要版本 9.4 后发布了 9.3 的一些 PostgreSQL 次要版本更新,您无法从版本 9.3.9 升级到 9.4.1,也无法从版本 9.3.10 升级到 9.4.1 或 9.4.4。

只读副本无法进行主要版本升级。源实例可进行主要版本升级,但所有只读副本仍作为先前引擎版本上的可读取节点。在源实例升级后,其只读副本不能再复制在源实例上执行的更改。我们建议您提升只读副本,或者在源实例升级到其他主要版本后删除并重新创建只读副本。

主要版本升级流程

我们建议在升级 Amazon RDS PostgreSQL 数据库实例时采用以下流程:

  1. 准备一个版本兼容的参数组 – 如果您使用的是自定义参数组,必须为新的数据库引擎版本指定默认参数组,或者为其创建自定义参数组。在完成升级后,将新的参数组与数据库实例关联需要重新启动客户启动的数据库。如果需要重新启动该实例来应用参数组更改,则该实例的参数组状态将显示 pending-reboot。可在 AWS 控制台中查看实例的参数组状态,或者用“describe”调用查看,例如 describe-db-instances

  2. 检查是否有不支持的使用方式:

    1. 准备的事务 – 在尝试升级前,提交或回滚所有打开的已准备事务。

      您可以使用以下查询确认您的实例上是否没有打开的已准备事务:

      SELECT count(*) FROM pg_catalog.pg_prepared_xacts;
    2. line数据类型 – 如果您正在升级 RDS PostgreSQL 9.3 实例,则必须在尝试升级前取消使用所有 line 数据类型,因为在 9.4 版之前 PostgreSQL 中未完全实施 line 数据类型。

      您可以通过对将升级的每个数据库使用以下查询,验证每个数据库中是否没有使用 line 数据类型:

      SELECT count(*) FROM pg_catalog.pg_class c, pg_catalog.pg_namespace n, pg_catalog.pg_attribute a WHERE c.oid = a.attrelid AND NOT a.attisdropped AND a.atttypid = 'pg_catalog.line'::pg_catalog.regtype AND c.relnamespace = n.oid AND n.nspname !~ '^pg_temp_' AND n.nspname !~ '^pg_toast_temp_' AND n.nspname NOT IN ('pg_catalog', 'information_schema');

      注意

      要列出实例上的所有数据库,请使用以下查询:

      SELECT d.datname FROM pg_catalog.pg_database d WHERE d.datallowconn = true;
    3. Reg* 数据类型 – 在尝试升级前取消使用所有 reg* 数据类型,因为这些数据类型包含的信息在 pg_upgrade 操作中无法保留。reg* 数据类型的使用不能升级,regtyperegclass 除外。请在尝试升级前取消所有对该数据类型的使用。

      您可以使用以下查询验证每个数据库中是否没有使用不支持的 reg* 数据类型:

      SELECT count(*) FROM pg_catalog.pg_class c, pg_catalog.pg_namespace n, pg_catalog.pg_attribute a WHERE c.oid = a.attrelid AND NOT a.attisdropped AND a.atttypid IN ('pg_catalog.regproc'::pg_catalog.regtype, 'pg_catalog.regprocedure'::pg_catalog.regtype, 'pg_catalog.regoper'::pg_catalog.regtype, 'pg_catalog.regoperator'::pg_catalog.regtype, 'pg_catalog.regconfig'::pg_catalog.regtype, 'pg_catalog.regdictionary'::pg_catalog.regtype) AND c.relnamespace = n.oid AND n.nspname NOT IN ('pg_catalog', 'information_schema');

    在升级实例之前执行 VACUUM 操作。在您升级到不同主要版本时,pg_upgrade 实用程序会对每个数据库执行 vacuum 操作。如果您没有执行过 VACUUM 操作,则升级过程可能会需要更长时间,从而导致您 RDS 实例的停机时间延长。

  3. 试验性运行主要版本升级。我们强烈建议您先使用生产数据库的副本测试主要版本升级,然后再对生产数据库真正执行升级。要创建副本测试实例,您可以从最近的快照还原数据库,或通过时间点还原将数据库还原到最近的可还原时间。完成主要版本升级以后,应考虑利用相似的工作负载在升级后的数据库上测试您的应用程序,以验证一切是否工作正常。验证升级之后,您可以删除此测试实例。

  4. 我们建议您在执行主要版本升级前执行备份,以便为您的数据库获得一个已知的还原点。请注意,我们在升级前后均会创建数据库实例的数据库快照。

  5. 升级您的生产实例。如果试验性运行主要版本升级获得成功,您现在就可以放心地升级您的生产数据库。

您可以使用 Amazon RDS 查看 pg_upgrade 实用程序生成的两个日志:pg_upgrade_internal.logpg_upgrade_server.log。Amazon RDS 会在这些日志的文件名中附加时间戳。您可以像查看其他任何日志一样查看这些日志。

您不能通过执行时间点还原将实例还原到升级过程中的某一时间点。在升级过程中,RDS 会在开始执行升级后自动备份实例。您可以通过执行时间点还原,将实例还原到实例自动备份完成之后、升级操作开始之前的时间。

在主要版本升级过程中,将会重命名 publictemplate1 数据库以及实例上每个数据库中的 public 架构。这些对象将显示在日志中,同时附加了它们的原始名称和随机字符串。附加字符串的目的是在主要版本升级过程中保留 localeowner 等自定义设置。升级完成后,对象被重命名回它们的原始名称。

注意

完成升级后,您应运行查询 ANALYZE 操作来刷新 pg_statistic 表。

PostgreSQL 的自动次要版本升级

如果 Amazon RDS 已测试和批准某个次要升级,并且您启用了自动次要版本升级选项,则次要版本升级将自动进行。在所有其他情况下,您必须手动修改数据库实例才能执行次要版本升级。如果在创建或修改数据库实例时启用自动次要版本升级选项,您可以让实例在 Amazon RDS 测试并批准新版本后自动升级。

如果 PostgreSQL 数据库实例使用只读副本,则必须先升级所有只读副本,然后再升级源实例。如果数据库实例在多可用区部署中,则同时升级主副本和备用副本,并且直到升级完毕后实例才可用。

手动升级 PostgreSQL 数据库实例

有关手动或自动升级 PostgreSQL 数据库实例的信息,请参阅升级数据库实例引擎版本