do voretaq7 A resposta abrange os pontos-chave, incluindo a maneira correta de encerrar back-ends , mas eu gostaria de adicionar um pouco mais explicações.
kill -9
(ou seja, SIGKILL
) nunca deve ser o seu padrão de primeira escolha . Ele deve ser seu último recurso quando o processo não responder às solicitações normais de desligamento e um SIGTERM
( kill -15
) não tiver efeito. Isso é verdade de Pg e praticamente todo o resto.
kill -9
não dá chance ao processo morto de fazer qualquer limpeza.
Quando se trata de PostgreSQL, o Pg vê um backup que é terminado por kill -9
como uma falha suportada . Ele sabe que o backend pode ter corrompido a memória compartilhada - porque você poderia ter interrompido a gravação de uma página em shm ou a modificação de um, por exemplo - então termina e reinicia todos os outros backends quando percebe que um backend desapareceu de repente e saiu com um código de erro diferente de zero.
Você verá isso nos relatórios.
Se parecer que não faz mal, porque a Pg está reiniciando tudo após o travamento e seu aplicativo está se recuperando das conexões perdidas de forma limpa. Isso não faz uma boa ideia. Se nada mais for travado, as falhas de backend são menos bem testadas do que as partes com funcionamento normal do Pg e são muito mais complicadas / variadas, então as chances de um bug escondido no tratamento de falhas e recuperação de backend são maiores.
BTW, se você kill -9
o postmaster, em seguida, remover postmaster.pid
e iniciá-lo novamente sem certificar-se de que todos os backends postgres
tenham desaparecido, coisas muito ruins podem acontecer . Isso poderia acontecer facilmente se você acidentalmente matasse o postmaster em vez de um backend, visse o banco de dados caiu, tentou reiniciá-lo, removeu o arquivo .pid "obsoleto" quando a reinicialização falhou e tentou reiniciá-lo novamente. Essa é uma das razões pelas quais você deve evitar acenar kill -9
em torno de Pg e não deve excluir postmaster.pid
.
Uma demonstração:
Para ver exatamente o que acontece quando você usa kill -9
, experimente estas etapas simples. Abra dois terminais, abra o psql em cada um deles e, em cada execução, execute SELECT pg_backend_pid();
. Em outro terminal kill -9
one dos PIDs. Agora execute SELECT pg_backend_pid();
em ambas as sessões do psql novamente. Observe como eles ambos perderam suas conexões?
Sessão 1, que matamos:
$ 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)
Sessão 2, que foi um dano colateral:
$ 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)
Veja como ambas sessões foram quebradas? É por isso que você não usa kill -9
em um backend.