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

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

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

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

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

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

主要版本升级。

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

次要版本升级

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

有关数据库引擎版本和弃用数据库引擎版本策略的更多信息,请参阅 Amazon RDS 常见问题中的数据库引擎版本

升级 PostgreSQL 概述

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

使用 Amazon Web Services Management Console 升级数据库实例时,它会显示数据库实例的有效升级目标。您还可以使用以下 Amazon CLI 命令来标识数据库实例的有效升级目标:

对于 Linux、macOS 或 Unix:

aws rds describe-db-engine-versions \ --engine postgres \ --engine-version version-number \ --query "DBEngineVersions[*].ValidUpgradeTarget[*].{EngineVersion:EngineVersion}" --output text

对于 Windows:

aws rds describe-db-engine-versions ^ --engine postgres ^ --engine-version version-number ^ --query "DBEngineVersions[*].ValidUpgradeTarget[*].{EngineVersion:EngineVersion}" --output text

例如,要标识 PostgreSQL 版本 10.11 数据库实例的有效升级目标,请运行以下 Amazon CLI 命令:

对于 Linux、macOS 或 Unix:

aws rds describe-db-engine-versions \ --engine postgres \ --engine-version 10.11 \ --query "DBEngineVersions[*].ValidUpgradeTarget[*].{EngineVersion:EngineVersion}" --output text

对于 Windows:

aws rds describe-db-engine-versions ^ --engine postgres ^ --engine-version 10.11 ^ --query "DBEngineVersions[*].ValidUpgradeTarget[*].{EngineVersion:EngineVersion}" --output text

如果您的备份保留期大于 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 数据库实例升级到下一个主要版本时,与数据库实例关联的任何只读副本也会升级到下一个主要版本。在某些情况下,您可以在升级时跳至更高的主要版本。如果跳过升级主要版本,则只读副本也会升级到该目标主要版本。跳过其他主要版本升级到版本 11 有一定的限制。您可以在 如何执行主要版本升级 中所述的步骤中找到详细信息。

PostgreSQL 引擎升级期间大多数 PostgreSQL 扩展都不会升级。这些扩展必须单独升级。有关更多信息,请参阅 升级 PostgreSQL 扩展

通过运行以下 Amazon CLI 查询,您可以找出哪些主要版本适用于您的 RDS for PostgreSQL 数据库实例:

aws rds describe-db-engine-versions --engine postgres --engine-version your-version --query "DBEngineVersions[*].ValidUpgradeTarget[*].{EngineVersion:EngineVersion}" --output text

下表总结了此查询结果的所有可用版本。已弃用的版本未列出。如果表中未列出您的当前版本,我们建议您执行次要版本升级,直到您的实例处于表中列出的版本级别,然后为该版本执行主要版本升级。有关 RDS for PostgreSQL 9.6 弃用的更多信息,请参阅 弃用 PostgreSQL 版本 9.6

