Назад | Перейти на главную страницу

Как управлять разными версиями серверов PostgreSQL на одном хосте?

У меня PostgreSQL 9.4 и 9.5 на одном хосте с Ubuntu 14.04. Мои проблемы:

  1. Когда я бегу service postgresql start|stop, обе версии запускаются / останавливаются. Но я хочу контролировать, что делать.
  2. Когда я использую psql для подключения к PostgreSQL он всегда подключается к 9.4. Но я хочу контролировать, какой сервер мне делать. Я знаю, что могу подключиться через другой порт: 5432 для 9,4 и 5433 для 9,5. Но я хочу подключиться через одноранговую аутентификацию, то есть через сокет Unix.

Мне удалось найти эти подсказки для двух вышеупомянутых вопросов по отдельности, но я не решил свои проблемы:

  1. Я нахожу команду pg_ctlcluster может выполнить эту работу, но я не знаю, как указать правильные параметры, например, имя-кластера. Как я мог это понять? Или у вас есть другой способ?
  2. Сокет Unix можно настроить с помощью unix_socket_directories = '/var/run/postgresql'. Но обе версии имеют один и тот же каталог конфигурации, в котором есть подкаталоги 9.4-main.pg_stat_tmp 9.4-main.pid 9.5-main.pg_stat_tmp 9.5-main.pid для разных версий. Когда я делаю psql -h /var/run/postgresql, он просто подключается к старой версии 9.4.

Может ли кто-нибудь помочь? Спасибо!

Что ж, после еще нескольких усилий я сам получаю ответы:

  1. Ubuntu и Debian предлагают pg_ctlcluster а также сериал pg_xxxcluster команды для управления несколькими версиями / экземплярами PostgreSQL на одном хосте. Чтобы узнать версию и название кластера, просто выполните pg_lscluster, который выводит как 9.4 main 5432 online postgres /var/lib/postgresql/9.4/main /var/log/postgresql/postgresql-9.4-main.log 9.5 main 5433 online postgres /var/lib/postgresql/9.5/main /var/log/postgresql/postgresql-9.5-main.log Например, чтобы остановить 9.4, вы используете pg_ctlcluster stop 9.4 main. Кстати, чтобы отключить автозапуск 9.4, edit /etc/postgresql/9.4/main/start.conf
  2. psql нужен --port, -p возможность узнать, к какому экземпляру подключиться, даже для одноранговой аутентификации через Unix Socket, поскольку все версии имеют одинаковые unix_socket_directories. Например, psql -p 5433 dbname может подключаться через Unix Socket к версии 9.5, работающей с портом 5433, по умолчанию psql dbname подключается к порту по умолчанию 5432, который принадлежит моей старой версии 9.4.

Это оно!

В дистрибутивах на основе Debian, таких как Ubuntu, psql (и несколько других команд PostgreSQL) - это символическая ссылка на pg_wrapper, который предлагает --cluster вариант. Видеть man pg_wrapper для подробностей.

Для локальных подключений вы можете использовать

psql --cluster 9.4/main
psql --cluster 9.5/main

Чтобы увидеть свои версии, кластеры и порты, используйте pg_lsclusters. Пример вывода:

# pg_lsclusters
Ver Cluster Port Status Owner    Data directory               Log file
9.6 main    5432 online postgres /var/lib/postgresql/9.6/main /var/log/postgresql/postgresql-9.6-main.log
11  main    5433 online postgres /var/lib/postgresql/11/main  /var/log/postgresql/postgresql-11-main.log

И чтобы установить значение по умолчанию, вы можете установить предпочитаемую версию для использования порта 5432 в /etc/postgresql/*/main/postgresql.conf, и на какой-то другой порт для другой версии.

(Здесь также ответили: Запуск нескольких версий PostgreSQL на одном сервере Ubuntu )