首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >由于“不存在abstime类型”,Postgresql从11升级到12失败

由于“不存在abstime类型”,Postgresql从11升级到12失败
EN

Stack Overflow用户
提问于 2021-07-30 19:24:46
回答 1查看 978关注 0票数 2

我正在运行一个旧的postgresql数据库,该数据库最初安装为v9.6,我正在逐步地将它从一个版本升级到下一个版本,直到我能够将其更新到版本13.3。从9.6升级到10,从10升级到11成功。但是,当我试图升级到版本12时,会出现以下错误:

代码语言:javascript
运行
复制
bash-4.4$ tail pg_upgrade_dump_16421.log
pg_restore: creating TYPE "public.gtrgm"
pg_restore: creating FUNCTION "public.Seqnextval("abstime")"
pg_restore: while PROCESSING TOC:
pg_restore: from TOC entry 662; 1255 16425 FUNCTION Seqnextval("abstime") effective
pg_restore: error: could not execute query: ERROR:  type abstime does not exist
Command was: CREATE FUNCTION "public"."Seqnextval"("abstime") RETURNS bigint
    LANGUAGE "sql"
    AS $$select setval('units_id_seq', (select max(id) from units)+1) from units limit 1;$$;

以下是我从11点到12点为达到现在的目标所采取的步骤:

B)升级到PostgreSQL 12

  1. 更新包和安装postgres

sudo yum更新sudo yum安装postgresql12

  1. 停止postgresql服务

systemctl停止PostgreSQL11服务sudo systemctl停止postgresql-12.service

  1. 再次以postgres用户身份登录

sudo su postgres

  1. 更改为主目录

cd ~

  1. 迁移数据

/usr/pgsql/12/bin/pgsql-11/data-data-datadir=/var/lib/pgsql/11/data-新-datadir=/var/lib/pgsql/12/data-old-bindir=/usr/pgsql-11/bin-bindir=/usr/pgsql-12/bin-旧选项'-c config_file=/var/lib/pgsql/11/data/postgresql.conf‘-新选项'-c config_file=/var/lib/pgsql/12/data/postgresql.conf'

  1. 切换到常规用户

出口

  1. 交换旧的和新的postgres版本的端口。

sudo nano /var/lib/pgsql/12/data/postgresql.conf _change端口到5432_ sudo nano /var/lib/pgsql/11/data/postgresql.conf _change端口到5433_

  1. 启动postgresql服务

sudo系统启动postgresql-12.service

  1. 以postgres用户身份登录

sudo cd ~

  1. 检查您的新postgres版本

psql -c "SELECT version();"

  1. 运行生成的新集群脚本

./analyze_new_cluster.sh

  1. 作为普通用户(默认用户)返回,并清理旧版本的混乱

出口sudo yum移除postgresql11 sudo rm -rf /etc/postgresql/11/ sudo postgres cd ~postgresql11

我知道abstime数据类型已经在postgresql 12中删除了。这里有人知道如何解决这个问题,这样我就可以继续升级了吗?请告诉我,谢谢!如果你有什么问题,我会全神贯注的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-31 06:32:08

功能"Seqnextval“可以做什么?

代码语言:javascript
运行
复制
CREATE FUNCTION "public"."Seqnextval"("abstime") 
RETURNS bigint
LANGUAGE "sql"
AS $$
select setval('units_id_seq', (select max(id) from units)+1) from units limit 1;
$$;

注意,函数中从未使用abstime类型的参数。

我想把它改为:

代码语言:javascript
运行
复制
CREATE FUNCTION "public"."Seqnextval"(anyelement)

然后重新运行升级过程。

在一般情况下,必须对abstime做什么?

可能还有其他使用abstime的函数。

寻找其他功能:

代码语言:javascript
运行
复制
WITH funcs AS (
SELECT 
        P.proname,
        p.pronamespace::regnamespace::text AS func_schema,
        obj_description(p.oid),
        pg_catalog.pg_get_function_arguments(p.oid) AS args,                
        pg_get_function_result(p.oid) AS rettype
    FROM 
        pg_proc P
)
SELECT 
        * 
    FROM 
        funcs
    WHERE
        (args ~~ '%abstime%'
            OR rettype = 'abstime'
        )
        AND func_schema <> 'pg_catalog' 

其他表格/意见:

代码语言:javascript
运行
复制
SELECT * FROM information_schema."columns" 
WHERE
    data_type = 'abstime'
    AND table_schema <> 'pg_catalog'

如果没有其他的功能和关系-你是幸运的。

否则:

检查每个function/relation

  • decide如何修改它们或委托给其他

  • ,更改它们

  • 重新启动升级进程
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68596185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档