由于 "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
更新软件包并安装 postgres
sudo yum update
sudo yum install postgresql12
停止 postgresql 服务
sudo systemctl stop postgresql-11.service
sudo systemctl stop postgresql-12.service
再次以 postgres
用户身份登录
sudo su postgres
切换到主目录
cd ~
迁移数据
/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'
切换到普通用户
exit
交换新旧 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_
启动postgresql服务
sudo systemctl start postgresql-12.service
以 postgres 用户身份登录
sudo su postgres
cd ~
检查您的新 postgres 版本
psql -c "SELECT version();"
运行生成的新集群脚本
./analyze_new_cluster.sh
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
- 决定如何修改它们或将其委托给其他人
- 改变它们
- 重启升级过程
我是 运行 一个旧的 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
更新软件包并安装 postgres
sudo yum update sudo yum install postgresql12
停止 postgresql 服务
sudo systemctl stop postgresql-11.service sudo systemctl stop postgresql-12.service
再次以
postgres
用户身份登录sudo su postgres
切换到主目录
cd ~
迁移数据
/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'
切换到普通用户
exit
交换新旧 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_
启动postgresql服务
sudo systemctl start postgresql-12.service
以 postgres 用户身份登录
sudo su postgres cd ~
检查您的新 postgres 版本
psql -c "SELECT version();"
运行生成的新集群脚本
./analyze_new_cluster.sh
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
- 决定如何修改它们或将其委托给其他人
- 改变它们
- 重启升级过程