воскресенье, 6 января 2013 г.

17.5. Остановка сервера


Есть несколько способов выключить сервер БД. Вы можете определить способ остановки сервера, посылая разные сигналы главному процессу postgres.

SIGTERM
Это режим "умного выключения" (smart shutdown). После получения сигнала SIGTERM сервер запрещает создание новых подключений, но уже существующие работают нормально. Выключение происходит только после того, как разорваны все соединения. Если сервер находится в режиме online backup, то новые подключения всё ещё можно создать, но только для суперпользователя (это позволит суперпользователю подлкючиться и остановить процесс создания резервной копии). Если сервер находится в режиме восстановления, то восстановление и потоковая репликация останавливаются только после того, как завершаются все сессии
SIGINT
Это режим "быстрого выключения" (fast shutdown). Сервер запрещает создание новых подключений и посылает всем существующим процессам сервера сигнал SIGTERM, что завершает их работу. После того, как все процессы завершат свою работу, останавливается и главный процесс. Если сервер находится в режиме online backup, то оно тут же прерывается.
SIGQUIT
Это режим "немедленного выключения" (immediate shutdown). Главный процесс postgres посылает сигнал SIGQUIT всем дочерним процессам и завершается сам, не дожидаясь их завершения. Дочерние процессы так же завершаются сразу же по получении сигнала. Это приведёт к восстановлению (воспроизведению 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-55) или пошлите SIGTERN дочернему процессу, связанному с этой сессией.

Комментариев нет:

Отправить комментарий