voretaq7 «сек відповідь охоплює ключові моменти, в тому числі правильного способу припинити движки , але я хотів би додати трохи більше пояснень.
kill -9
(тобто SIGKILL
) ніколи і ніколи не повинен бути дефолтом вашого першого вибору . Це має бути вашою крайньою інстанцією, коли процес не відповідає на його звичайні запити на закриття, а 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
бекенд.