Я пытаюсь обновить 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
Есть идеи?
postgresql
upgrade
Clodoaldo
источник
источник
unix_socket_directories
: postgresql.org/docs/current/static/release-9-3.html#AEN114343postgres --describe-config | grep -o 'unix_socket_director\w*'
Ответы:
Я взломал проблему, запустив (от имени root):
Запустите,
pg_upgrade
как задумано, затем отмените взломать:Проблема в том, что 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 выполняет старый со всеми аргументами, измененными со старого имени каталога на новое.источник
У меня та же проблема. Я обновлялся с 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
проверяется версия сервера:в моем случае я изменяю это на:
(см. мой файл патча здесь ).
источник
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.