Hay varias formas de apagar el servidor de bases de datos.
Internamente, todas se reducen a enviar una señal al proceso supervisor
postgres.
Si estás usando una versión preempaquetada de PostgreSQL, y utilizaste sus mecanismos para iniciar el servidor, entonces también deberías usar sus mecanismos para detener el servidor. Consulta la documentación del paquete para obtener más detalles.
Cuando gestionas el servidor directamente, puedes controlar el tipo de apagado
enviando diferentes señales al proceso postgres:
Este es el modo de apagado inteligente (Smart Shutdown). Tras recibir SIGTERM, el servidor rechaza nuevas conexiones, pero permite que las sesiones existentes finalicen su trabajo normalmente. Se apaga solo después de que terminen todas las sesiones. Si el servidor está en modo de recuperación cuando se solicita un apagado inteligente, la recuperación y la replicación en streaming se detendrán únicamente después de que todas las sesiones normales hayan terminado.
Este es el modo de apagado rápido (Fast Shutdown). El servidor rechaza nuevas conexiones y envía SIGTERM a todos los procesos de servidor existentes, lo que hará que aborten sus transacciones actuales y salgan de inmediato. Luego espera a que todos los procesos del servidor terminen y finalmente se apaga.
Este es el modo de apagado inmediato (Immediate Shutdown). El servidor enviará SIGQUIT a todos los procesos hijo y esperará a que terminen. Si alguno no termina en 5 segundos, se le enviará SIGKILL. El proceso de servidor supervisor sale tan pronto como todos los procesos hijo han terminado, sin realizar el procesamiento normal de apagado de la base de datos. Esto provocará una recuperación (mediante la reproducción del registro WAL) en el siguiente arranque. Esto se recomienda únicamente en emergencias.
El programa pg_ctl proporciona una interfaz conveniente
para enviar estas señales para apagar el servidor.
Alternativamente, puedes enviar la señal directamente usando kill
en sistemas que no sean Windows.
El PID del proceso postgres se puede
encontrar usando el programa ps, o desde el archivo
postmaster.pid en el directorio de datos. Por
ejemplo, para realizar un apagado rápido:
$ kill -INT `head -1 /usr/local/pgsql/data/postmaster.pid`
Es mejor no usar SIGKILL para apagar el
servidor. Hacerlo evitará que el servidor libere la memoria compartida y
los semáforos. Además, SIGKILL mata
el proceso postgres sin permitirle transmitir la
señal a sus subprocesos, por lo que también podría ser necesario matar los
subprocesos individuales manualmente.
Para terminar una sesión individual permitiendo que otras sesiones
continúen, usa pg_terminate_backend() (ver Table 9.96) o envía una
señal SIGTERM al proceso hijo asociado con
la sesión.