voretaq7 „s odpowiedź obejmuje główne punkty, w tym właściwej drodze wypowiedzenia backendów ale chciałbym dodać trochę więcej wyjaśnień.
kill -9
(tj. SIGKILL
) nigdy nie powinno być nigdy pierwszym wyborem domyślnym . Powinno to być ostatnią deską ratunku, gdy proces nie odpowiada na normalne żądania zamknięcia, a funkcja SIGTERM
( kill -15
) nie ma wpływu. Dotyczy to Pg i prawie wszystkiego innego.
kill -9
nie daje zabitemu procesowi żadnej szansy na jakiekolwiek czyszczenie.
Jeśli chodzi o PostgreSQL, Pg widzi kopię zapasową zakończoną przez kill -9
awarię kopii zapasowej . Wie, że backend mógł uszkodzić pamięć współużytkowaną - ponieważ mógłbyś ją przerwać w połowie, na przykład, zapisując stronę w shm lub modyfikując jedną - więc kończy i uruchamia wszystkie pozostałe backendy, gdy zauważy, że backend nagle zniknął i zakończony niezerowym kodem błędu.
Zostanie to zgłoszone w dziennikach.
Jeśli wydaje się, że nie wyrządza to szkody, to dlatego, że Pg restartuje wszystko po awarii, a twoja aplikacja odzyskuje utracone połączenia. To nie jest dobry pomysł. Jeśli żadne inne awarie backendu nie są tak dobrze przetestowane, jak normalnie działające części Pg i są znacznie bardziej skomplikowane / zróżnicowane, więc szanse na błąd czający się w obsłudze awarii backend i odzyskiwaniu są wyższe.
BTW, jeśli jesteś kill -9
postmasterem, usuń go postmaster.pid
i uruchom ponownie, nie upewniając się, że postgres
nie ma już wszystkich backendów, mogą się zdarzyć bardzo złe rzeczy . Może się to łatwo zdarzyć, jeśli przypadkowo zabijesz postmastera zamiast backendu, zobaczysz, że baza danych uległa awarii, spróbujesz go zrestartować, usuniesz „przestarzały” plik .pid, gdy restart się nie powiedzie, i spróbujesz go ponownie uruchomić. To jeden z powodów, dla których powinieneś unikać machania kill -9
wokół Pg i nie należy go usuwać postmaster.pid
.
Demonstracja:
Aby zobaczyć dokładnie, co dzieje się, gdy masz kill -9
backend, wypróbuj te proste kroki. Otwórz dwa terminale, otwórz psql w każdym i w każdym przebiegu SELECT pg_backend_pid();
. Na innym terminalu kill -9
jeden z PID. Teraz uruchom SELECT pg_backend_pid();
ponownie obie sesje psql. Zauważ, jak oboje stracili połączenie?
Sesja 1, którą zabiliśmy:
$ 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)
Sesja 2, która była uszkodzeniem dodatkowym:
$ 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)
Zobacz, jak zostały przerwane obie sesje? Dlatego nie masz kill -9
backendu.