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

Есть идеи?

Clodoaldo
источник
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".

В Баш, можно изменить часть строки, скажем , от barк bazв переменной $foo, с помощью ${foo/bar/baz}(заметим , это не меняет переменную, а возвращает измененное содержимое переменной). Массивы также можно использовать ${x/y/z}для извлечения массива с заменой всего его содержимого одновременно. Переменная $@является массивом, который содержит все аргументы, переданные программе / скрипту / функции, поэтому новый скрипт pg_ctl выполняет старый со всеми аргументами, измененными со старого имени каталога на новое.

Ziggy Crueltyfree Zeitgeister
источник
3
это действительно позволило мне обновить postgres 9.2 до 9.6 на Centos 7! Благодарность!
sunsetjunks
2
Отлично сработало для меня с 9,2 до 9,6. Спасибо! Не знаю, что бы я делал без этого ответа!
SebK
У меня тоже получалось, с 9,2 до 9,6 на Centos 7
Габриэль Терон
1
Возможно, объяснение хитрости взлома может помочь другим в будущем справиться с подобными проблемами. Это серьезный поворот в bash :-)
xor007
Отличное и элегантное решение, безупречно сработало для перехода с PostgreSQL 9.2 на 10.7 на CentOS 7
wfgeo
5

У меня та же проблема. Я обновлялся с 9.2.4 Fedora Repo до 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) ?

(см. мой файл патча здесь ).

Али Акбар
источник
Не могли бы вы объяснить, почему это решает проблему (для таких, как я, которые не слишком знакомы с источниками (остерегайтесь занижения!))?
Дезсо
4
Согласно @a_horse комментарий выше, вверх по течению PostgreSQL изменили параметр , unix_socket_directoryчтобы unix_socket_directoriesв версии 9.3. Но сопровождающий Fedora поддерживает его более раннюю версию. Итак, pg_upgradeот PGDG (PostgreSQL Global Development Group) YUM Repository ожидает, что версия 9.2.4 принимает unix_socket_directory, но фактически 9.2.4 из Fedora YUM Repository принимает unix_socket_directories. В этом случае, поскольку Fedora возвращает его обратно в версию 9.0, я изменил ее для использования unix_socket_directoriesв версии> = 9.0.
Али Акбар