解读RDS PostgreSQL大版本升级检查报告

本文介绍RDS PostgreSQL大版本升级检查报告的内容详情、常见报错以及处理方式。

检查报告将同时提供中文和英文内容,请根据需要选择适合的语言进行查看。

image

检查项

如果您在升级数据库大版本的升级检查步骤,检查报告的结果为失败,可以单击查看信息查看检查报告的详细内容。

如下是检查报告中的检查模块及常见的报错:

警告

检查内容

大版本升级时,源实例的只读时间、所需的内存和磁盘资源会受到数据库对象数量的影响。如果实例的数据库对象数量过多,而磁盘和内存资源不足,可能会导致升级失败。在此情况下,系统将在警告栏中提供推荐内存、最小推荐内存以及推荐磁盘大小。

  • 推荐内存:在大版本升级过程中,系统能够对包含多个数据库的实例提供并发升级功能。因此,当实例的内存大于或等于推荐内存,将以最快的速度进行升级,以尽量减少实例的只读时间。

  • 最小推荐内存:实例内存大于等于最小推荐内存时,不会因为内存资源不足导致升级失败。实例的只读时间并不一定是最短的,因为系统将对每个数据库进行串行升级。

  • 推荐磁盘大小:在大版本升级过程中,系统会临时复制所有对象定义,这将导致inode的消耗增加一倍。如果升级时的磁盘空间不足以满足推荐的磁盘大小,可能会导致升级失败。

警告与解决办法

磁盘警告

  • 警告格式总磁盘空间: {*} GB; 已使用磁盘: {*} GB; 已使用inode: {*}; bytes-per-nodes: {*}; 升级需要最少磁盘空间: {*} GB

  • 可能原因:对象数量过多,需要足够大小的磁盘空间。

  • 解决办法

    • 对于蓝绿部署,在配置升级参数时,新实例的存储空间必须大于或等于进行升级所需的最小磁盘空间。

    • 对于本地升级,在升级前应对源实例进行存储空间的扩容,扩容后的存储空间必须大于或等于进行升级所需的最小磁盘空间。详情请参见变更配置

内存警告

  • 警告格式当前内存: {*} GB; 推荐内存: {*} GB; 最低内存: {*} GB

  • 可能原因:对象数量过多,需确保拥有足够的内存,以最大程度地减少在升级过程中实例的只读时间。

  • 解决办法

    • 对于蓝绿部署,在配置升级参数时,新实例规格中的内存必须大于或等于最低内存要求。

    • 对于本地升级,如果实例规格小于推荐内存,需要在升级前对源实例进行升配。详情请参见变更配置

订阅警告

错误

检查内容

  • 检查是否存在后台添加的多余超级账号或者加密方式不正确的普通账号。

  • 预检查是否失败。如若失败,检查报告将显示“pg_upgrade错误日志”项。

  • 是否在pg_catalog schema中安装了pgcrypto插件。

错误与解决办法

账号错误

  • 错误格式无效超级账户:{*};无效账户:{*}; 请查看阿里云帮助文档

  • 可能原因:存在冗余的超级账号或者存在异常的普通账号。

  • 解决办法

    • 对于冗余的超级账号,请提工单联系售后服务删除。

    • 对于异常的普通账号,请重置报错账号的密码。

预检查错误

  • 错误格式pg_upgrade预检查任务失败, 需要查看[pg_upgrade错误日志]以及[pg_upgrade相关文件与报错]

  • 可能原因:预检查失败。

  • 解决办法:请参照pg_upgrade错误日志,解决日志问题。

pgcrypto插件错误

  • 错误格式在数据库:{*}中的schema:pg_catalog中安装了pg_crypto插件,请查看阿里云帮助文档

  • 可能原因:由于pgcrypto在pg_catalog中创建了仅在高版本中存在的函数,导致了大版本升级的失败。

  • 解决办法:删除每个数据库中的pgcrypto插件,然后在非pg_catalog schema中创建该插件。

pg_upgrade错误日志

检查内容

检查大版本间是否存在不兼容的插件、关键字等。

常见报错

A list of problem libraries is in the file: loadable_libraries.txt

可能原因

存在高版本不兼容的插件,相关插件被记录在loadable_libraries.txt文件中。

解决办法

排查loadable_libraries.txt报告项中列出的插件,根据实际需要进行评估是否删除,建议在不影响业务稳定的情况下删除后升级。各版本支持的插件列表请参见:支持插件列表

A list of tables with the problem is in the file: tables_with_oids.txt

可能原因

建表时声明了WITH OIDS,该声明在PostgreSQL 12或以上版本不支持,相关表被记录在tables_with_oids.txt文件中。

解决办法

  • 方法一(推荐):升级到PostgreSQL 11版本,该版本支持声明WITH OIDS

  • 方法二:排查loadable_libraries.txt报告项列出的表,请自行评估业务代码是否对OID有依赖,确认不影响业务之后,执行以下语句:

    ALTER TABLE {table_name} SET WITHOUT OIDS;

pg_upgrade相关文件与报错

loadable_libraries.txt

展示不兼容的library,通常对应了不兼容的插件。

如下是常见的不兼容插件及解决办法:

pgrouting插件

可能原因

选定的高版本中不支持pgrouting插件。

解决办法

根据实际需要进行评估是否删除,建议在不影响业务稳定的情况下删除后升级。各版本支持的插件列表请参见:支持插件列表

jsonbx插件

可能原因

PostgreSQL 9.4对JSON类型支持不完善,需要jsonbx插件支持,PostgreSQL 10或以上版本原生支持JSON,没有该插件。

解决办法

请在高版本中验证jsonbx插件的相关函数使用,根据实际需要进行评估是否删除插件,然后在不影响业务稳定的情况下删除后再升级。

jsonbx插件函数使用差异如下:

函数用法

PostgreSQL 9.4执行结果

PostgreSQL 10或以上版本执行结果

select '{"a":1, "b":2, "c":3}'::jsonb - 2;

{"a": 1, "b": 2}

ERROR: cannot delete from object using integer index

select jsonb_delete('{"a":1, "b":2, "c":3}'::jsonb, '{b}'::text[]);

{"a": 1, "c": 3}

ERROR: function jsonb_delete(jsonb, text[]) does not exist

select '{"a":{"c":1, "d":2}, "b":3}'::jsonb - '{a, c}'::text[];

{"a": {"d": 2}, "b": 3}

{"b": 3}

postgis、postgis_topology插件

可能原因

postgis插件版本过低,与选定的高版本lib库不匹配,升级检查失败。

解决办法

重要

postgis插件各版本间存在差异(例如wkt格式的解析报错不同),升级后可能影响业务处理,建议在升级postgis插件前,先克隆当前实例,在克隆实例中对postgis插件进行升级测试,完全符合业务需求后,再在原实例中升级postgis插件。克隆的具体操作,请参见备份PostgreSQL数据恢复PostgreSQL数据

  1. 升级内核小版本。更多信息,请参见升级内核小版本

  2. 更新报错提示的postgis插件。更多信息,请参见PostGIS插件升级

  3. 执行\dx命令查询插件版本,确保postgis插件版本至少为3.3.2。

  4. 重新进行升级检查。

    重要

    不同PostgreSQL实例版本安装postgis、postgis_topology或pgrouting插件后,升级大版本存在如下限制:

    • PostgreSQL 9.4:暂时仅支持升级到PostgreSQL 10或11。

    • PostgreSQL 10:暂时仅支持升级到PostgreSQL 11。

    • PostgreSQL 11、12和13:暂不支持升级。

tables_with_oids.txt

展示声明了WITH OIDS的表清单。