#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;
, затем удалите имя файла.