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?


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.


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 ).


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.