Il existe plusieurs façons d'arrêter le serveur de bases de données. Au final, elles se basent toutes sur l'envoi d'un signal au processus serveur principal.
Si vous utilisez une version pré-packagée de PostgreSQL et que vous avez utilisé les outils du paquet pour démarrer le serveur, alors vous devriez aussi utiliser les outils du paquet pour arrêter le serveur. Consultez la documentation du paquet pour les détails.
Lors d'une gestion directe du serveur, vous pouvez contrôler le type d'arrêt
en envoyant différents signaux au processus
postgres
:
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 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.
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. De plus, SIGKILL tue
le processus postgres
sans lui laisser le temps de
relayer ce signal à ses sous-processus, donc il peut aussi être nécessaire
de tuer chaque sous-processus à la main.
Pour terminer une session donnée tout en permettant aux autres de
continuer, utilisez pg_terminate_backend()
(voir Tableau 9.90) ou envoyez un signal
SIGTERM au processus fils associé à cette session.