как аккуратно остановить все процессы postgres

как аккуратно остановить все процессы postgres

Как можно аккуратно остановить все процессы postgres с помощью pg_ctl(или без него), если вы не помните, какой каталог находится в базе данных, и не определена ли переменная среды PGDATA?

решение1

Безопасно:

sudo pkill -u postgres

Это убивает все процессы, запущенные от имени пользователя postgres. Или:

pkill postgres

Это убивает все процессы с именем «postgres».

Делатьнетиспользуйте kill -9( kill -KILL). Просто kill(без параметров) делает SIGTERM, что вам и нужно.

В качестве альтернативы вы можете проверить местоположение pgdata, если вы можете подключиться к PostgreSQL. Например:

sudo -u postgres psql -c "SHOW data_directory";

...или проверив его переменные окружения в , где вы идентифицируете postmaster с помощью . Найдите тот, который является родителем других процессов. Например:/proc/[postmaster pid]/environps -fHC postgrespostgres

postgres   794     1  0 Nov06 ?        00:00:03 /usr/pgsql-9.3/bin/postgres -D /var/lib/pgsql/9.3/data -p 5432
postgres   857   794  0 Nov06 ?        00:00:00   postgres: logger process   
postgres   871   794  0 Nov06 ?        00:00:00   postgres: checkpointer process   
postgres   872   794  0 Nov06 ?        00:00:00   postgres: writer process   
postgres   873   794  0 Nov06 ?        00:00:00   postgres: wal writer process   
postgres   874   794  0 Nov06 ?        00:00:03   postgres: autovacuum launcher process   
postgres   875   794  0 Nov06 ?        00:00:07   postgres: stats collector process   

Его datadir обычно отображается в командной строке.

решение2

Меня нервирует, когда я вижу kill и postgres в одной команде. Чтобы ответить на вопрос, используя только pg_ctl, это будет:

pg_ctl -D $(psql -Xtc 'show data_directory') stop

Аргумент -X говорит игнорировать .psqlrcфайл. Это полезно, если у вас настроен psql для вывода времени, затраченного на запрос (через команду \timing).

Аргумент -t указывает на необходимость удаления имени столбца в верхней части вывода и общего количества созданных строк.

Аргумент -c содержит код SQL, который необходимо выполнить.

Запуск bare, psql -c 'show data_directory'вероятно, даст следующий результат:

      data_directory
--------------------------
 /path/to/postgresql/data
(1 row)

Следовательно, обратный проход $( ... )приведет /path/to/postgresql/dataк аргументу -D pg_ctl, который затем остановит базу данных в упорядоченном порядке.

решение3

Эта работа для меня реф.https://stackoverflow.com/a/5408501/248616

SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'YOUR_NAME';

решение4

Вы можете просто выполнить команду

systemctl stop postgresql

Когда вы захотите перезапустить его, запустите

systemctl start postgresql
  • Вероятно, эти команды потребуют от вас добавленияsudo

Связанный контент