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

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

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

主要版本升级会包含不与现有应用程序向后兼容的数据库更改。因此,您必须手动为数据库实例执行主要版本升级。您可以通过修改数据库集群来启动主要版本升级。但是,执行主要版本升级之前,我们建议您按照如何执行主要版本升级中所述的步骤操作。

相比之下,次要版本升级仅包括与现有应用程序向后兼容的更改。您可以通过修改数据库集群来手动启动次要版本升级。或者,您可以在创建或修改数据库集群时启用自动次要版本升级选项。这样做意味着数据库集群在 Aurora PostgreSQL 测试并批准新版本后会自动升级。有关更多信息,请参阅PostgreSQL 的自动次要版本升级。有关手动执行次要版本升级的信息,请参阅手动升级 Aurora PostgreSQL 引擎

配置为逻辑复制发布者或订阅者的 Aurora 数据库集群无法进行主要版本升级。有关更多信息,请参阅 使用 Aurora 的 PostgreSQL 逻辑复制

您可以执行以下 Aurora PostgreSQL 主要版本升级:

  • 从版本 9.6 次要版本 9.6.9 及更高版本升级到版本 10 次要版本 10.11 或更高版本。

  • 从版本 10 次要版本 10.7 及更高版本升级到版本 11 次要版本 11.7 或更高版本。

有关如何确定有效的升级目标,请参阅 确定要升级到的引擎版本

Aurora PostgreSQL 升级概述

主要版本升级可包含不与数据库的以前版本向后兼容的数据库更改。该功能会导致现有应用程序无法正常工作。因此,Amazon Aurora 不会自动应用主要版本升级。要执行主要版本升级,请手动修改数据库集群。

为了安全地升级数据库实例,Aurora PostgreSQL 使用 PostgreSQL 文档中所述的 pg_upgrade 实用程序。写入器升级完成后,每个读取器实例在自动升级到新的主要版本时都会出现短暂中断。

Aurora PostgreSQL 在升级开始之前生成数据库集群快照。如果要在升级完成后返回到以前的版本,则可以从升级之前创建的此快照还原数据库集群,也可以将数据库集群还原到升级开始之前的特定时间点。有关更多信息,请参阅 从数据库集群快照还原将数据库集群还原至指定时间

在主要版本升级过程中,会分配一个克隆的卷。如果升级由于某种原因(例如由于架构不兼容)而失败,Aurora PostgreSQL 将使用此克隆回滚升级。请注意,当分配的源卷克隆超过 15 个时,后续克隆将成为完整副本并且需要更长的时间。这可能会导致升级过程花费更长的时间。如果 Aurora PostgreSQL 回滚升级,请注意以下事项:

  • 您可能会看到原始卷和在升级过程中分配的克隆卷的账单条目和指标。在集群备份保留时段超过升级时间之后,Aurora PostgreSQL 将清理额外的卷。

  • 此集群中的下一个跨区域快照副本将为完整副本,而不是增量副本。

PostgreSQL 版本号

要确定当前 Aurora PostgreSQL 版本和数据库集群的 PostgreSQL 数据库引擎版本,请参阅 确定您的 Amazon Aurora PostgreSQL 版本

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

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

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

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

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

确定要升级到的引擎版本

要确定您可以将数据库升级到的主要引擎版本,请使用 describe-db-engine-versions CLI 命令。在输出中,ValidUpgradeTarget 数组包含目标版本。如果 IsMajorVersionUpgrade 值为 true,则可以对关联的 EngineVersion 进行主要版本升级。如果数组为空,则无法进行主要版本升级。您首先升级到具有主要版本升级路径的次要版本。

例如,以下命令显示了对于当前运行在 Aurora PostgreSQL 引擎版本 9.6.12 的数据库集群,可以使用的主要引擎版本。

对于 Linux、macOS 或 Unix:

aws rds describe-db-engine-versions --engine aurora-postgresql --engine-version 9.6.12 \ --query 'DBEngineVersions[].ValidUpgradeTarget[?IsMajorVersionUpgrade == `true`]'

对于 Windows:

aws rds describe-db-engine-versions --engine aurora-postgresql --engine-version 9.6.12 ^ --query "DBEngineVersions[].ValidUpgradeTarget[?IsMajorVersionUpgrade == `true`]"

如何执行主要版本升级

主要版本升级可包含不与数据库的以前版本向后兼容的数据库更改。该功能会导致现有应用程序无法正常工作。因此,Amazon Aurora 不会自动应用主要版本升级。要执行主要版本升级,请手动修改数据库集群。

在将升级应用到生产数据库集群之前,确保彻底地测试任何升级,验证您的应用程序是否正常工作。

