Existem várias maneiras de parar o servidor de banco de dados.
No final, todas se reduzem a enviar um sinal para o processo
supervisor postgres.
Se estiver sendo usada uma versão pré-empacotada do PostgreSQL, e usada suas provisões para iniciar o servidor, então também deverão ser usadas estas provisões para parar o servidor. A documentação do pacote deve ser consultada para obter detalhes.
Ao se gerenciar o servidor diretamente, pode ser controlado o tipo
de desligamento enviando sinais diferentes para o processo
postgres:
Este é o modo de Desligamento Inteligente. Após receber o SIGTERM, o servidor não aceita novas conexões, mas permite que as sessões existentes concluam seus trabalhos normalmente. Termina somente após o término de todas as sessões. Se o servidor estiver em recuperação quando for solicitado um desligamento inteligente, a recuperação e a replicação por fluxo (streaming) serão interrompidas somente após o término de todas as sessões regulares.
Este é o modo de Desligamento Rápido. O servidor não aceita novas conexões, e envia o sinal SIGTERM para todos os processos servidores existentes, fazendo com que interrompam suas transações correntes e saiam imediatamente. Em seguida, aguarda a saída de todos os processos servidores e, por fim, desliga.
Este é o modo de Desligamento Imediato. O servidor envia o sinal SIGQUIT para todos os processos filhos, e aguarda a saída deles. Aqueles que não saírem dentro de cinco segundos receberão o sinal SIGKILL. O processo supervisor do servidor sai assim que todos os processos filhos tenham saído, sem realizar o processamento normal de fechamento do banco de dados. Este modo leva à recuperação (refazer o log do WAL) na próxima vez que o servidor for ativado. Só é recomendado para casos de emergência.
O programa pg_ctl fornece uma interface
conveniente para enviar estes sinais para desligar o servidor.
Como alternativa, o sinal pode ser enviado diretamente usando
o comando kill em sistemas operacionais não
Windows.
O PID do processo postgres
pode ser encontrado usando o programa ps,
ou a partir do arquivo postmaster.pid
no diretório de dados.
Por exemplo, para fazer um desligamento rápido:
$ kill -INT `head -1 /usr/local/pgsql/data/postmaster.pid`
É melhor não usar o sinal SIGKILL para
desligar o servidor, porque impede que o servidor libere a memória
compartilhada e os semáforos.
Além disso, o sinal SIGKILL mata o processo
postgres sem o deixar retransmitir o sinal para
seus subprocessos, então poderá ser necessário matar manualmente os
subprocessos individuais também.
Para terminar uma determinada sessão, mas permitindo que as demais
sessões prossigam normalmente, deve ser usada a função
pg_terminate_backend()
(veja a Tabela 9.96),
ou enviado o sinal SIGTERM para o processo
filho associado à sessão.