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' "start >>"pg_upgrade_server.log "2> & 1 서버가 시작되기를 기다리는 중 ...... FATAL : 인식 할 수없는 구성 매개 변수"unix_socket_directory ".... 대기 중지 pg_ctl : 시작할 수 없습니다 섬기는 사람

주석에서 a_horse 가 지적한 것처럼 unix_socket_directories9.3에서 매개 변수가 (복수) 로 대체되었습니다 . 그러나 시작되는 서버 버전은 이전 9.2입니다.

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

어떤 아이디어?


2
그 매개 변수로 이름이 바뀌 었습니다 unix_socket_directories: postgresql.org/docs/current/static/release-9-3.html#AEN114343
a_horse_with_no_name

@a_horse이 명령은 버전 9.2를 시작하려고합니다. 업데이트 된 질문 확인
Clodoaldo

배포에서 사용중인 매개 변수를 명시 적으로 보려면 다음을 실행하십시오.postgres --describe-config | grep -o 'unix_socket_director\w*'
Randall

답변:


25

(루트로) 실행하여 문제를 해킹했습니다.

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의도 한대로 실행 한 다음 해킹을 취소하십시오.

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

문제는 pg_upgrade가 새로운 "unix_socket_directories"가 아닌 이전 "unix_socket_directory"에 파일을 지정하는 인수와 함께 pg_ctrl 프로그램을 실행한다는 것입니다 (두 번째는 복수형입니다). 이 해킹은 원래의 이름을 변경 /usr/bin/pg_ctl하는 방법에 대해 /usr/bin/pg_ctl-orig다음 단순히 "unix_socket_directories"로 변경 모든 문자열 "unix_socket_directory"모든 인수를 전달, 원래 pg_ctl 프로그램을 호출 그 자리에서 쉘 스크립트를 작성합니다.

bash는, 하나의 문자열의 일부를 변경할 수 있습니다에서 말 barbaz변수에 $foo사용하여, ${foo/bar/baz}(이 변수를 변경하지 않습니다, 오히려 변수의 수정 내용을 반환). 또한 배열을 사용하여 ${x/y/z}모든 내용을 한 번에 교체 한 배열을 검색 할 수 있습니다 . 변수 $@는 program / script / function에 전달 된 모든 인수를 포함하는 배열이므로 새 pg_ctl 스크립트는 이전 인수를 이전 디렉토리 이름에서 새 것으로 변경하여 이전 인수를 실행합니다.


3
이것은 정말로 Centos 7에서 postgres 9.2를 9.6으로 업그레이드 할 수있게했습니다! 감사!
sunsetjunks

2
9.2에서 9.6으로가는 데 효과적이었습니다. 정말 고마워! 이 대답없이 내가 뭘했는지 모르겠다!
SebK

Centos 7에서 9.2에서 9.6으로 이동하여 저를 위해 일했습니다.
Gabriel Theron

1
bash hack의 속임수를 설명하면 나중에 다른 사람들이 비슷한 문제를 처리하는 데 도움이 될 수 있습니다. 이것은 심각한 배쉬 왜곡입니다 :-)
xor007

우수하고 우아한 솔루션으로 CentOS 7에서 PostgreSQL 9.2에서 10.7로 완벽하게 전환되었습니다
wfgeo

5

나는 같은 문제가 있습니다. 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) ?

내 경우에는 다음과 같이 변경합니다.

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

( 여기서 패치 파일 참조 ).


왜 이것이 문제를 해결하는지 설명해 주시겠습니까?
dezso

4
위의 @a_horse 의견에 따라 업스트림 PostgreSQL은 버전 9.3에서 매개 변수 unix_socket_directoryunix_socket_directories로 변경했습니다 . 그러나 Fedora 관리자는이를 하위 버전으로 백 포트합니다. 따라서 pg_upgradePGDG (PostgreSQL Global Development Group)에서 YUM 리포지토리는 9.2.4 버전은 허용 unix_socket_directory하지만 실제로 Fedora YUM 리포지토리의 9.2.4는 허용 unix_socket_directories합니다. 이 경우 Fedora는이를 9.0 이후 버전으로 백 포트하기 때문에 unix_socket_directories버전> = 9.0에 사용하도록 변경했습니다 .
Ali Akbar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.