18.5. Apagar el servidor #

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:

SIGTERM

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.

SIGINT

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.

SIGQUIT

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`

Important

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.