Il existe plusieurs façons d'arrêter le serveur de bases de données. Vous contrôlez le type d'arrêt en envoyant différents signaux au processus serveur maître.
C'est le mode d'arrêt intelligent. Après réception de sigterm, le serveur désactive les nouvelles connexions mais permet aux sessions en cours de terminer leur travail normalement. Il s'arrête seulement après que toutes les sessions se sont terminées normalement. C'est l'arrêt intelligent (smart shutdown). Si le serveur est en mode de sauvegarde en ligne, il attends en plus la désactivation du mot de sauvegarde en ligne. Lorsque le mode de sauvegarde est actif, les nouvelles connexions sont toujours autorisées, mais seulement pour les superutilisateurs (cette exception permet à un superutilisateur de se connecter pour terminer le mode de sauvegarde en ligne).
C'est le mode d'arrêt rapide. Le serveur désactive les nouvelles connexions et envoie à tous les processus serveur le signal sigterm, qui les fera annuler leurs transactions courantes pour quitter rapidement. Il attend ensuite la fin des processus serveur et s'arrête finalement. Si le serveur est en mode de sauvegarde en ligne, le mode est annulé, rendant la sauvegarde inutilisable.
C'est le mode d'arrêt immédiat. Le processus postgres maître envoie un signal sigquit à tous les processus fils et à quitter immédiatement non proprement. Les processus fils quittent immédiatement à réception du signal sigquit. ceci amènera une tentative de récupération (en rejouant les traces WAL) au prochain lancement. Ceci n'est recommandé que dans les cas d'urgence.
Le programme pg_ctl(1) fournit une interface agréable pour envoyer ces signaux dans le but d'arrêter le serveur. Autrement, vous pouvez envoyer le signal directement en utilisant kill sur les systèmes autres que Windows. Le PID du processus postgres peut être trouvé en utilisant le programme ps ou à partir du fichier postmaster.pid dans le répertoire des données. Par exemple, pour exécuter un arrêt rapide :
$ kill -int `head -1 /usr/local/pgsql/data/postmaster.pid`
Il vaux mieux de ne pas utiliser sigkill pour arrêter le serveur. Le faire empêchera le serveur de libérer la mémoire partagée et les sémaphores, ce qui pourrait devoir être fait manuellement avant qu'un nouveau serveur ne soit lancé. De plus, SIGKILL tue le processus postgres sans que celui-ci ait le temps de relayer ce signal à ses sous-processus, donc il sera aussi nécessaire de tuer les sous-processus individuels à la main.
Pour terminer une session individuelle tout en permettant aux autres de continuer, utilisez pg_terminate_backend() (voir Tableau 9.55, « Fonctions d'envoi de signal au serveur ») ou envoyez un signal SIGTERM au processus fils associé à cette session.