如何执行 RDS for PostgreSQL 的主要版本升级
在 Amazon RDS for PostgreSQL 数据库上执行主要版本升级时,我们建议采用以下过程:
-
准备一个版本兼容的参数组 – 如果您使用的是自定义参数组,则您有两个选择。您可为新数据库引擎版本指定默认参数组。或者您可为新数据库引擎版本创建您自己的自定义参数组。有关更多信息,请参阅Amazon RDS 的参数组 和使用多可用区数据库集群的数据库集群参数组。
-
检查不受支持的数据库类 – 检查数据库的实例类是否与您要升级到的 PostgreSQL 版本兼容。有关更多信息,请参阅 数据库实例类支持的数据库引擎。
-
检查是否有不支持的使用方式:
-
准备的事务 – 在尝试升级前,提交或回滚所有打开的已准备事务。
您可以使用以下查询来验证您的数据库上是否没有未结的已准备事务。
SELECT count(*) FROM pg_catalog.pg_prepared_xacts;
-
Reg* 数据类型 – 在尝试升级前取消使用所有 reg* 数据类型。除了
regtype
和regclass
以外,您不能升级 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');
-
-
检查是否存在无效的数据库:
-
确保没有无效的数据库。
pg_database
目录中的datconnlimit
列包含一个值-2
,用于将DROP DATABASE
操作期间中断的数据库标记为无效。使用以下查询来检查是否存在无效的数据库:
SELECT datname FROM pg_database WHERE datconnlimit = - 2;
-
上一个查询返回无效数据库的名称。可以使用
DROP DATABASE
删除无效的数据库。也可以使用以下命令来删除无效的数据库:invalid_db_name
;SELECT 'DROP DATABASE ' || quote_ident(datname) || ';' FROM pg_database WHERE datconnlimit = -2 \gexec
有关无效数据库的更多信息,请参阅了解对无效数据库使用 autovacuum 的行为。
-
-
处理逻辑复制槽:如果数据库有逻辑复制槽,则无法进行升级。逻辑复制插槽通常用于 Amazon DMS 迁移,以及将表从数据库复制到数据湖、BI 工具和其他目标。升级之前,请确保您知道正在使用的任何逻辑复制槽的用途,并确认可以将其删除。如果逻辑复制槽仍在使用中,则不应将其删除,但也无法继续升级。
如果不需要逻辑复制槽,则可以使用以下 SQL 将其删除:
SELECT * FROM pg_replication_slots; SELECT pg_drop_replication_slot(slot_name);
使用
pglogical
扩展的逻辑复制设置还需要删除插槽才能成功升级主要版本。有关如何识别和删除使用pglogical
扩展创建的插槽的信息,请参阅 管理 RDS for PostgreSQL 的逻辑复制查槽。 -
处理只读副本 – 单可用区数据库实例或多可用区数据库实例部署的升级也会将区域内只读副本与主数据库实例一起升级。Amazon RDS 不会升级多可用区数据库集群只读副本。
您无法单独升级只读副本。如果您可以单独升级,则可能会导致主数据库和副本数据库具有不同 PostgreSQL 主要版本的情况。但是,只读副本升级可能会增加主数据库实例上的停机时间。为防止只读副本升级,请在开始升级过程之前将副本提升为独立实例或将其删除。
升级过程将根据只读副本的当前参数组重新创建副本的参数组。只有在升级完成后,才能通过修改只读副本将自定义参数组应用于只读副本。有关只读副本的更多信息,请参阅 使用 Amazon RDS for PostgreSQL 只读副本。
-
执行备份 – 我们建议您在执行主要版本升级前执行备份,以便为您的数据库获得一个已知的还原点。如果您的备份保留期大于 0,则在升级之前和之后,升级过程会创建数据库的数据库快照。要更改您的备份保留期,请参阅修改 Amazon RDS 数据库实例和修改 Amazon RDS 的多可用区数据库集群。
要手动执行备份,请参阅为 Amazon RDS 的单可用区数据库实例创建数据库快照和创建 Amazon RDS 的多可用区数据库集群快照。
-
在主要版本升级之前更新某些扩展 – 如果打算在升级时跳过主要版本,您需要在执行主要版本升级之前更新某些扩展。例如,从版本 9.5.x 或 9.6.x 升级到版本 11.x 将跳过主要版本。要更新的扩展包括 PostGIS 和用于处理空间数据的相关扩展。
-
address_standardizer
-
address_standardizer_data_us
-
postgis_raster
-
postgis_tiger_geocoder
-
postgis_topology
为您要使用的每个扩展运行以下命令:
ALTER EXTENSION
PostgreSQL-extension
UPDATE TO 'new-version
';有关更多信息,请参阅 在 RDS for PostgreSQL 数据库中升级 PostgreSQL 扩展。要了解有关升级 PostGIS 的更多信息,请参阅步骤 6:升级 PostGIS 扩展。
-
-
在主要版本升级之前删除某些扩展 – 跳过主要版本以升级到版本 11.x 的升级不支持更新
pgRouting
扩展。从版本 9.4.x、9.5.x 或 9.6.x 升级到版本 11.x 时,将会跳过主要版本。可以安全地删除pgRouting
扩展,然后在升级后将其重新安装到兼容的版本中。有关您可以更新到的扩展版本,请参阅支持的 PostgreSQL 扩展版本。PostgreSQL 版本 11 或更高版本不再支持
tsearch2
和chkpass
扩展。如果要升级到版本 11.x,请在升级之前删除tsearch2
和chkpass
扩展。 -
删除未知数据类型 – 根据目标版本删除
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';
-
执行升级试运行 – 我们强烈建议您在生产数据库的副本上测试主要版本升级,然后再尝试在生产数据库上进行升级。您可以监控重复测试数据库上的执行计划,以了解任何可能的执行计划回归,并评估其性能。要创建副本测试实例,您可以从最近的快照还原数据库,也可以通过时间点还原将数据库还原到最近的可还原时间。
有关更多信息,请参阅 从快照还原 或 将 Amazon RDS 的数据库实例还原到指定时间。对于多可用区数据库集群,请参阅从快照还原到多可用区数据库集群或将多可用区数据库集群还原到指定时间。
有关执行升级的详细信息,请参阅 手动升级引擎版本。
请注意,在将版本 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。在主要版本升级期间,将暂时重命名
public
和template1
数据库以及每个数据库中的public
架构。这些对象显示在日志中,同时附加了它们的原始名称和随机字符串。附加该字符串的目的是,在主要版本升级期间保留自定义设置,例如,locale
和owner
。升级完成后,对象再次重命名为它们的原始名称。注意
在主要版本升级过程中,您无法为数据库实例或多可用区数据库集群执行时间点还原。Amazon RDS 执行升级之后,它会自动备份数据库。您可以通过执行时间点还原,还原到数据库自动备份完成之后、升级操作开始之前的时间。
-
如果升级失败并出现预检查过程错误,请解决这些问题 – 在主要版本升级过程中,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.
-
如果在升级数据库时只读副本升级失败,解决问题 – 将失败的只读副本置于
incompatible-restore
状态并终止数据库上的复制。删除该只读副本,并根据升级后的主数据库实例重新创建只读副本。注意
Amazon RDS 不会升级多可用区数据库集群的只读副本。如果您对多可用区数据库集群执行主要版本升级,则其只读副本的复制状态会更改为终止。
只读副本升级可能会因以下原因而失败:
-
即使等待了一段时间,也无法跟上主数据库实例。
-
处于终端或不兼容的生命周期状态,如 storage-full、incompatible-restore 等。
-
主数据库实例升级开始后,在只读副本上运行了单独的次要版本升级。
-
只读副本实例使用了不兼容的参数。
-
只读副本实例无法与主实例通信以同步数据文件夹。
-
-
升级生产数据库 – 在成功完成试运行主要版本升级后,您就可以放心地升级生产数据库了。有关更多信息,请参阅 手动升级引擎版本。
-
运行
ANALYZE
操作以刷新pg_statistic
表。您应该为所有 PostgreSQL 数据库上的每个数据库执行此操作。在主要版本升级期间不会传输优化程序统计数据,因此您需要重新生成所有统计数据,避免出现性能问题。运行不带任何参数的命令,为当前数据库中的所有常规表生成统计数据,如下所示:ANALYZE VERBOSE;
VERBOSE
标记为可选项,可用于显示进度。有关更多信息,请参阅 PostgreSQL 文档中的 ANALYZE。 注意
升级后在系统上运行 ANALYZE,避免出现性能问题。
在完成主要版本升级后,我们建议执行以下操作:
-
PostgreSQL 升级不会升级任何 PostgreSQL 扩展。要升级扩展,请参阅在 RDS for PostgreSQL 数据库中升级 PostgreSQL 扩展。
-
(可选)使用 Amazon RDS 查看
pg_upgrade
实用程序生成的两个日志。它们是pg_upgrade_internal.log
和pg_upgrade_server.log
。Amazon RDS 会在这些日志的文件名中附加时间戳。您可以像查看其他任何日志一样查看这些日志。有关更多信息,请参阅“监控 Amazon RDS 日志文件”。您也可以将升级日志上传到 Amazon CloudWatch Logs 中。有关更多信息,请参阅“将 PostgreSQL 日志发布到 Amazon CloudWatch Logs”。
-
要验证是否一切正常,请在升级的数据库上使用类似的工作负载测试应用程序。验证升级之后,您可以删除此测试实例。