我们建议在升级 Aurora PostgreSQL 数据库集群时采用以下流程:

  1. 准备好一个版本兼容的参数组。

    如果您使用的是自定义数据库实例或数据库集群参数组,则您有两个选项:

    • 为新的数据库引擎版本指定默认数据库实例和/或数据库集群参数组。

    • 为新的数据库引擎版本创建您自己的自定义参数组。

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

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

    • 在尝试升级前,提交或回滚所有打开的已准备事务。您可以使用以下查询确认您的实例上是否没有打开的已准备事务。

      SELECT count(*) FROM pg_catalog.pg_prepared_xacts;
    • 在尝试升级前取消使用所有 reg* 数据类型。除了 regtyperegclass 以外,您不能升级 reg* 数据类型。pg_upgrade 实用工具不能保留这个数据类型,Amazon Aurora 使用它来执行升级。有关 pg_upgrade 实用程序的更多信息,请参阅 PostgreSQL 文档

      要验证是否没有使用不支持的 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');
  3. 执行备份。

    在升级期间,升级进程创建数据库集群的数据库集群快照。如果您还希望在升级进程之前执行手动备份,有关更多信息,请参阅创建数据库集群快照

  4. 在执行主要版本升级之前,将某些扩展升级到最新的可用版本。要更新的扩展包括以下内容:

    • pgRouting

    • postGIS

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

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

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

  5. 如果要升级到版本 11.x,请在执行主要版本升级之前删除它不支持的扩展。要删除的扩展包括:

    • chkpass

    • tsearch2

  6. 删除 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';
  7. 执行空运行升级。

    我们强烈建议您先使用生产数据库的副本测试主要版本升级,然后再对生产数据库真正执行升级。要创建副本测试实例,您可以从最近的快照还原数据库,或者克隆数据库。有关更多信息,请参阅 从快照还原克隆 Aurora 数据库集群中的数据库

    有关更多信息,请参阅 手动升级 Aurora PostgreSQL 引擎

  8. 升级您的生产实例。

    当试验性运行主要版本升级获得成功时,您应该可以放心地升级您的生产数据库。有关更多信息,请参阅 手动升级 Aurora PostgreSQL 引擎

    注意

    在升级过程期间,您无法对集群执行时间点还原。如果备份保留期大于 0,则 Aurora PostgreSQL 会在升级进程中获取数据库集群快照。您可以通过执行时间点还原,将实例还原到实例自动快照完成之后、升级操作开始之前的时间。

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

  9. 升级 PostgreSQL 扩展。PostgreSQL 升级过程不会升级任何 PostgreSQL 扩展。有关更多信息,请参阅 升级 PostgreSQL 扩展

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

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

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

手动升级 Aurora PostgreSQL 引擎

要执行 Aurora PostgreSQL 数据库集群的升级,请使用 AWS 管理控制台、AWS CLI 或 RDS API 的以下指令。

使用控制台升级数据库集群的引擎版本

  1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台:https://console.amazonaws.cn/rds/

  2. 在导航窗格中,选择 Databases (数据库),然后选择要升级的数据库集群。

  3. 选择修改。将显示修改数据库集群页面。

  4. 对于数据库引擎版本,选择新版本。

  5. 选择继续,查看修改摘要。

  6. 要立即应用更改,请选择立即应用。选择此选项在某些情况下可能导致中断。有关更多信息,请参阅 修改 Amazon Aurora 数据库集群

  7. 在确认页面上,检查您的更改。如果更改正确无误,请选择修改集群以保存更改。

    也可以选择 Back 编辑您的更改,或选择 Cancel 取消更改。

要升级数据库集群的引擎版本,请使用 CLI modify-db-cluster 命令。指定以下参数:

  • --db-cluster-identifier – 数据库集群的名称。

  • --engine-version – 数据库引擎要升级到的版本号。有关有效的引擎版本的信息,请使用 AWS CLI describe-db-engine-versions 命令。

  • --allow-major-version-upgrade – 当 --engine-version 参数是不同于数据库集群当前主要版本的主要版本时,这是必需的标志。

  • --no-apply-immediately – 在下一维护时段内应用更改。要立即应用更改,请使用 --apply-immediately

对于 Linux、macOS 或 Unix:

aws rds modify-db-cluster \ --db-cluster-identifier mydbcluster \ --engine-version new_version \ --allow-major-version-upgrade \ --no-apply-immediately

对于 Windows:

aws rds modify-db-cluster ^ --db-cluster-identifier mydbcluster ^ --engine-version new_version ^ --allow-major-version-upgrade ^ --no-apply-immediately

要升级数据库集群的引擎版本,请使用 ModifyDBCluster 操作。指定以下参数:

  • DBClusterIdentifier – 数据库集群的名称,例如 mydbcluster

  • EngineVersion – 数据库引擎要升级到的版本号。有关有效的引擎版本的信息,请使用 DescribeDBEngineVersions 操作。

  • AllowMajorVersionUpgrade – 当 EngineVersion 参数是不同于数据库集群当前主要版本的主要版本时,这是必需的标志。

  • ApplyImmediately – 是立即应用更改还是在下一个维护时段内应用更改。要立即应用更改,请将该值设置为 true。要在下一个维护时段内应用更改,请将该值设置为 false

PostgreSQL 的自动次要版本升级

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

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

  • 已知的安全问题

  • PostgreSQL 社区版本中的错误

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

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

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

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

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

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

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

升级 PostgreSQL 扩展

PostgreSQL 引擎升级不会升级任何 PostgreSQL 扩展。要在引擎升级后更新扩展,请使用 ALTER EXTENSION UPDATE 命令。

注意

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

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

ALTER EXTENSION extension_name UPDATE TO 'new_version';

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

SELECT * FROM pg_extension;

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

SELECT * FROM pg_available_extension_versions;