如何执行主要版本升级

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

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

  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. 处理逻辑复制槽:如果实例有逻辑复制槽,则无法进行升级。逻辑复制插槽通常用于 Amazon DMS 迁移,以及将表从数据库复制到数据湖、BI 工具和其他目标。升级之前,请确保知道正在使用的逻辑复制槽的用途,并确认可以将其删除。如果逻辑复制槽仍在使用中,则不应将其删除,但也无法继续升级。

    如果不需要逻辑复制槽,则可以使用以下 SQL 将其删除:

    SELECT * FROM pg_replication_slots; SELECT pg_drop_replication_slot(slot_name);
  5. 处理只读副本 – 还会升级区域内只读副本以及主数据库实例。

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

    升级过程将根据只读副本的当前参数组重新创建副本的参数组。只有在升级完成后,才能通过修改只读副本将自定义参数组应用于只读副本。

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

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

  7. 在主要版本升级之前更新某些扩展 – 如果打算在升级时跳过主要版本,您需要在执行主要版本升级之前更新某些扩展。从版本 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 扩展”。

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

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

  9. 删除未知数据类型 – 根据目标版本删除 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';
  10. 执行升级试运行 – 我们强烈建议您在生产数据库的副本上测试主要版本升级,然后再尝试在生产数据库上进行升级。要创建副本测试实例,您可以从最近的快照还原数据库,也可以通过时间点还原将数据库还原到最近的可还原时间。有关更多信息,请参阅 从快照还原将数据库实例还原到指定时间。有关执行升级的详细信息,请参阅 手动升级引擎版本

    请注意,在将版本 9.6 数据库实例升级到版本 10 时,PostgreSQL 10 会默认启用并行查询。您可以将测试数据库实例上的 max_parallel_workers_per_gather 参数更改为 2,从而在升级之前测试并行度的影响。

    注意

    default.postgresql10 数据库参数组中,max_parallel_workers_per_gather 参数的默认值为 2。

    有关更多信息,请参阅 PostgreSQL 文档中的并行查询。要在版本 10 上禁用并行,请将 max_parallel_workers_per_gather 参数设置为 0。

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

    注意

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

  11. 如果升级失败并出现预检查过程错误,请解决这些问题 – 在主要版本升级过程中,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.
  12. 如果在升级数据库时只读副本升级失败,解决问题 – 将失败的只读副本置于 incompatible-restore 状态并终止数据库实例上的复制。删除该只读副本,并根据升级后的主实例重新创建只读副本。

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

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

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

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

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

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

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

  14. 运行 ANALYZE 操作以刷新 pg_statistic 表。您应该为所有 PostgreSQL 数据库实例上的每个数据库执行此操作。在主要版本升级期间不会传输优化程序统计数据,因此您需要重新生成所有统计数据,避免出现性能问题。运行不带任何参数的命令,为当前数据库中的所有常规表生成统计数据,如下所示:

    ANALYZE VERBOSE

    VERBOSE 标记为可选项,可用于显示进度。有关更多信息,请参阅 PostgreSQL 文档中的 ANALYZE

    注意

    升级后在系统上运行 ANALYZE,避免出现性能问题。

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

  • 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 命令确定特定 Amazon 区域中指定 PostgreSQL 次要版本的当前自动次要升级目标版本。

对于 Linux、macOS 或 Unix:

aws rds describe-db-engine-versions \ --engine postgres \ --engine-version minor-version \ --region region \ --query "DBEngineVersions[*].ValidUpgradeTarget[*].{AutoUpgrade:AutoUpgrade,EngineVersion:EngineVersion}" \ --output text

对于 Windows:

aws rds describe-db-engine-versions ^ --engine postgres ^ --engine-version minor-version ^ --region region ^ --query "DBEngineVersions[*].ValidUpgradeTarget[*].{AutoUpgrade:AutoUpgrade,EngineVersion:EngineVersion}" ^ --output text

例如,以下 Amazon CLI 命令可确定美国东部(俄亥俄)Amazon 区域 (us-east-2) 中 PostgreSQL 次要版本 10.11 的自动次要升级目标。

对于 Linux、macOS 或 Unix:

aws rds describe-db-engine-versions \ --engine postgres \ --engine-version 10.11 \ --region us-east-2 \ --query "DBEngineVersions[*].ValidUpgradeTarget[*].{AutoUpgrade:AutoUpgrade,EngineVersion:EngineVersion}" \ --output table

对于 Windows:

aws rds describe-db-engine-versions ^ --engine postgres ^ --engine-version 10.11 ^ --region us-east-2 ^ --query "DBEngineVersions[*].ValidUpgradeTarget[*].{AutoUpgrade:AutoUpgrade,EngineVersion:EngineVersion}" ^ --output table

输出类似于以下内容。

---------------------------------- | DescribeDBEngineVersions | +--------------+-----------------+ | AutoUpgrade | EngineVersion | +--------------+-----------------+ | False | 10.12 | | False | 10.13 | | False | 10.14 | | False | 10.15 | | False | 10.16 | | True | 10.17 | | False | 10.18 | | False | 11.6 | | False | 11.7 | | False | 11.8 | | False | 11.9 | | False | 11.10 | | False | 11.11 | | False | 11.12 | | False | 11.13 | +--------------+-----------------+

在此示例中,AutoUpgrade 值对于 PostgreSQL 版本 10.17 为 True。因此,自动次要升级目标是 PostgreSQL 版本 10.17,它在输出中突出显示。

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

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

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

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

注意

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

升级 PostgreSQL 扩展

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

注意

对于 PostGIS 扩展,请务必遵循 PostGIS 文档中的 PostGIS 升级说明来更新该扩展。对于 pg_repack 扩展,先删除该扩展,然后在升级后的数据库实例中创建新版本。有关更多信息,请参阅 pg_repack 文档中的安装 pg_repack

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

ALTER EXTENSION extension_name UPDATE TO 'new_version'

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

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

SELECT * FROM pg_extension;

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

SELECT * FROM pg_available_extension_versions;