前两天pg11刚出来,打算测试一下,想将测试库升级到pg11,之前测试库的版本是pg9.6,后面我将它升到了pg10,打算在pg10的版本基础上升级到pg11。
但执行时,多次报出:
Performing Consistency Checks-----------------------------Checking cluster versions okChecking database user is the install user okChecking database connection settings okChecking for prepared transactions okChecking for reg* data types in user tables okChecking for contrib/isn with bigint-passing mismatch okChecking for presence of required libraries okChecking database user is the install user Only the install user can be defined in the new cluster.
所以就搜了一下代码,在src/bin/pg_upgrade/check.c中找到该报错的原因
/* * We only allow the install user in the new cluster because other defined * users might match users defined in the old cluster and generate an * error during pg_dump restore. */ if (cluster == &new_cluster && atooid(PQgetvalue(res, 0, 0)) != 1) pg_fatal("Only the install user can be defined in the new cluster.\n");
pg_upgrade升级时,只允许使用安装新集群时所用的用户,这是因为在旧集群中存在的用户在执行pg_dump和restore时,可能会报错。
后面又查了一下环境变量,发现环境变量中配置了一个测试库的用户,而不是postgres用户。怀疑无论是在做initdb还是pg_upgrade时,都不应该走环境变量的用户,而且在执行pg_upgrade时,已经明确指定了使用postgres,那么可能出在initdb上,但重新测试发现无论initdb时,指没指定是否是postgres用户,都是按照postgres来初始化的,它是跟着操作系统用户走的。后来又重试了几遍,发现执行检测没问题,但到了实际执行时,总会报Only the install user can be defined in the new cluster的错误,然后删掉生成pg11版本的表空间数据,删掉初始化的新集群,再重新初始化,然后执行pg_ugrade的检测和实际执行就又变正常了,至此感觉碰到了bug。反复操作了三四次都是同样的结果。
如有知道原因的请告知一下,谢谢。
另外,在安装pg11时,注意参数--wal-segsize放在了initdb部分,需要在做初始化时设置,在编译部分已经没有这个参数了。