由于 "type abstime does not exist",Postgresql 从 11 升级到 12 失败

Postgresql Upgrade from 11 to 12 fails due to "type abstime does not exist"

我是 运行 一个旧的 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. Return 作为普通(默认用户)用户清理旧版本的混乱

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

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

函数“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' 

其他tables/views:

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

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

否则:

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