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

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

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

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

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

配置为逻辑复制发布者或订阅者的 Aurora 数据库集群无法进行主要版本升级。在升级之前,您需要停止复制并删除所有逻辑槽。有关更多信息,请参阅 停止逻辑复制

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

Aurora PostgreSQL 升级概述

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

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

Aurora PostgreSQL 在主要版本升级开始之前生成数据库集群快照。在次要版本升级之前,它不会生成数据库集群快照。

如果要在主要版本升级完成后返回到以前的版本,则可以从此快照还原数据库集群。您还可以将数据库集群还原到主要版本或次要版本升级之前的特定时间点。有关更多信息,请参阅 从数据库集群快照还原将数据库集群还原到指定时间

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

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

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

确定要升级到的引擎版本

要确定您可以将数据库升级到的主要引擎版本,请使用 describe-db-engine-versions CLI 命令。如果您无法进行主要版本升级。您首先升级到具有主要版本升级路径的次要版本。

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

对于 Linux、macOS 或 Unix:

aws rds describe-db-engine-versions \ --engine aurora-postgresql \ --engine-version 10.11 \ --query 'DBEngineVersions[].ValidUpgradeTarget[?IsMajorVersionUpgrade == `true`].{EngineVersion:EngineVersion}' \ --output text

对于 Windows:

aws rds describe-db-engine-versions ^ --engine aurora-postgresql ^ --engine-version 10.11 ^ --query "DBEngineVersions[].ValidUpgradeTarget[?IsMajorVersionUpgrade == `true`].{EngineVersion:EngineVersion}" ^ --output text

如何执行主要版本升级

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

以下 Aurora PostgreSQL 主要版本升级可用。

当前源版本 主要升级目标

9.6.9 及更高的次要版本

10.11 及更高的次要版本

9.6.22 及更高的次要版本

10.11 及更高的次要版本

11.13 及更高的次要版本

12.8 及更高的次要版本

13.4 及更高的次要版本

10.7 及更高的次要版本

11.7 及更高的次要版本

10.18 及更高的次要版本

11.7 及更高的次要版本

12.8 及更高的次要版本

13.4 及更高的次要版本

11.7 及更高的次要版本

12.4 及更高的次要版本

11.13

12.4 及更高的次要版本

13.4

12.4 及更高的次要版本(基于 GravitOn2 的数据库实例类)

12.7 及更高的次要版本(基于英特尔的数据库实例类)

13.3 及更高的次要版本

有关数据库实例类的更多信息,包括哪些实例类基于 Graviton2 以及哪些实例基于英特尔,请参阅 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');
    • 如果从 Aurora PostgreSQL 10.18 版本升级,并且您已安装 pgRouting 扩展,请删除此扩展,然后再升级到 12.4 或更高版本。

  3. 执行备份。

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

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

    • pgRouting

    • postgis_raster

    • postgis_tiger_geocoder

    • postgis_topology

    • address_standardizer

    • address_standardizer_data_us

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

    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 n.nspname, c.relname, a.attname 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.unknown'::pg_catalog.regtype AND c.relkind IN ('r','m','c') 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');
  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 表。

  • 如果您升级到 PostgreSQL 版本 10,请在您拥有的任何哈希索引上运行 REINDEX。哈希索引在版本 10 中已更改,必须重新构建。要查找无效的哈希索引,请针对包含哈希索引的每个数据库运行以下 SQL。

    SELECT idx.indrelid::regclass AS table_name, idx.indexrelid::regclass AS index_name FROM pg_catalog.pg_index idx JOIN pg_catalog.pg_class cls ON cls.oid = idx.indexrelid JOIN pg_catalog.pg_am am ON am.oid = cls.relam WHERE am.amname = 'hash' AND NOT idx.indisvalid;
  • 请考虑在升级的数据库上使用类似的工作负载测试应用程序,以验证是否一切正常。验证升级之后,您可以删除此测试实例。

手动升级 Aurora PostgreSQL 引擎

要执行 Aurora PostgreSQL 数据库集群的升级,请使用Amazon Web Services Management Console、Amazon CLI 或 RDS API 的以下指令。

注意

如果要对 Aurora Global Database 执行次要升级,请先升级所有辅助集群,然后再升级主集群。

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

  1. 登录Amazon Web Services Management Console并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

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

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

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

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

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

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

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

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

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

  • --engine-version – 数据库引擎要升级到的版本号。有关有效的引擎版本的信息,请使用 Amazon 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

全局数据库的就地主要版本升级

对于 Aurora Global Database,您可升级全局数据库集群。Aurora 会同时自动升级所有集群,并确保所有集群运行相同的引擎版本。此要求是因为对系统表、数据文件格式等所做的任何更改都会自动复制到所有辅助集群。

