Завершение работы сервера
Эта страница переведена при помощи нейросети GigaChat.
Существует несколько способов остановки сервера баз данных. В основе своей они все сводятся к отправке сигнала процессу супервизора postgres
.
Если используется предварительно упакованная версия PostgreSQL и она использовалась для запуска сервера, то для остановки сервера также следует использовать ее. Подробности можно найти в документации уровня пакета.
При непосредственном управлении сервером можно контролировать тип завершения работы, отправляя различные сигналы процессу postgres
.
Сигналы для остановки сервера баз данных
SIGTERM
Это режим умного завершения работы. После получения SIGTERM сервер запрещает новые соединения, но позволяет существующим сессиям завершить свою работу нормально. Он завершает работу только после завершения всех сессий. Если сервер находится в режиме восстановления при запросе умного завершения работы, восстановление и потоковая репликация будут остановлены только после завершения всех обычных сеансов.
SIGINT
Это режим быстрой остановки. Сервер запрещает новые соединения и отправляет всем существующим процессам сервера SIGTERM, что приведет к тому, что они прерывают текущие транзакции и быстро завершают работу. Затем он ждет завершения работы всех процессов сервера и наконец завершает работу.
SIGQUIT
Это режим немедленной остановки. Сервер будет отправлять сигнал SIGQUIT всем дочерним процессам и ждать их завершения. Если какие-либо из них не завершатся в течение 5 секунд, им будет отправлен сигнал SIGKILL. Управляющий серверный процесс выходит сразу после того, как все дочерние процессы завершили свою работу, без выполнения обычной обработки завершения работы базы данных. Это приведет к восстановлению (путем воспроизведения журнала WAL) при следующем запуске. Рекомендуется только в экстренных случаях.
Программа pg_ctl предоставляет удобный интерфейс для отправки этих сигналов для завершения работы сервера. В качестве альтернативы можно отправить сигнал напрямую с помощью kill
в не-Windows системах. PID процесса postgres
можно найти с использованием программы ps
, или из файла postmaster.pid
в каталоге данных. Например, чтобы выполнить быстрое завершение работы:
$ kill -INT `head -1 /usr/local/pgsql/data/postmaster.pid`
Важно
Не рекомендуется использовать SIGKILL для завершения работы сервера. Это предотвратит освобождение сервером общей памяти и семафоров. Кроме того, SIGKILL убивает процесс postgres
без передачи сигнала его подпрограммам, поэтому может потребоваться вручную завершить отдельные подпроцессы.
Чтобы завершить отдельную сессию, позволяя другим сессиям продолжаться, используйте pg_terminate_backend()
(см. таблицу 9.88) или отправьте сигнал SIGTERM дочернему процессу, связанному с этой сессией.