本文介绍RDS PostgreSQL大版本升级检查报告的内容详情、常见报错以及处理方式。
相关升级文档
检查项
在控制台大版本升级页的升级检查页签,单击目标检查报告的查看信息,以查看其详细内容。
检查报告中的检查模块及可能出现的报错如下所示:
警告
检查内容
大版本升级时,源实例的只读时间、所需的内存和磁盘资源会受到数据库对象数量的影响。如果实例的数据库对象数量过多,而磁盘和内存资源不足,可能会导致升级失败。在此情况下,系统将在警告栏中提供推荐内存、最小推荐内存以及推荐磁盘大小。
使用零停机方案进行升级时,系统还会对Sequence表数量进行检查。
推荐内存:在大版本升级过程中,系统能够对包含多个数据库的实例提供并发升级功能。因此,当实例的内存大于或等于推荐内存,将以最快的速度进行升级,以尽量减少实例的只读时间。
最小推荐内存:实例内存大于等于最小推荐内存时,不会因为内存资源不足导致升级失败。实例的只读时间并不一定是最短的,因为系统将对每个数据库进行串行升级。
推荐磁盘大小:在大版本升级过程中,系统会临时复制所有对象定义,这将导致inode的消耗增加一倍。如果升级时的磁盘空间不足以满足推荐的磁盘大小,可能会导致升级失败。
Sequence表数量检查(仅针对零停机方式):在零停机大版本升级过程中,数据通过逻辑复制进行同步。然而,逻辑复制并不支持对Sequence表的同步,因此需设定一个短暂的切换时间以完成Sequence表的同步。在零停机大版本升级中,切换时间的长短由Sequence表的数量所决定。
警告与解决办法
磁盘警告
警告格式:
总磁盘空间: {*} GB; 已使用磁盘: {*} GB; 已使用inode: {*}; bytes-per-nodes: {*}; 升级需要最少磁盘空间: {*} GB
。可能原因:对象数量过多,需要足够大小的磁盘空间。
解决办法:
对于蓝绿部署,在配置升级参数时,新实例的存储空间必须大于或等于进行升级所需的最小磁盘空间。
对于本地升级,在升级前应对源实例进行存储空间的扩容,扩容后的存储空间必须大于或等于进行升级所需的最小磁盘空间。详情请参见变更配置。
内存警告
警告格式:
当前内存: {*} GB; 推荐内存: {*} GB; 最低内存: {*} GB
。可能原因:对象数量过多,需确保拥有足够的内存,以最大程度地减少在升级过程中实例的只读时间。
解决办法:
对于蓝绿部署,在配置升级参数时,新实例规格中的内存必须大于或等于最低内存要求。
对于本地升级,如果实例规格小于推荐内存,需要在升级前对源实例进行升配。详情请参见变更配置。
订阅警告
警告格式:
实例存在复制槽订阅端,为防止订阅数据不一致,建议查看阿里云帮助文档
。可能原因:实例中存在复制槽订阅端,您可以通过执行
select * from pg_subscription;
进行查看。解决办法:参见升级数据库大版本,进行处理。
Sequence警告
警告格式:
Sequence表总数:{0},过多Sequence表会延长逻辑复制大版本升级的切换时间。
可能原因:实例中存在Sequence表,通过执行
select * from pg_sequences;
可以查看所有数据库中的Sequence表。解决办法:如果Sequence表数量过多,建议使用克隆实例进行切换时间的测试,以确保切换时间符合需求。
错误
检查内容
检查是否存在后台添加的多余超级账号或者加密方式不正确的普通账号。
预检查是否失败。如若失败,检查报告将显示“pg_upgrade错误日志”项。
是否在pg_catalog schema中安装了pgcrypto插件。
(仅针对零停机方式)实例内核的小版本是否为20250228及之后的版本。
(仅针对零停机方式)逻辑复制的不兼容项。逻辑复制无法同步某些数据库对象,因而存在这些对象的实例将无法支持零停机的大版本升级。如若存在不兼容项,检查报告将显示“逻辑复制不兼容项”项。
错误与解决办法
账号错误
错误格式:
无效超级账户:{*};无效账户:{*}; 请查看阿里云帮助文档
。可能原因:存在冗余的超级账号或者存在异常的普通账号。
解决办法:
对于冗余的超级账号,请提工单联系售后服务删除。
对于异常的普通账号,请重置报错账号的密码。
预检查错误
错误格式:
pg_upgrade预检查任务失败, 需要查看[pg_upgrade错误日志]以及[pg_upgrade相关文件与报错]
。可能原因:预检查失败。
解决办法:请参照pg_upgrade错误日志,解决日志问题。
pgcrypto插件错误
错误格式:
在数据库:{*}中的schema:pg_catalog中安装了pg_crypto插件,请查看阿里云帮助文档
。可能原因:由于pgcrypto在pg_catalog中创建了仅在高版本中存在的函数,导致了大版本升级的失败。
解决办法:删除每个数据库中的pgcrypto插件,然后在非pg_catalog schema中创建该插件。
小版本错误
错误格式:
零停机大版本升级最低小版本20250228
。可能原因:实例内核小版本过低。
解决办法:升级内核小版本。
pg_upgrade错误日志
检查内容
检查大版本间是否存在不兼容的插件、关键字等。
常见报错
pg_upgrade相关文件与报错
loadable_libraries.txt
展示不兼容的library,通常对应了不兼容的插件。
如下是常见的不兼容插件及解决办法:
tables_with_oids.txt
展示声明了WITH OIDS
的表清单。
逻辑复制不兼容项
检查内容
检查是否存在外部表。
检查是否存在缺乏主键或唯一键的表。
检查是否存在物化视图。
检查是否存在大对象。
检查是否存在逻辑复制禁止插件。
检查逻辑复制要求的相关参数取值是否满足要求。
不兼容项和解决办法
外部表不兼容
错误格式:
外部表所在库:{0}。总共库:{1}
。可能原因:存在外部表。
解决办法:删除外部表。
在实例的每个数据库中执行以下SQL,获取外部表的信息。
SELECT COUNT(*) AS count, relkind FROM pg_class WHERE relkind IN ('f') GROUP BY relkind;
执行以下SQL语句删除外部表。
DROP FOREIGN TABLE [ IF EXISTS ] name [ CASCADE | RESTRICT ];
更多信息请参见社区文档。
没有唯一键表不兼容
错误格式:
没有主键或者唯一键的表所在库:{0}。总共库:{1}
。可能原因:存在没有主键或者唯一键的表。
解决办法:为表增加主键或者唯一键。
在实例的每个数据库中执行以下SQL,获取没有主键或者唯一键的表信息。
SELECT COUNT(*) AS count FROM information_schema.tables t LEFT JOIN information_schema.table_constraints tc ON t.table_name = tc.table_name AND t.table_schema = tc.table_schema AND (tc.constraint_type = 'PRIMARY KEY' OR tc.constraint_type = 'UNIQUE') JOIN pg_class c ON t.table_name = c.relname JOIN pg_namespace ns ON c.relnamespace = ns.oid AND ns.nspname = t.table_schema WHERE t.table_type = 'BASE TABLE' AND tc.constraint_type IS NULL AND t.table_schema NOT IN ('pg_catalog', 'information_schema') AND c.relreplident != 'f';
执行以下SQL,将目标表的
REPLICA IDENTITY
设置为FULL
。ALTER TABLE name REPLICA IDENTITY FULL;
执行以下SQL,为目标表增加主键或者唯一键。
--主键约束 ALTER TABLE name ADD CONSTRAINT constrain_name PRIMARY KEY (column_name); --唯一键约束 ALTER TABLE name ADD CONSTRAINT constrain_name UNIQUE (column_name);
更多信息请参见社区文档。
物化视图不兼容
错误格式:
物化视图所在库:{0}。总共库:{1}
。可能原因:存在物化视图。
解决办法:删除物化视图。
在实例的每个数据库中执行以下SQL,获取物化视图。
SELECT COUNT(*) AS count, relkind FROM pg_class WHERE relkind IN ('m') GROUP BY relkind;
执行以下SQL,删除物化视图。
DROP MATERIALIZED VIEW IF EXISTS name;
大对象不兼容
错误格式:
大对象所在库:{0}。总共库:{1}
。可能原因:存在大对象。
解决办法:删除大对象。
在实例的每个数据库中执行以下SQL,获取大对象。
SELECT COUNT(*) AS count FROM pg_largeobject_metadata;
执行以下SQL,删除大对象。
SELECT lo_unlink(largeobject_oid);
插件不兼容
错误格式:
逻辑复制禁止插件所在库:{0}。总共库:{1}
。可能原因:使用了当前禁止的以下四个插件:'pg_partman'、'pg_cron'、'pg_active' 和 'pg_logical'。
解决办法:临时删除不兼容插件。
在实例的每个数据库中执行以下SQL,查看是否安装了不兼容插件。
SELECT COUNT(*) AS count FROM pg_extension WHERE extname IN ('pg_partman', 'pg_cron', 'pg_active', 'pglogical');
临时删除不兼容插件。
DROP EXTENSION extension_name;
参数不兼容
错误格式:
逻辑复制要求wal_level为logical,max_wal_sender以及max_replication_slots至少为{0},实例wal_level为:{1}, max_wal_sender为:{2}, max_replication_slots为:{3}
。可能原因:三个参数的取值未能满足需求。
解决办法:修改参数值。请注意,可能需要重启实例以使更改生效。详情请参见设置实例参数。
检查报告格式说明
检查报告将同时提供中文和英文内容,请根据需要选择适合的语言进行查看。