pg_upgrade nierozpoznany parametr konfiguracyjny „unix_socket_directory”

13

Próbuję zaktualizować Postgresql z 9.2 do 9.3 w Fedorze 18, używając tego polecenia jako użytkownika postgres

$ 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

Błąd w dzienniku

polecenie: "/ 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> i 1 czeka na uruchomienie serwera .... FATAL: nierozpoznany parametr konfiguracyjny" unix_socket_directory ".... przestał czekać pg_ctl: nie można uruchomić serwer

Jak wskazał a_horse w komentarzach, parametr ten został zastąpiony przez unix_socket_directories(liczba mnoga) w 9.3. Ale uruchamiana wersja serwera to stara 9.2:

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

Jakieś pomysły?

Clodoaldo
źródło
2
Nazwa tego parametru została zmieniona na unix_socket_directories: postgresql.org/docs/current/static/release-9-3.html#AEN114343
a_horse_w_na_nazwie
@ a_horse To polecenie próbuje uruchomić wersję 9.2. Sprawdź zaktualizowane pytanie
Clodoaldo,
Aby wyraźnie zobaczyć, który parametr jest używany w twojej dystrybucji, możesz uruchomićpostgres --describe-config | grep -o 'unix_socket_director\w*'
Randall

Odpowiedzi:

25

Zhakowałem problem, uruchamiając (jako 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

Uruchom pg_upgradezgodnie z przeznaczeniem, a następnie cofnij włamanie:

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

Problem polega na tym, że pg_upgrade wykonuje program pg_ctrl z argumentami, które określają pliki w starym „katalogu_socket_directory” zamiast w nowych „katalogach_socket_xocket” (zauważ, że drugi jest w liczbie mnogiej). Ten Hack zmienia nazwę oryginalnego /usr/bin/pg_ctldo /usr/bin/pg_ctl-orig, a następnie tworzy skrypt na swoim miejscu, że po prostu wywołuje oryginalny program pg_ctl, przekazując wszystkie argumenty ze strun „unix_socket_directory” zmieniono na „unix_socket_directories”.

W bashu można zmienić część ciągu, powiedzmy od bardo bazw zmiennej $foo, używając ${foo/bar/baz}(zauważ, że to nie zmienia zmiennej, ale zwraca zmodyfikowaną zawartość zmiennej). Tablic można również używać ${x/y/z}do pobierania tablicy z całą zawartością zastąpioną jednocześnie. Zmienna $@jest tablicą zawierającą wszystkie argumenty przekazane do programu / skryptu / funkcji, więc nowy skrypt pg_ctl wykonuje stary ze wszystkimi argumentami zmienionymi ze starej nazwy katalogu na nowy.

Ziggy Crueltyfree Zeitgeister
źródło
3
to naprawdę pozwoliło mi zaktualizować postgres 9.2 do 9.6 na Centos 7! Dzięki!
sunsetjunks
2
Świetnie działało dla mnie przejście z 9,2 na 9,6. Dzięki wielkie! Nie mam pojęcia, co bym zrobił bez tej odpowiedzi!
SebK
Pracowałem też dla mnie, przechodząc z wersji 9.2 do 9.6 na Centos 7
Gabriel Theron,
1
Być może wyjaśnienie sztuczki związanej z hackiem bashowym może pomóc innym w poradzeniu sobie z podobnymi problemami w przyszłości. To jest poważne przekręcenie bash :-)
xor007
Doskonałe i eleganckie rozwiązanie, pracował bezawaryjnie przez dzieje z PostgreSQL 9.2 do 10.7 na CentOS 7
wfgeo
5

Mam ten sam problem. Uaktualniałem z wersji Fedora Repo 9.2.4 do PGDG 9.3. Źródłem problemu jest to, że Fedora backportuje zmiany parametru unix_socket_directoryna unix_socket_directories(patrz https://bugzilla.redhat.com/show_bug.cgi?id=853353 ).

Moim rozwiązaniem jest przebudowanie pg_upgradeze źródeł, z aktualizacją do pliku, w contrib/pg_upgrade/server.c:199którym pg_upgradesprawdza się wersję serwera:

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

, w moim przypadku zmieniam na:

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

(zobacz mój plik łatek tutaj ).

Ali Akbar
źródło
Czy mógłbyś wyjaśnić, dlaczego to rozwiązuje problem (do takich jak ja, którzy nie są zbytnio zaznajomieni ze źródłami (strzeż się niedopowiedzenia!))?
dezso
4
Zgodnie z powyższym komentarzem @a_horse, poprzedni PostgreSQL zmienił parametr unix_socket_directoryna unix_socket_directoriesw wersji 9.3. Ale opiekun Fedory przenosi go do niższej wersji. Tak więc pg_upgradez PGDG (PostgreSQL Global Development Group) repozytorium YUM oczekuje, że wersja 9.2.4 zaakceptuje unix_socket_directory, ale tak naprawdę 9.2.4 z repozytorium YUM Fedory to zaakceptuje unix_socket_directories. W tym przypadku, ponieważ Fedora backportuje go do wersji 9.0 i nowszych, zmieniłem go, aby używał unix_socket_directoriesdla wersji> = 9.0.
Ali Akbar