升级适用于 Amazon RDS 的 PostgreSQL 数据库引擎 - Amazon Relational Database Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

升级适用于 Amazon RDS 的 PostgreSQL 数据库引擎

您可以为 PostgreSQL 数据库实例选择两种升级方式:

  • 操作系统更新 – 有时,为了应用安全修复或操作系统更改,Amazon RDS 可能需要更新数据库实例的基础操作系统。您可通过使用 RDS 控制台、Amazon Command Line Interface (Amazon CLI) 或 RDS API 来决定 Amazon RDS 何时应用操作系统更新。有关操作系统更新的更多信息,请参阅 应用数据库实例的更新

  • 数据库引擎升级 – 如果 Amazon RDS 支持数据库引擎的新版本,您可以将您的数据库实例升级到新版本。

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

主要版本升级。

主要版本升级会包含不与现有应用程序向后兼容的数据库更改。因此,您必须手动为数据库实例执行主要版本升级。您可以通过修改数据库实例来启动主要版本升级。但是,执行主要版本升级之前,我们建议您按照 为 PostgreSQL 选择主要版本升级 中所述的步骤操作。在主要版本升级期间,Amazon RDS 还会升级所有区域内只读副本以及主数据库实例。

次要版本升级

相比之下,次要版本升级仅包括与现有应用程序向后兼容的更改。您可以通过修改数据库实例来手动启动次要版本升级。您也可以在创建或修改数据库实例时启用自动次要版本升级选项。这样做意味着数据库实例在 Amazon RDS 测试并批准新版本后会自动升级。如果 PostgreSQL 数据库实例正在使用只读副本,则必须在升级源实例的次要版本之前升级所有只读副本。有关更多信息,请参阅PostgreSQL 的自动次要版本升级。有关手动执行次要版本升级的信息,请参阅手动升级引擎版本

升级 PostgreSQL 概述

为了安全地升级数据库实例,Amazon RDS 使用 PostgreSQL 文档中所述的 pg_upgrade 实用程序。

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

注意

仅当您将数据库实例的备份保留期设置为大于 0 的数字时,Amazon RDS 才会在升级过程中创建数据库快照。要更改您的备份保留期,请参阅 修改 Amazon RDS 数据库实例

升级主数据库实例时,所有区域内只读副本也会自动升级。升级工作流程开始后,副本实例会等待主数据库实例上的 pg_upgrade 成功完成。然后,主实例升级会等待副本实例升级完成。在升级完成之前,您会遇到中断。如果您有任何来自早期主要版本的旧副本,则它们不会升级。

如果数据库实例位于多可用区部署中,则同时升级主写入器数据库实例和备用数据库实例。同时升级写入器和备用数据库实例。

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

PostgreSQL 版本号

PostgreSQL 数据库引擎的版本编号序列如下所示:

  • 对于 PostgreSQL 版本 10 及更高版本,引擎版本号格式为主要版本.次要版本。主要版本号是版本号的整数部分。次要版本号是版本号的小数部分。

    主要版本升级会增加版本号的整数部分,例如从 10.次要版本 升级为 11.次要版本

  • 对于版本低于 10 的 PostgreSQL 版本,引擎版本号的格式为主要版本.主要版本.次要版本。主引擎版本号是版本号的整数和第一个小数点后的部分。例如,9.6 是一个主要版本。次要版本号是版本号的第三部分。例如,版本 9.6.12 中 12 是次要版本号。

    主要版本升级会增加版本号的主要版本部分。例如,从 9.6.12 升级到 10.11 是主要版本升级,其中 9.610 为主要版本号。

为 PostgreSQL 选择主要版本升级

主要版本升级可包含不与数据库的以前版本向后兼容的数据库更改。该功能会导致现有应用程序无法正常工作。

因此,Amazon RDS 不会自动应用主要版本升级。要执行主要版本升级,请手动修改数据库实例。在将升级应用到生产数据库实例之前,确保彻底地测试任何升级,验证您的应用程序是否正常工作。执行 PostgreSQL 主要版本升级时,我们建议您按照 如何执行主要版本升级 中所述的步骤操作。

您可以将 PostgreSQL 数据库升级到其下一个主要版本。从源 PostgreSQL 数据库版本升级时,您可以跳到更高的主要版本。如果跳过升级主要版本,则只读副本也会升级到该目标主要版本。下表列出源 PostgreSQL 数据库版本以及可供升级的关联目标主要版本。

注意

升级目标可以是与源次要版本同时发布的更高版本。

如果数据库使用 PostGIS 扩展,您不能跳过某些源到目标组合的主要版本。在这些情况下,请升级到最新的次要版本,然后升级到 PostgreSQL 12,最后升级到所需的目标版本。

