pg 9.2.24 升级到 pg 10的时候报如下错:
command: "/usr/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_s ocket_directory='/var/lib/pgsql/data'" start >> "pg_upgrade_server.log" 2>&1
waiting for server to start....FATAL: unrecognized configuration parameter "unix_socket_directory"
stopped waiting
pg_ctl: could not start server
Examine the log output.
报错原因:
算是个bug吧,9.2.0 是 unix_socket_directory,但9.2.24已经改成unix_socket_directories了,升级程序没有做小版本的判断,一古脑全用 unix_socket_directories 代入。
实测如果用更低的9.2.0版本的pg_ctl就可以正常升级,但考虑到用低版本的可能会有别的未知异常所以还是建议如下解决方案。
解决方案:
修改pg_ctl命令,强制将输入参数中的unix_socket_directory替换为unix_socket_directories
root用户,将pg_ctl改名,并新建脚本用来替换不支持的参数名
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_ctl文件内容:
#!/bin/bash
"$0"-orig "${@/unix_socket_directory/unix_socket_directories}"
更新完成后恢复pg_ctl即可。