Upgrading postgres 11 to 12



我试图迁移我的postgres 11实例到12,下面https://stackoverflow.com/a/62198992但我被困住了。我已经做了备份,安装了postgres 12

运行检查

/usr/lib/postgresql/12/bin/pg_upgrade --old-datadir=/var/lib/postgresql/11/main --new-datadir=/var/lib/postgresql/12/main --old-bindir=/usr/lib/postgresql/11/bin --new-bindir=/usr/lib/postgresql/12/bin --old-options '-c config_file=/etc/postgresql/11/main/postgresql.conf' --new-options '-c config_file=/etc/postgresql/12/main/postgresql.conf' -O "-c timescaledb.restoring=on" --check

返回一串'ok'和集群是兼容的

然后在升级过程中,我得到错误:

pg_restore: from TOC entry 5992; 0 0 ACL FUNCTION "abstime"(timestamp without time zone) postgres
pg_restore: error: could not execute query: ERROR:  function pg_catalog.abstime(timestamp without time zone) does not exist
Command was: GRANT ALL ON FUNCTION "pg_catalog"."abstime"(timestamp without time zone) TO "admin";

试着用谷歌搜索,但没有成功。有提示吗?

__

i dump schema,在那里我找到了abstime

GRANT ALL ON FUNCTION pg_catalog.abstime(timestamp without time zone) TO admin;
GRANT ALL ON FUNCTION pg_catalog.abstime(timestamp with time zone) TO admin;
GRANT ALL ON FUNCTION pg_catalog.abstimeeq(abstime, abstime) TO admin;
GRANT ALL ON FUNCTION pg_catalog.abstimege(abstime, abstime) TO admin;
GRANT ALL ON FUNCTION pg_catalog.abstimegt(abstime, abstime) TO admin;
GRANT ALL ON FUNCTION pg_catalog.abstimein(cstring) TO admin;
GRANT ALL ON FUNCTION pg_catalog.abstimele(abstime, abstime) TO admin;
GRANT ALL ON FUNCTION pg_catalog.abstimelt(abstime, abstime) TO admin;
GRANT ALL ON FUNCTION pg_catalog.abstimene(abstime, abstime) TO admin;
GRANT ALL ON FUNCTION pg_catalog.abstimeout(abstime) TO admin;
GRANT ALL ON FUNCTION pg_catalog.abstimerecv(internal) TO admin;
GRANT ALL ON FUNCTION pg_catalog.abstimesend(abstime) TO admin;
GRANT ALL ON FUNCTION pg_catalog.btabstimecmp(abstime, abstime) TO admin;
GRANT ALL ON FUNCTION pg_catalog.date(abstime) TO admin;
GRANT ALL ON FUNCTION pg_catalog.date_part(text, abstime) TO admin;
GRANT ALL ON FUNCTION pg_catalog.intinterval(abstime, tinterval) TO admin;
GRANT ALL ON FUNCTION pg_catalog.isfinite(abstime) TO admin;
GRANT ALL ON FUNCTION pg_catalog.mktinterval(abstime, abstime) TO admin;
GRANT ALL ON FUNCTION pg_catalog."time"(abstime) TO admin;
GRANT ALL ON FUNCTION pg_catalog.timemi(abstime, reltime) TO admin;
GRANT ALL ON FUNCTION pg_catalog.timepl(abstime, reltime) TO admin;
GRANT ALL ON FUNCTION pg_catalog."timestamp"(abstime) TO admin;
GRANT ALL ON FUNCTION pg_catalog.timestamptz(abstime) TO admin;
GRANT ALL ON FUNCTION pg_catalog.tinterval(abstime, abstime) TO admin;
GRANT ALL ON FUNCTION pg_catalog.max(abstime) TO admin;
GRANT ALL ON FUNCTION pg_catalog.min(abstime) TO admin;

__

编辑2进一步挖掘,我发现pg_shadowpg_user中的valuntil列是abstime型的有什么办法吗?

旧系统编目表中是否存在abstime类型的列无关紧要。系统目录在升级过程中不会被转移,它们是"空目录"的一部分。需要使用initdb创建的集群,因此在新系统中将具有不同的类型。

您需要撤销对"admin"的授权。在旧集群上执行升级操作。我不清楚这个权限从何而来,因为catalog功能是自动授予public的,所以不需要授予特定的角色。

您可能认为--check没有捕捉到这个问题是一个bug。尽管我不知道期望它能抓住所有可能的问题是否合理。

最新更新