跳过主要版本以升级到版本 11.x 的升级不支持 pgRouting 扩展。从版本 9.4.x、9.5.x 或 9.6.x 升级到版本 11.x 时,将跳过主要版本。可以删除 pgRouting 扩展,然后在升级后重新添加。

在 PostgreSQL 11 或更高版本中不支持 tsearch2chkpass 扩展。如果要升级到版本 11.x,请在升级之前删除这些扩展。

当前源版本 最新升级目标 首选的主要升级目标
12.6、12.5、12.4、12.3、12.2 13.2 13.2
11.11 13.2 13.2 12.6
11.10 13.1 13.1 12.6 11.11
11.9、11.8、11.7、11.6、11.5、11.4、11.2、11.1 12.6 12.6 11.11
10.16 13.2 13.2 12.6 11.11
10.15 13.1 13.1 12.5 11.11
10.14 12.4 12.4 11.11
10.13 12.3 12.3 11.11
10.12 12.2 12.2 11.11
10.11、10.10、10.9、10.7、10.6、10.5、10.4、10.3、10.1 11.11 11.11
9.6.21 13.2 13.2 12.6 11.11 10.16
9.6.20 13.1 13.1 12.5 11.10 10.16
9.6.19 12.4 12.4 11.9 10.16
9.6.18 12.3 12.3 11.8 10.16
9.6.17 12.2 12.2 11.7 10.16
9.6.16 11.6 11.6 10.16
9.6.15 11.5 11.5 10.16
9.6.14 11.4 11.4 10.16
9.6.12 11.2 11.2 10.16
9.6.11 11.1 11.1 10.16
9.6.10、9.6.9、9.6.8、9.6.6、9.6.5、9.6.3、9.6.2、9.6.1 10.16 10.16
9.5.25 12.6 12.6 11.11 10.16 9.6.21
9.5.24 12.5 12.5 11.10 10.16 9.6.21
9.5.23 12.4 12.4 11.9 10.16 9.6.21
9.5.22 12.3 12.3 11.8 10.16 9.6.21
9.5.21 12.2 12.2 11.7 10.16 9.6.21
9.5.20 11.6 11.6 10.16 9.6.21
9.5.19 11.5 11.5 10.16 9.6.21
9.5.18 11.4 11.4 10.16 9.6.21
9.5.16 11.2 11.2 10.16 9.6.21
9.5.15 11.1 11.1 10.16 9.6.21
9.5.14、9.5.13、9.5.12、9.5.12、9.5.10、9.5.9、9.5.9、9.5.7、9.5.6、9.5.4 9.6.21 9.6.21

要获取特定 Amazon 区域中的当前源版本的所有有效升级目标列表,请使用 describe-db-engine-versions CLI 命令。例如:

export REGION=eu-central-1 export ENDPOINT=https://rds.eu-central-1.amazonaws.com aws rds describe-db-engine-versions --engine postgres --region $REGION --endpoint $ENDPOINT --output text --query '*[].ValidUpgradeTarget[?IsMajorVersionUpgrade==`true`].{EngineVersion:EngineVersion}' --engine-version DB-current-version

