升级PostgreSQL 11.20至12.15时遇'abstime不存在'错误,求解决方法
解决PostgreSQL 11→12升级时abstime类型不存在的问题
方案一:先在原11库替换非标准时间类型(推荐)
abstime、reltime、tinterval属于废弃的非标准类型,彻底替换为标准类型能从根源避免后续升级问题:
- 找出所有使用这些类型的表和字段:
SELECT table_schema, table_name, column_name, data_type FROM information_schema.columns WHERE data_type IN ('abstime', 'reltime', 'tinterval'); - 逐个字段转换为标准类型,比如将abstime转为
timestamptz(带时区的时间戳):
注意:转换前一定要备份原数据,tinterval可以转为ALTER TABLE 你的表名 ALTER COLUMN 字段名 TYPE timestamptz USING 字段名::timestamptz;interval类型,具体转换逻辑根据业务场景调整。 - 替换完成后重新生成备份,再执行升级或恢复操作。
方案二:在目标12库临时创建废弃类型定义
如果暂时无法修改原库数据,可在恢复前手动在12库中创建这些类型:
- 连接到目标12数据库,执行以下SQL:
CREATE TYPE abstime AS (abstime timestamp with time zone); CREATE TYPE reltime AS (reltime interval); CREATE TYPE tinterval AS (tinterval tsrange); - 执行完后再运行
pg_restore,恢复完成后务必尽快将相关字段替换为标准类型,避免后续版本升级再出兼容问题。
方案三:用pg_upgrade直接升级(跳过备份恢复流程)
如果是直接升级而非备份恢复,pg_upgrade工具能自动处理部分废弃类型的兼容:
- 确认新旧版本的bin目录和数据目录路径正确,执行升级命令:
若数据库中有依赖这些类型的自定义函数,升级后需要手动调整函数定义。pg_upgrade -b /path/to/postgres11/bin -B /path/to/postgres12/bin -d /path/to/postgres11/data -D /path/to/postgres12/data
内容的提问来源于stack exchange,提问作者om joshi
相关产品推荐
相关产品推荐

