【发布时间】: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
-
更新软件包并安装 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 -
以普通(默认用户)用户身份返回并清理旧版本的烂摊子
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