如何执行主要版本升级

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

  1. 准备一个版本兼容的参数组 – 如果您使用的是自定义参数组,则您有两个选择。您可为新数据库引擎版本指定默认参数组。或者您可为新数据库引擎版本创建您自己的自定义参数组。

    如果您将新的参数组与数据库实例关联,请在升级完成后重启数据库。如果需要重新启动实例来应用参数组更改,则该实例的参数组状态将显示 pending-reboot。您可以在控制台中查看实例的参数组状态,或者使用描述命令(例如,describe-db-instances)来查看。

  2. 检查不受支持的数据库实例类 – 检查数据库的实例类是否与您要升级到的 PostgreSQL 版本兼容。有关更多信息,请参阅数据库实例类支持的数据库引擎

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

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

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

      SELECT count(*) FROM pg_catalog.pg_prepared_xacts;
    • Reg* 数据类型 – 在尝试升级前取消使用所有 reg* 数据类型。除了 regtyperegclass 以外,您不能升级 reg* 数据类型。pg_upgrade 实用工具不能保留这个数据类型,Amazon RDS 使用它来执行升级。

      要验证是否没有使用不支持的 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');

  4. 处理只读副本 – 还会升级区域内只读副本以及主实例。

    您无法单独升级只读副本。如果您可以单独升级,则可能会导致主实例和副本实例具有不同 PostgreSQL 主要版本的情况。但是,副本升级可能会增加主实例上的停机时间。为防止副本升级,请在开始升级过程之前将副本提升为独立实例或将其删除。

    升级过程将根据副本实例的当前参数组重新创建副本的参数组。只有在升级完成后,才能使用 modify-db-parameter-group CLI 命令将自定义参数组应用于副本。

    Virtual Private Cloud (VPC) 平台上的只读副本会升级,但 EC2-Classic 平台上的副本不会升级。升级过程完成后,任何 EC2-Classic 副本均保持复制终止状态。要将数据库实例从 EC2-Classic 平台移到 VPC 中,请参阅将不在 VPC 中的数据库实例移动到 VPC 中。有关更多信息,请参阅在 Amazon RDS 中使用 PostgreSQL 只读副本

  5. 执行备份 – 我们建议您在执行主要版本升级前执行备份,以便为您的数据库获得一个已知的还原点。如果您的备份保留期大于 0,则在升级之前和之后,升级过程会创建数据库实例的数据库快照。要更改您的备份保留期,请参阅 修改 Amazon RDS 数据库实例。要手动执行备份,请参阅 创建数据库快照

  6. 在主要版本升级之前更新某些扩展 – 如果打算在升级时跳过主要版本,您需要在执行主要版本升级之前 更新某些扩展。从版本 9.4.x、9.5.x 或 9.6.x 升级到版本 11.x 时,将会跳过主要版本。要更新的扩展包括:

    • address_standardizer

    • address_standardizer_data_us

    • postGIS

    • postgis_tiger_geocoder

    • postgis_topology

    为您使用的每个扩展运行以下命令。

    ALTER EXTENSION PostgreSQL-extension UPDATE TO 'new-version'

    有关更多信息,请参阅 升级 PostgreSQL 扩展

  7. 在主要版本升级之前删除某些扩展 – 跳过主要版本以升级到版本 11.x 的升级不支持更新 pgRouting 扩展。从版本 9.4.x、9.5.x 或 9.6.x 升级到版本 11.x 时,将会跳过主要版本。可以安全地删除 pgRouting 扩展,然后在升级后将其重新安装到兼容的版本中。有关您可以更新到的扩展版本,请参阅Amazon RDS 上支持的 PostgreSQL 扩展

    PostgreSQL 版本 11 或更高版本不再支持 tsearch2chkpass 扩展。如果要升级到版本 11.x,请在升级之前删除 tsearch2chkpass 扩展。

  8. 删除未知数据类型 – 根据目标版本删除 unknown 数据类型。

    PostgreSQL 版本 10 停止支持 unknown 数据类型。如果版本 9.6 数据库使用 unknown 数据类型,升级到版本 10 将显示错误消息,如下所示:

    Database instance is in a state that cannot be upgraded: PreUpgrade checks failed: The instance could not be upgraded because the 'unknown' data type is used in user tables.Please remove all usages of the 'unknown' data type and try again."

    要在数据库中查找 unknown 数据类型以便删除有问题的列或将其更改为支持的数据类型,请使用以下 SQL:

    SELECT DISTINCT data_type FROM information_schema.columns WHERE data_type ILIKE 'unknown';
  9. 执行升级试运行 – 我们强烈建议您在生产数据库的副本上测试主要版本升级,然后再尝试在生产数据库上进行升级。要创建副本测试实例,您可以从最近的快照还原数据库,也可以通过时间点还原将数据库还原到最近的可还原时间。有关更多信息,请参阅 从快照还原将数据库实例还原至指定时间。有关执行升级的详细信息,请参阅 手动升级引擎版本

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

    注意

    在主要版本升级过程中,您无法为实例执行时间点还原。Amazon RDS 执行升级之后,它会自动备份实例。您可以通过执行时间点还原,将实例还原到实例自动备份完成之后、升级操作开始之前的时间。

  10. 如果升级失败并出现预检查过程错误,请解决这些问题 – 在主要版本升级过程中,Amazon RDS for PostgreSQL 先运行预检查过程,以确定可能导致升级失败的任何问题。预检查过程检查实例上的所有数据库中的所有潜在的不兼容情况。

    如果预检查遇到问题,它将创建一个日志事件以指示升级预检查失败。预检查过程详细信息位于数据库实例的所有数据库的升级日志中(名称为 pg_upgrade_precheck.log)。Amazon RDS 在文件名后面附加一个时间戳。有关查看日志的详细信息,请参阅 使用 Amazon RDS 数据库日志文件

    如果副本升级在预检查时失败,则失败的副本上的复制将中断,并将该副本置于终止状态。删除该副本,并根据升级后的主实例重新创建新副本。

    解决预检查日志中确定的所有问题,然后重试主要版本升级。以下是一个预检查日志示例。

    ------------------------------------------------------------------------ Upgrade could not be run on Wed Apr 4 18:30:52 2018 ------------------------------------------------------------------------- The instance could not be upgraded from 9.6.11 to 10.6 for the following reasons.Please take appropriate action on databases that have usage incompatible with the requested major engine version upgrade and try the upgrade again. * There are uncommitted prepared transactions.Please commit or rollback all prepared transactions.* One or more role names start with 'pg_'.Rename all role names that start with 'pg_'. * The following issues in the database 'my"million$"db' need to be corrected before upgrading:** The ["line","reg*"] data types are used in user tables.Remove all usage of these data types. ** The database name contains characters that are not supported by RDS for PostgreSQL.Rename the database. ** The database has extensions installed that are not supported on the target database version.Drop the following extensions from your database: ["tsearch2"]. * The following issues in the database 'mydb' need to be corrected before upgrading:** The database has views or materialized views that depend on 'pg_stat_activity'.Drop the views.
  11. 如果在升级数据库时副本升级失败,解决问题 – 将失败的副本置于 incompatible-restore 状态并终止数据库实例上的复制。删除该副本,并根据升级后的主实例重新创建新副本。

    副本升级可能会因以下原因而失败:

    • 即使等待了一段时间,也无法跟上主实例。

    • 处于终端或不兼容的生命周期状态,如 storage-full、incompatible-restore 等。

    • 主实例升级开始后,在副本上运行了单独的次要版本升级。

    • 副本实例使用了不兼容的参数。

    • 副本实例无法与主实例通信以同步数据文件夹。

  12. 升级生产实例 – 在成功完成试运行主要版本升级后,您就可以放心地升级生产数据库了。有关更多信息,请参阅 手动升级引擎版本

