voretaq7 «сек ответ охватывает ключевые моменты, в том числе правильного способа прекратить движки , но я хотел бы добавить немного больше объяснений.
kill -9
(то есть SIGKILL
) никогда не должно быть вашим выбором по умолчанию . Это должно быть вашим последним средством, когда процесс не отвечает на свои обычные запросы на отключение и a SIGTERM
( kill -15
) не имеет никакого эффекта. Это верно для Pg и почти всего остального.
kill -9
не дает убитому процессу никакого шанса сделать какую-либо очистку вообще.
Когда дело доходит до PostgreSQL, Pg видит резервную копию, которая заканчивается kill -9
как аварийная остановка . Он знает, что бэкэнд мог испортить разделяемую память - потому что вы могли прервать ее на полпути, например, записав страницу в shm или изменив ее - поэтому он завершает работу и перезапускает все остальные бэкэнды, когда замечает, что бэкэнд внезапно исчез и вышел с ненулевым кодом ошибки.
Вы увидите это в журналах.
Если это кажется безвредным, это потому, что Pg перезапускает все после сбоя, а ваше приложение восстанавливается после потери соединений. Это не делает это хорошей идеей. Если никакие другие сбои бэкэнда не так хорошо протестированы, как нормально функционирующие части Pg, и они намного сложнее / разнообразнее, то вероятность ошибки, скрывающейся в обработке и восстановлении сбоев бэкенда, выше.
Кстати, если вы kill -9
почтмейстер, затем удалите postmaster.pid
и запустите его снова, не убедившись, что все postgres
бэкэнды исчезли, могут произойти очень плохие вещи . Это может легко произойти, если вы случайно убили администратора почты вместо бэкэнда, увидели, что база данных вышла из строя, попытались перезапустить ее, удалили «устаревший» файл .pid при сбое перезапуска и попытались перезапустить его снова. Это одна из причин, по которой вы должны избегать размахивать kill -9
вокруг Pg и не должны удалять postmaster.pid
.
Демонстрация:
Чтобы увидеть, что именно происходит, когда вы kill -9
бэкэнд, попробуйте эти простые шаги. Откройте два терминала, откройте psql в каждом и в каждом прогоне SELECT pg_backend_pid();
. В другом терминале kill -9
один из PID. Теперь SELECT pg_backend_pid();
снова запустите обе сессии psql. Обратите внимание, как они оба потеряли свои связи?
Сессия 1, которую мы убили:
$ psql regress
psql (9.1.4)
Type "help" for help.
regress=# select pg_backend_pid();
pg_backend_pid
----------------
6357
(1 row)
[kill -9 of session one happens at this point]
regress=# select pg_backend_pid();
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Succeeded.
regress=# select pg_backend_pid();
pg_backend_pid
----------------
6463
(1 row)
Сессия 2, в которой был побочный ущерб:
$ psql regress
psql (9.1.4)
Type "help" for help.
regress=# select pg_backend_pid();
pg_backend_pid
----------------
6283
(1 row)
[kill -9 of session one happens at this point]
regress=# select pg_backend_pid();
WARNING: terminating connection because of crash of another server process
DETAIL: The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.
HINT: In a moment you should be able to reconnect to the database and repeat your command.
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Succeeded.
regress=# select pg_backend_pid();
pg_backend_pid
----------------
6464
(1 row)
Видите, как обе сессии были прерваны? Вот почему вы не kill -9
бэкэнд.