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

Clo*_*ldo 16 postgresql upgrade

我正在尝试使用此命令作为 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
Run Code Online (Sandbox Code Playgroud)

日志中的错误

命令:"/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'" start >> "pg_upgrade_server.log" 2>&1 等待服务器启动......致命:无法识别的配置参数“unix_socket_directory”......停止等待 pg_ctl:无法启动服务器

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

$ /bin/pg_ctl --version
pg_ctl (PostgreSQL) 9.2.4
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Eze*_*nay 30

我通过运行(以 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
Run Code Online (Sandbox Code Playgroud)

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

    mv -f /usr/bin/pg_ctl{-orig,}
Run Code Online (Sandbox Code Playgroud)

问题是 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”更改为“unix_socket_directories”。

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

  • 这真的让我可以在 Centos 7 上将 postgres 9.2 升级到 9.6!谢谢! (4认同)
  • 从 9.2 到 9.6 对我来说效果很好。非常感谢!不知道如果没有这个答案我会做什么! (3认同)

Ali*_*bar 6

我有同样的问题。我正在从 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:199pg_upgrade检查服务器版本:

199:       (GET_MAJOR_VERSION(cluster->major_version) < 903) ?
Run Code Online (Sandbox Code Playgroud)

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

199:       (GET_MAJOR_VERSION(cluster->major_version) < 900) ?
Run Code Online (Sandbox Code Playgroud)

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

  • 根据上面的@a_horse 评论,上游 PostgreSQL 在 9.3 版本中将参数 `unix_socket_directory` 更改为 `unix_socket_directories`。但是 Fedora 维护者将其反向移植到较低版本。因此,来自 PGDG(PostgreSQL 全球开发组)YUM 存储库的 `pg_upgrade` 期望 9.2.4 版本接受 `unix_socket_directory`,但实际上来自 Fedora YUM 存储库的 9.2.4 接受`unix_socket_directories`。在这种情况下,因为 Fedora 将其向后移植到 9.0 版以上,所以我将其更改为使用 `unix_socket_directories` 版本 &gt;= 9.0。 (4认同)