17.5. Выключение сервера#

17.5. Выключение сервера

17.5. Выключение сервера

Существует несколько способов выключить сервер базы данных. Под капотом все они сводятся к отправке сигнала надзирателю процесса postgres.

Если вы используете предварительно упакованную версию Tantor SE-1C и использовали ее возможности для запуска сервера, то вам также следует использовать ее возможности для остановки сервера. Подробности можно найти в документации на уровне пакета.

При управлении сервером напрямую вы можете контролировать тип завершения путем отправки различных сигналов процессу postgres:

SIGTERM

Это режим Smart Shutdown. После получения сигнала 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 дочернему процессу, связанному с данной сессией.