pg_upgrade нерозпізнаний параметр конфігурації "unix_socket_directory"


13

Я намагаюся оновити Postgresql з 9,2 до 9,3 у Fedora 18, використовуючи цю команду як користувач 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

Помилка в журналі

команда: "/ 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_directories(множиною) у 9.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

Я зламав проблему, запустивши (як 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

Запустіть pg_upgradeза призначенням та скасуйте злом:

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

Проблема полягає в тому, що pg_upgrade виконує програму pg_ctrl з аргументами, які задають файли у старому "unix_socket_directory", а не в новому "unix_socket_directories" (зауважте, другий є множиною). Цей хак перейменовує оригінал /usr/bin/pg_ctlна /usr/bin/pg_ctl-orig, а потім створює на своєму місці скрипт оболонки, який просто викликає оригінальну програму pg_ctl, передаючи всі аргументи з будь-якими рядками "unix_socket_directory", зміненими на "unix_socket_directories".

У bash можна змінити частину рядка, скажімо, barна bazзмінну $foo, використовуючи ${foo/bar/baz}(зауважте, це не змінює змінну, а швидше повертає змінений зміст змінної). Масиви також можна використовувати ${x/y/z}для отримання масиву з заміненим усім його вмістом, і все відразу. Змінна $@- це масив, який містить усі аргументи, передані програмі / скрипту / функції, тому новий скрипт pg_ctl виконує старий з усіма аргументами, зміненими зі старого імені каталогу на новий.


3
це дійсно дозволило мені оновити postgres 9.2 до 9.6 на Centos 7! Дякую!
sunsetjunks

2
Для мене це чудово працювало з 9,2 до 9,6. Дуже дякую! Не маю уявлення, що я зробив би без цієї відповіді!
SebK

Працював і для мене, ідучи з 9.2 до 9.6 на Centos 7
Габріель Терон

1
Можливо, пояснення хитрості баш-хаку може допомогти іншим вирішувати подібні проблеми в майбутньому. Це серйозне скручування
башти

Відмінне та елегантне рішення, бездоганно працювало для переходу з PostgreSQL 9.2 до 10.7 на CentOS 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 змінили параметр , unix_socket_directoryщоб unix_socket_directoriesу версії 9.3. Але сервіс Fedora підтримує його до нижчої версії. Так, pg_upgradeвід PGDG (PostgreSQL Global Development Group) репозиторій YUM очікує, що версія 9.2.4 приймає unix_socket_directory, але насправді 9.2.4 з Fedora YUM Repository приймає unix_socket_directories. У цьому випадку, оскільки Fedora підтримує її у версії 9.0, я змінив її на unix_socket_directoriesверсію> = 9.0.
Алі Акбар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.