Как красиво остановить все процессы 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