2

我正在运行一个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数据类型已在postgresql12 中删除。这里有人知道如何解决此问题,以便我可以继续升级吗?请让我知道,谢谢!另外,如果您有任何问题,我会全力以赴。

4

1 回答 1

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'

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

否则:

  • 检查每个功能/关系
  • 决定如何修改它们或将其委托给其他人
  • 改变它们
  • 重启升级过程
于 2021-07-31T06:32:08.280 回答