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中,可以改变一个字符串的一部分,从说bar要baz在一个变量$foo,通过使用${foo/bar/baz}(注意这并不会改变变量,而是返回变量的修改的内容)。数组也可用于${x/y/z}检索一个数组,同时替换其所有内容。该变量$@是一个数组,其中包含传递给程序/脚本/函数的所有参数,因此新的 pg_ctl 脚本执行旧的脚本,所有参数都从旧的目录名称更改为新的。
我有同样的问题。我正在从 Fedora Repo 的 9.2.4 升级到 PGDG 9.3。问题的根源在于 Fedora 将参数更改向后移植unix_socket_directory到unix_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) ?
Run Code Online (Sandbox Code Playgroud)
,就我而言,我将其更改为:
199: (GET_MAJOR_VERSION(cluster->major_version) < 900) ?
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10658 次 |
| 最近记录: |