【问题标题】:Postgresql Upgrade from 11 to 12 fails due to "type abstime does not exist"由于“类型 abstime 不存在”,Postgresql 从 11 升级到 12 失败
【发布时间】:2021-10-06 07:22:31
【问题描述】:

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

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 update
    sudo yum install postgresql12
    
  2. 停止 postgresql 服务

    sudo systemctl stop postgresql-11.service
    sudo systemctl stop postgresql-12.service
    
  3. 再次以postgres用户身份登录

    sudo su postgres
    
  4. 切换到主目录

    cd ~
    
  5. 迁移数据

    /usr/pgsql-12/bin/pg_upgrade --old-datadir=/var/lib/pgsql/11/data --new-datadir=/var/lib/pgsql/12/data --old-bindir=/usr/pgsql-11/bin --new-bindir=/usr/pgsql-12/bin --old-options '-c config_file=/var/lib/pgsql/11/data/postgresql.conf' --new-options '-c config_file=/var/lib/pgsql/12/data/postgresql.conf'
    
  6. 切换到普通用户

     exit
    
  7. 交换新旧 postgres 版本的端口。

     sudo nano /var/lib/pgsql/12/data/postgresql.conf
     _change port to 5432_
     sudo nano /var/lib/pgsql/11/data/postgresql.conf
     _change port to 5433_
    
  8. 启动postgresql服务

     sudo systemctl start postgresql-12.service
    
  9. 以 postgres 用户身份登录

    sudo su postgres
    cd ~
    
  10. 检查您的新 postgres 版本

    psql -c "SELECT version();"
    
  11. 运行生成的新集群脚本

     ./analyze_new_cluster.sh
    
  12. 以普通(默认用户)用户身份返回并清理旧版本的烂摊子

    exit
    sudo yum remove postgresql11
    sudo rm -rf /etc/postgresql/11/
    sudo su postgres
    cd ~
    ./delete_old_cluster.sh
    

我确定abstime 数据类型已在postgresql 12 中删除。这里有人知道如何解决此问题,以便我可以继续升级吗?请让我知道,谢谢!另外,如果您有任何问题,我会全力以赴。

【问题讨论】:

  • 我能想到的唯一方法是在 Postgres 11 实例中找到并将出现的 abstime 更改为其他内容。为此,执行pg_dump -s 以仅获取架构定义并搜索abstime 可能很有用。
  • 似乎您有一个名为"public"."Seqnextval" 的用户定义函数(根据错误输出Command was: CREATE FUNCTION "public"."Seqnextval"("abstime")...。我认为最好的选择是在使用pg_upgrade 之前删除该函数。升级后,您可以重写/重新定义函数以使用 v. 12
  • 从我在错误消息中看到的:abstime 参数未在函数内部使用。您甚至可以用anyelement 替换它。但可能还有其他函数使用abstime

标签: postgresql pg-upgrade


【解决方案1】:

函数“Seqnextval”可以做什么

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 类型的参数从不在函数中使用。

我想改成这样一定是安全的:

CREATE FUNCTION "public"."Seqnextval"(anyelement)

然后重新运行升级过程。

一般情况下abstime 可以做什么

可能还有其他函数使用abstime

寻找其他功能:

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' 

其他表/视图:

SELECT * FROM information_schema."columns" 
WHERE
    data_type = 'abstime'
    AND table_schema <> 'pg_catalog'

如果没有其他函数和关系 - 你很幸运。

否则:

  • 检查每个函数/关系
  • 决定如何修改它们或将其委托给其他人
  • 改变它们
  • 重启升级过程

【讨论】:

  • 所以我在postgres 11 中运行了DROP FUNCTION "public"."Seqnextval"("abstime") 并且有效,但是当我重新运行postgres 12 升级时,它遇到了同样的问题。知道如何防止此问题再次发生吗?
  • 原来我是错误的用户,问题解决了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-06
  • 2018-04-07
  • 1970-01-01
  • 2021-12-17
  • 2020-12-15
相关资源
最近更新 更多