18.5. Desligamento do servidor #

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:

SIGTERM

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.

SIGINT

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.

SIGQUIT

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`

Importante

É 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.