Systemd y gestión de servicios
PostgreSQL en producción en Linux se ejecuta bajo systemd (o un init equivalente). Conocer los comandos de inicio, parada, recarga y estado se traduce directamente en la respuesta a incidentes y en despliegues seguros.
Receta
# systemd (los nombres de paquetes de Debian/Ubuntu varían)
sudo systemctl start postgresql@18-main
sudo systemctl status postgresql@18-main
sudo systemctl reload postgresql@18-main
# Equivalentes de pg_ctl (cualquier instalación)
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 statusCuándo usar esto: Al arrancar un host, aplicar cambios en pg_hba.conf o recuperarse de una parada fallida durante el mantenimiento.
Ejemplo práctico
# Inspeccionar la unidad y el entorno
systemctl cat postgresql@18-main
systemctl show postgresql@18-main -p Environment -p ExecStart
# Recarga gradual tras cambio de configuración
sudo systemctl reload postgresql@18-main
# Confirmar que la recarga ha incluido hba
sudo -u postgres psql -c "SELECT pg_reload_conf();"# Fragmento de anulación: /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-mainLo que esto demuestra:
reloadenvía SIGHUP - aplicapg_hba.confy muchas GUCs sin desconectar clientes.daemon-reloades necesario tras editar archivos de unidad.TimeoutStopSecda tiempo a los puntos de control en sistemas conshared_buffersgrandes.
Profundización
Mapeo de systemd vs pg_ctl
| Intención | systemd | pg_ctl |
|---|---|---|
| Iniciar | systemctl start | pg_ctl start -D $PGDATA |
| Detener (rápido) | systemctl stop | pg_ctl stop -m fast -D $PGDATA |
| Detener (inmediato) | N/A (usar pg_ctl) | pg_ctl stop -m immediate |
| Recargar | systemctl reload | pg_ctl reload -D $PGDATA |
| Estado | systemctl status | pg_ctl status -D $PGDATA |
| Reiniciar | systemctl restart | pg_ctl restart -D $PGDATA |
Modos de parada
# smart - esperar a los clientes (por defecto)
pg_ctl stop -D $PGDATA -m smart
# fast - deshacer transacciones activas, desconectar clientes
pg_ctl stop -D $PGDATA -m fast
# immediate - apagado similar a un bloqueo, recuperación al próximo inicio
pg_ctl stop -D $PGDATA -m immediate- Mantenimiento en producción: preferir fast a menos que necesites un vaciado inteligente (
smart). - immediate arriesga una recuperación de bloqueo más larga - usar solo cuando
fastse cuelga.
Habilitar al arrancar
sudo systemctl enable postgresql@18-main
sudo systemctl is-enabled postgresql@18-mainenablecrea enlaces simbólicos paramulti-user.target.- Las VMs en la nube con discos efímeros aún habilitan la unidad - el directorio de datos debe persistir por separado.
Registros (Logs)
journalctl -u postgresql@18-main -f
journalctl -u postgresql@18-main --since "1 hour ago" -p err- Las instalaciones de paquetes a menudo registran en
stderr, capturado porjournald. - También comprueba
log_directoryenpostgresql.confpara registros en archivos CSV/json.
Errores comunes
- Reiniciar en lugar de recargar para GUCs del postmaster - los cambios en
shared_buffersrequieren reinicio;reloadmantiene silenciosamente el valor antiguo conpending_restart. Solución:SELECT name FROM pg_settings WHERE pending_restart; - PGDATA incorrecto en la unidad - Múltiples clústeres en un host necesitan instancias distintas (
postgresql@18-main). Solución:systemctl catySHOW data_directory;deben coincidir. - Tiempo de espera de parada demasiado corto - systemd mata postgres a mitad del punto de control. Solución: Aumentar
TimeoutStopSeca 300s+ en sistemas grandes. - Ejecutar pg_ctl como root - El servidor rechaza operaciones propiedad de root. Solución:
sudo -u postgres pg_ctl ... - Recargar durante DDL intensivo - La recarga en sí es segura, pero reiniciar durante una migración no lo es. Solución: Usar
reloadparahba; programar el reinicio en una ventana de mantenimiento.
Alternativas
| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
| Unidad gestionada por Patroni | Automatización de failover HA | Portátil de desarrollo de un solo nodo |
Docker docker compose restart | Desarrollo en contenedores | Necesitas integración con journald |
Solo pg_ctl (sin systemd) | Instalaciones BSD, manuales con tar | Producción Linux estándar sin script de init |
Preguntas frecuentes
¿reload vs restart?
Reload aplica SIGHUP (hba, muchas GUCs). Restart detiene e inicia el postmaster (necesario para shared_buffers, max_connections, etc.).
¿Cómo sé si Postgres se está ejecutando?
systemctl is-active postgresql@18-main o pg_isready -h localhost -p 5432.
¿Parada segura antes de una instantánea del sistema de archivos?
systemctl stop (modo fast) detiene las escrituras. Verifica que no haya conexiones con pg_stat_activity antes de la instantánea.
¿Múltiples clústeres en un host?
Usa unidades de instancia (postgresql@18-main, postgresql@18-analytics) cada una con su propio PGDATA.
¿Fallo al iniciar después de editar la configuración?
Comprueba journalctl -u postgresql@18-main -n 50. A menudo es un error tipográfico en postgresql.conf - corrígelo e inténtalo de nuevo.
Relacionado
- Esenciales de postgresql.conf - qué GUCs necesitan reinicio
- pg_hba.conf y Autenticación - recargar después de editar hba
- initdb y Directorio de Datos - ruta PGDATA en archivos de unidad
Versiones de la pila: Esta página se escribió para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x y PostGIS 3.5+.