在完成主要版本升级后,我们建议执行以下操作:

  • 运行 ANALYZE 操作以刷新 pg_statistic 表。

  • PostgreSQL 升级不会升级任何 PostgreSQL 扩展。要升级扩展,请参阅升级 PostgreSQL 扩展

  • (可选)使用 Amazon RDS 查看 pg_upgrade 实用程序生成的两个日志。它们是 pg_upgrade_internal.logpg_upgrade_server.log。Amazon RDS 会在这些日志的文件名中附加时间戳。您可以像查看其他任何日志一样查看这些日志。有关更多信息,请参阅使用 Amazon RDS 数据库日志文件

    您也可以将升级日志上传到 Amazon CloudWatch Logs 中。有关更多信息,请参阅 将 PostgreSQL 日志发布到 Amazon CloudWatch Logs

  • 要验证是否一切正常,请在升级的数据库上使用类似的工作负载测试应用程序。验证升级之后,您可以删除此测试实例。

PostgreSQL 的自动次要版本升级

如果在创建或修改数据库实例时启用自动次要版本升级选项,您可以自动升级数据库实例。

对于每个 RDS for PostgreSQL 主要版本,RDS 将一个次要版本指定为自动升级版本。在 Amazon RDS 测试并批准次要版本后,将在维护时段内自动进行次要版本升级。RDS 不会自动将发布的较新次要版本设置为自动升级版本。在 RDS 指定较新的自动升级版本之前,将会考虑一些条件,例如:

  • 已知的安全问题

  • PostgreSQL 社区版本中的错误

  • 发布次要版本后的整体队列稳定性

您可以使用以下 Amazon CLI 命令和脚本确定当前的自动升级次要版本。

aws rds describe-db-engine-versions --engine postgres | grep -A 1 AutoUpgrade| grep -A 2 true |grep PostgreSQL | sort --unique | sed -e 's/"Description": "//g'
注意

如果未返回任何结果,则没有可用和计划的自动次要版本升级。

如果满足以下条件,则会在维护时段内自动升级 PostgreSQL 数据库实例:

  • 数据库实例启用了自动次要版本升级选项。

  • 数据库实例运行的次要数据库引擎版本低于当前的自动升级次要版本。

有关更多信息,请参阅 自动升级次要引擎版本

注意

PostgreSQL 升级不会升级 PostgreSQL 扩展。要升级扩展,请参阅升级 PostgreSQL 扩展

升级 PostgreSQL 扩展

PostgreSQL 引擎升级不会升级大多数的 PostgreSQL 扩展。要在版本升级后更新扩展,请使用 ALTER EXTENSION UPDATE 命令。

注意

如果在 Amazon RDS PostgreSQL 数据库实例中运行 PostGIS 扩展,请确保在更新该扩展之前按照 PostGIS 文档中的 PostGIS 升级说明进行操作。

要升级扩展,请使用以下命令。

ALTER EXTENSION extension_name UPDATE TO 'new_version'

有关受支持的 PostgreSQL 扩展版本列表,请参阅 Amazon RDS 上支持的 PostgreSQL 扩展

要列出当前安装的扩展,请在以下命令中使用 PostgreSQL pg_extension 目录。

SELECT * FROM pg_extension;

要查看可用于安装的特定扩展版本的列表,请在以下命令中使用 PostgreSQL pg_available_extension_versions 视图。

SELECT * FROM pg_available_extension_versions;