pg_upgrade无法识别的配置参数“ unix_socket_directory”


13

我正在尝试使用此命令作为postgres用户将Fedora 18中的Postgresql从9.2升级到9.3

$ pg_upgrade -b /bin -B /usr/pgsql-9.3/bin -d /var/lib/pgsql/data -D /var/lib/pgsql/9.3/data/ -j 2 -u postgres

日志中的错误

命令:“ / bin / pg_ctl” -w -l“ pg_upgrade_server.log” -D“ / var / lib / pgsql / data” -o“ -p 50432 -b -c listen_addresses =” -c unix_socket_permissions = 0700 -c unix_socket_directory ='/ var / lib / pgsql'“开始>>” pg_upgrade_server.log“ 2>&1等待服务器启动.... FATAL:无法识别的配置参数” unix_socket_directory“ ....停止等待pg_ctl:无法启动服务器

正如a_horse在注释中指出的那样,该参数unix_socket_directories在9.3中被(复数)替换。但是正在启动的服务器版本是旧的9.2:

$ /bin/pg_ctl --version
pg_ctl (PostgreSQL) 9.2.4

有任何想法吗?



@a_horse该命令尝试启动9.2版。检查更新的问题
Clodoaldo

要明确查看分发中使用的参数,可以运行postgres --describe-config | grep -o 'unix_socket_director\w*'
Randall

Answers:


25

我通过运行(以root用户身份)解决了这个问题:

mv /usr/bin/pg_ctl{,-orig}
echo '#!/bin/bash' > /usr/bin/pg_ctl
echo '"$0"-orig "${@/unix_socket_directory/unix_socket_directories}"' >> 
     /usr/bin/pg_ctl
chmod +x /usr/bin/pg_ctl

pg_upgrade按预期运行,然后撤消hack:

mv -f /usr/bin/pg_ctl{-orig,}

问题是pg_upgrade用指定旧“ unix_socket_directory”而不是新“ unix_socket_directories”中文件的参数执行pg_ctrl程序(注意第二个是复数)。此hack将原始名称重命名/usr/bin/pg_ctl/usr/bin/pg_ctl-orig,然后在其位置创建一个shell脚本,该脚本仅调用原始pg_ctl程序,并将所有参数更改为“ unix_socket_directory”的所有字符串传递。

在bash中,可以改变一个字符串的一部分,从说barbaz在一个变量$foo,通过使用${foo/bar/baz}(注意这并不会改变变量,而是返回变量的修改的内容)。数组也可用于${x/y/z}检索数组并替换掉所有内容。变量$@是一个数组,其中包含传递给program / script / function的所有参数,因此新的pg_ctl脚本执行旧参数,并将所有参数从旧目录名更改为新目录。


3
这确实使我能够在Centos 7上将PostgreSQL 9.2升级到9.6!谢谢!
sunsetjunks

2
从9.2升级到9.6对我来说很棒。非常感谢!不知道没有这个答案我该怎么办!
SebK '18

也为我工作,在Centos 7上从9.2升至9.6
加布里埃尔·塞隆

1
也许解释bash hack的诡计可能会在将来帮助其他人解决类似的问题。这是一些严重的bash扭曲:-)
xor007 '18

优秀且优雅的解决方案,在CentOS 7上从PostgreSQL 9.2到10.7的完美运行
wfgeo

5

我有同样的问题。我正在从Fedora Repo的9.2.4升级到PGDG 9.3。该问题的根源在于,Fedora的反向移植参数的改变unix_socket_directoryunix_socket_directories(见https://bugzilla.redhat.com/show_bug.cgi?id=853353)。

我的解决办法是重建的pg_upgrade来源,以更新文件contrib/pg_upgrade/server.c:199,其中pg_upgrade服务器版本检查:

199:       (GET_MAJOR_VERSION(cluster->major_version) < 903) ?

,就我而言,我将其更改为:

199:       (GET_MAJOR_VERSION(cluster->major_version) < 900) ?

在此处查看我的补丁文件)。


您能否解释一下这是为什么解决此问题的呢(针对像我这样的人,他们对信息来源不太熟悉(请注意轻描淡写!))?
dezso

4
按照上述@a_horse评论,上游的PostgreSQL已经改变了参数unix_socket_directory,以unix_socket_directories在9.3版本。但是Fedora维护人员会将其反向移植到较低版本。因此,pg_upgrade来自PGDG(PostgreSQL全球发展集团)的YUM Repository期望接受9.2.4版本unix_socket_directory,但实际上来自Fedora YUM Repository的9.2.4接受unix_socket_directories。在这种情况下,由于Fedora将其向后移植到9.0版以上,因此我将其更改为unix_socket_directories用于> = 9.0版。
阿里·阿克巴尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.