Systemd & Gerenciamento de Serviços
O PostgreSQL em produção no Linux roda sob systemd (ou um init equivalente). Saber iniciar, parar, recarregar e verificar o status é diretamente aplicável à resposta a incidentes e a deploys seguros.
Receita
# systemd (nomes de pacotes Debian/Ubuntu variam)
sudo systemctl start postgresql@18-main
sudo systemctl status postgresql@18-main
sudo systemctl reload postgresql@18-main
# Equivalentes do pg_ctl (qualquer instalação)
sudo -u postgres pg_ctl -D /var/lib/postgresql/18/main start
sudo -u postgres pg_ctl -D /var/lib/postgresql/18/main reload
sudo -u postgres pg_ctl -D /var/lib/postgresql/18/main statusQuando usar isso: Inicialização de um host, aplicação de alterações no pg_hba.conf, ou recuperação de uma falha ao parar durante a manutenção.
Exemplo Prático
# Inspecionar unidade e ambiente
systemctl cat postgresql@18-main
systemctl show postgresql@18-main -p Environment -p ExecStart
# Recarregamento gracioso após alteração de configuração
sudo systemctl reload postgresql@18-main
# Confirmar que o recarregamento pegou o hba
sudo -u postgres psql -c "SELECT pg_reload_conf();"# Fragmento de sobrescrita: /etc/systemd/system/postgresql@18-main.service.d/override.conf
[Service]
Environment=PGDATA=/data/pgdata
TimeoutStartSec=300
TimeoutStopSec=300sudo systemctl daemon-reload
sudo systemctl restart postgresql@18-mainO que isso demonstra:
reloadenvia SIGHUP - aplicapg_hba.confe muitos GUCs sem desconectar clientesdaemon-reloadnecessário após edições do arquivo de unidadeTimeoutStopSecdá tempo aos checkpoints em sistemas comshared_buffersgrandes
Mergulho Profundo
Mapeamento systemd vs pg_ctl
| Intenção | systemd | pg_ctl |
|---|---|---|
| Iniciar | systemctl start | pg_ctl start -D $PGDATA |
| Parar (rápido) | systemctl stop | pg_ctl stop -m fast -D $PGDATA |
| Parar (imediato) | N/A (usar pg_ctl) | pg_ctl stop -m immediate |
| Recarregar | systemctl reload | pg_ctl reload -D $PGDATA |
| Status | systemctl status | pg_ctl status -D $PGDATA |
| Reiniciar | systemctl restart | pg_ctl restart -D $PGDATA |
Modos de Parada
# smart - aguarda clientes (padrão)
pg_ctl stop -D $PGDATA -m smart
# fast - reverte transações ativas, desconecta clientes
pg_ctl stop -D $PGDATA -m fast
# immediate - desligamento semelhante a crash, recuperação na próxima inicialização
pg_ctl stop -D $PGDATA -m immediate- Manutenção em produção: prefira fast a menos que precise de um drain smart.
- immediate arrisca uma recuperação de crash mais longa - use apenas quando fast travar.
Habilitar na Inicialização
sudo systemctl enable postgresql@18-main
sudo systemctl is-enabled postgresql@18-mainenablecria links simbólicos paramulti-user.target.- VMs na nuvem com discos efêmeros ainda habilitam a unidade - o diretório de dados deve persistir separadamente.
Logs
journalctl -u postgresql@18-main -f
journalctl -u postgresql@18-main --since "1 hour ago" -p err- Instalações de pacotes frequentemente registram no stderr capturado pelo journald.
- Verifique também
log_directoryempostgresql.confpara logs em arquivo CSV/json.
Armadilhas
- Reiniciar em vez de recarregar para GUCs do postmaster - Alterações em
shared_buffersprecisam de reinicialização;reloadsilenciosamente mantém o valor antigo compending_restart. Correção:SELECT name FROM pg_settings WHERE pending_restart; - PGDATA incorreto na unidade - Múltiplos clusters em um host precisam de instâncias distintas (
postgresql@18-main). Correção:systemctl cateSHOW data_directory;devem concordar. - Tempo limite de parada muito curto - systemd mata o postgres no meio do checkpoint. Correção: Aumente
TimeoutStopSecpara 300s+ em sistemas grandes. - Executar pg_ctl como root - O servidor recusa operações de propriedade do root. Correção:
sudo -u postgres pg_ctl ... - reload durante DDL pesado - O reload em si é seguro, mas reiniciar durante a migração não é. Correção: Use reload para hba; agende a reinicialização em uma janela de manutenção.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Unidade gerenciada por Patroni | Automação de failover HA | Laptop de desenvolvimento de nó único |
Docker docker compose restart | Desenvolvimento em contêineres | Você precisa de integração com journald |
Apenas pg_ctl (sem systemd) | BSD, instalações manuais de tar | Produção Linux padrão sem script de init |
FAQs
reload vs restart?
Reload aplica SIGHUP (hba, muitos GUCs). Restart para e inicia o postmaster (necessário para shared_buffers, max_connections, etc.).
Como saber se o Postgres está rodando?
systemctl is-active postgresql@18-main ou pg_isready -h localhost -p 5432.
Parada segura antes do snapshot do sistema de arquivos?
systemctl stop (modo fast) silencia as escritas. Verifique se não há conexões com pg_stat_activity antes do snapshot.
Múltiplos clusters em um host?
Use unidades de instância (postgresql@18-main, postgresql@18-analytics) cada uma com seu próprio PGDATA.
Falha ao iniciar após edição de configuração?
Verifique journalctl -u postgresql@18-main -n 50. Frequentemente um erro de digitação em postgresql.conf - corrija e tente iniciar novamente.
Relacionados
- Essenciais do postgresql.conf - quais GUCs precisam de reinicialização
- pg_hba.conf & Autenticação - recarregar após edições de hba
- initdb & Diretório de Dados - caminho PGDATA em arquivos de unidade
Versões da Stack: Esta página foi escrita para PostgreSQL 18.4 (estável 18, manutenção 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x, e PostGIS 3.5+.