按照中的说明进行操作如何执行主要版本升级 指定要升级的内容时,请确保选择全局数据库集群,而不是其包含的集群之一。

如果您使用 Amazon Web Services Management Console,请选择具有角色 Global database(全局数据库)的项目。


                升级全局数据库集群

如果您使用 Amazon CLI 或 RDS API,请通过调用 modify-global-cluster 命令或 ModifyGlobalCluster 操作(而不是 modify-db-clusterModifyDBCluster)来启动升级过程。

注意

如果启用了恢复点目标 (RPO) 功能,则无法对 Aurora 数据库引擎执行主要版本升级。在升级数据库引擎之前,请确保此功能已关闭。有关 RPO 功能的更多信息,请参阅 管理基于 Aurora PostgreSQL 的全局数据库的 RPO

PostgreSQL 的自动次要版本升级

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

  • 已知的安全问题

  • PostgreSQL 社区版本中的错误

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

您可以使用以下 Amazon 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 数据库实例:

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

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

如果一个集群中的任何数据库实例未启用自动次要版本升级设置,则 Aurora 就不会自动升级该集群中的任何实例。确保集群中的所有数据库实例的该设置保持一致。

启用自动次要版本升级

要为 Aurora PostgreSQL 数据库集群启用自动次要版本升级,请使用以下 Amazon Web Services Management Console、Amazon CLI 或 RDS API 说明。

按照一般过程修改集群中的数据库实例,如修改数据库集群中的数据库实例中所述。对集群中的每个数据库实例重复此过程。

使用控制台为您的集群实现自动次要版本升级

  1. 登录 Amazon RDS 控制台,选择 Databases (数据库),查找您希望打开或关闭自动次要版本升级的数据库集群。

  2. 选择要修改的数据库集群中的每个数据库实例。按顺序对每个数据库实例应用以下更改:

    1. 选择 Modify (修改)

    2. Maintenance (维护) 部分中,选择 Enable auto minor version upgrade (启用自动次要版本升级)

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

    4. (可选)选择立即应用以立即应用更改。

    5. 在确认页面上,选择修改数据库实例

要使用 CLI 实施次要版本升级,请使用 modify-db-instance 命令。

当您调用 modify-db-instance Amazon CLI 命令时,请为 --db-instance-identifier 选项指定数据库实例的名称,为 --auto-minor-version-upgrade 选项设置 true。(可选)指定 --apply-immediately 选项,立即为数据库实例启用此设置。为集群中的每个数据库实例运行单独的 modify-db-instance 命令。

您可以使用如下 CLI 命令来检查 Aurora PostgreSQL 集群中所有数据库实例的启用自动次要版本升级状态。

aws rds describe-db-instances \ --query '*[].{DBClusterIdentifier:DBClusterIdentifier,DBInstanceIdentifier:DBInstanceIdentifier,AutoMinorVersionUpgrade:AutoMinorVersionUpgrade}'

该命令产生的输出类似于以下内容。

[ { "DBInstanceIdentifier": "db-t2-medium-instance", "DBClusterIdentifier": "cluster-57-2020-06-03-6411", "AutoMinorVersionUpgrade": true }, { "DBInstanceIdentifier": "db-t2-small-original-size", "DBClusterIdentifier": "cluster-57-2020-06-03-6411", "AutoMinorVersionUpgrade": false }, { "DBInstanceIdentifier": "instance-2020-05-01-2332", "DBClusterIdentifier": "cluster-57-2020-05-01-4615", "AutoMinorVersionUpgrade": true }, ... output omitted ...

要使用 API 实现小版本升级,请使用 ModifyDBInstance 操作。

调用 ModifyDBInstance API 操作,并为 DBInstanceIdentifier 参数指定数据库集群的名称,为 AutoMinorVersionUpgrade 参数指定 true。(可选)将 ApplyImmediately 参数设置为 true,立即为数据库实例启用此设置。为集群中的每个数据库实例调用单独的 ModifyDBInstance 操作。

升级 PostgreSQL 扩展

PostgreSQL 引擎升级不会自动升级任何 PostgreSQL 扩展。安装 PostgreSQL 扩展需要 rds_superuser 权限,但此权限通常只委派给使用该扩展的用户(角色)。这意味着在数据库引擎升级后升级 Aurora PostgreSQL 数据库实例中的所有扩展,可能涉及许多不同用户(角色)。如果要使用脚本自动执行升级过程,也请注意这一点。有关 PostgreSQL 权限和角色的更多信息,请参阅 使用 Amazon Aurora PostgreSQL 实现高安全性

注意

如果在 Amazon RDS PostgreSQL 数据库实例中运行 PostGIS 扩展,请参阅 PostGIS 文档中的 PostGIS_Extensions_Upgrade 来升级扩展。

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

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;