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). Si le serveur est en restauration quand une demande d'arrêt intelligent est envoyée, la restauration et la réplication en flux seront stoppées seulement une fois que toutes les autres sessions ont terminé.
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 de tous les 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 serveur enverra
SIGQUIT à tous les processus fils et attendra
qu'ils se terminent. Ceux qui ne se terminent pas au bout de cinq secondes
se verront envoyés un signal SIGKILL par le
processus père postgres
, qui les arrêtera sans attendre
plus. Ceci peut amener à un redémarrage en mode restauration (de ce fait,
ceci n'est recommandé que dans les cas d'urgence).
Le programme pg_ctl 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.78) ou envoyez un signal
SIGTERM au processus fils associé à cette session.