La risposta di voretaq7 copre i punti chiave, incluso il modo corretto di terminare i back-end, ma vorrei aggiungere qualche spiegazione in più.
kill -9
(ad es. SIGKILL
) non dovrebbe mai e poi mai essere il tuo default di prima scelta . Dovrebbe essere la tua ultima risorsa quando il processo non risponde alle sue normali richieste di arresto e un SIGTERM
( kill -15
) non ha avuto effetto. Questo è vero per Pg e praticamente tutto il resto.
kill -9
non dà al processo ucciso alcuna possibilità di eseguire alcuna pulizia.
Quando si tratta di PostgreSQL, Pg vede un backup che termina con kill -9
un arresto anomalo del backup . Sa che il back-end potrebbe aver danneggiato la memoria condivisa - perché potresti averlo interrotto a metà scrivendo una pagina in shm o modificandone una, ad esempio - quindi termina e riavvia tutti gli altri backend quando nota che un back-end è improvvisamente scomparso ed è uscito con un codice di errore diverso da zero.
Lo vedrai riportato nei registri.
Se sembra non fare alcun danno, questo perché Pg sta riavviando tutto dopo l'incidente e l'applicazione si sta riprendendo dalle connessioni perse in modo pulito. Questo non lo rende una buona idea. Se nient'altro gli arresti di back-end sono meno testati rispetto alle parti di Pg che funzionano normalmente e sono molto più complicati / vari, quindi le possibilità di un bug in agguato nella gestione e nel ripristino degli arresti di back-end sono maggiori.
A proposito, se kill -9
il postmaster lo rimuove postmaster.pid
e lo riavvia senza assicurarsi che ogni postgres
backend sia sparito, possono succedere cose molto brutte . Ciò potrebbe facilmente accadere se il postmaster fosse stato accidentalmente ucciso anziché un back-end, si fosse verificato un errore nel database, si fosse tentato di riavviarlo, si fosse rimosso il file .pid "non aggiornato" quando il riavvio non fosse riuscito e si fosse tentato di riavviarlo nuovamente. Questo è uno dei motivi per cui dovresti evitare di agitare kill -9
attorno a Pg e non dovresti eliminarlo postmaster.pid
.
Una dimostrazione:
Per vedere esattamente cosa succede quando si è kill -9
un backend, provare questi semplici passaggi. Apri due terminali, apri psql in ciascuno e in ogni corsa SELECT pg_backend_pid();
. In un altro terminale kill -9
uno dei PID. Ora esegui di nuovo SELECT pg_backend_pid();
in entrambe le sessioni psql. Notate come entrambi hanno perso le loro connessioni?
Sessione 1, che abbiamo ucciso:
$ 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)
Sessione 2, che era un danno collaterale:
$ 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)
Vedi come sono state interrotte entrambe le sessioni? Ecco perché non sei kill -9
un backend.