Остановить экземпляр PostgreSQL по номеру порта

#postgresql

#postgresql

Вопрос:

Возможно ли остановить экземпляр postgres только по номеру порта? У меня есть pgsql, работающий на порту 5433, и когда я пытаюсь запустить:

 /usr/pgsql-10/bin/pg_ctl -D /var/lib/pgsql/new_cluster/data stop

 

Это сработает, когда я укажу -D , но, допустим, я не знаю, где находится $PGDATA, и все, что я знаю, это номер порта, на котором работает этот экземпляр, возможно ли его остановить?

 /usr/pgsql-10/bin/pg_ctl -p 5433 stop

 

выполнение этой команды приводит к:

 waiting for server to shut down.... done
server stopped

 

но когда я пытаюсь войти в этот экземпляр с помощью psql -p 5433, я все еще могу войти.
* Я знаю, что это может быть возможно с помощью systemctl, но мне нужно делать это без прав root.

Я пытаюсь это сделать, потому что: я создал резервную копию pg_basebackup и хочу остановить реальную базу данных и запустить ту, которую я только что создал с помощью резервной копии pg_basebackup на том же порту. просто чтобы убедиться, что резервная копия в порядке.

Комментарии:

1. Подсказка: netstat grep ps -eo args

2. Можете ли вы войти в систему как суперпользователь? Тогда вы могли бы выполнить psql -p 5433 -U postgres -c 'show data_directory' , прежде чем создавать резервную копию, и сохранить эти результаты где-нибудь.

3. Нет, я не могу войти в суперпользователя. И я, кажется, не могу найти команду pg_lsclusters (не в /usr/pgsql-10/bin/ …)

Ответ №1:

-p не является номером порта в pg_ctl . В документации говорится:

-p path

Указывает местоположение postgres исполняемого файла. По умолчанию postgres исполняемый файл берется из того же каталога, pg_ctl что и каталог встроенной установки, или в противном случае. Нет необходимости использовать эту опцию, если только вы не делаете что-то необычное и не получаете сообщения о том, что postgres исполняемый файл не найден.

Так что это ничего pg_ctl stop не дает, поскольку это находит идентификатор процесса из postmaster.pid . Вы остановили кластер, на который PGDATA указывала переменная среды.

Если вы хотите остановить PostgreSQL по номеру порта, подключитесь как суперпользователь (или член pg_read_all_settings роли) и запустите

 SHOW config_file;
 

Затем удалите postgresql.conf из вывода, и у вас будет аргумент для использования -D . Это можно легко запрограммировать.

Комментарии:

1. И если у меня нет прав суперпользователя… все еще возможно остановить PostgreSQL только по номеру порта? или иметь возможность находить $PGDATA по порту, а затем использовать pg_ctl?

2. Этого достаточно, если пользователь является членом pg_read_all_settings . В противном случае у вас нет возможности узнать каталог данных. Но я не понимаю: если вы не можете быть суперпользователем, у вас также нет права останавливать сервер.

3. Я могу подключиться как postgres, но какая команда должна найти путь к $PGDATA?

4. Я написал это в своем ответе: SHOW config_file; , затем удалите имя файла.