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

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

4 ответа

Решение

Это безопасно:

sudo pkill -u postgres

(убивает все процы, работающие от имени пользователя postgres) или же

pkill postgres

(убивает все проки с именем 'postgres')

Не использовать kill -9 (kill -KILL). kill без вариантов делает SIGTERM, чего ты хочешь.

Кроме того, вы можете проверить местоположение pgdata, если вы можете подключиться к Pg, например,

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

... или проверяя его переменные окружения в /proc/[postmaster pid]/environ

где вы отождествляете почтмейстера с ps -fHC postgres; искать тот, который является родителем другого postgres процессы, например

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   

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

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

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

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

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

Аргумент -c содержит код SQL для выполнения.

Работает голым psql -c 'show data_directory' вероятно выдаст следующий вывод:

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

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

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

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

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

      systemctl stop postgresql

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

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