2009-05-28 4 views
3

De temps en temps dans notre laboratoire, notre base de données postgres 8.3 vont se devenus orphelins à partir du fichier pid, et nous obtenons ce message lorsque vous essayez de fermer la base de données:comment puis-je tuer gracieusement processus serveur rassis Postgres

Error: pid file is invalid, please manually kill the stale server process postgres

Lorsque cela se produit, nous faisons immédiatement un pg_dump afin que nous puissions restaurer la base de données plus tard. Mais, si nous venons de tuer le processus orphelin postgres puis de le démarrer, la base de données démarre uniquement avec les données du dernier arrêt réussi. Mais si vous lui donnez psql avant de le tuer, les données sont toutes disponibles, donc pourquoi le pg_dump fonctionne.

Existe-t-il un moyen d'arrêter gracieusement le processus postgres orphelin afin que nous n'ayons pas besoin de passer par pg_dump et de restaurer? Ou existe-t-il un moyen de récupérer la base de données après avoir détruit le processus orphelin?

Répondre

4

Selon le documentation, vous pouvez envoyer SIGTERM ou SIGQUIT. SIGTERM est préféré. Dans tous les cas, n'utilisez jamais SIGKILL (comme vous le savez par expérience personnelle).

Editer: D'autre part, ce que vous ressentez n'est pas normal et pourrait indiquer une mauvaise configuration ou un bug. S'il vous plaît, demandez de l'aide sur la liste de diffusion pgsql-admin.

3

Jamais Utilisez kill -9.

Et je vous conseille fortement d'essayer de comprendre exactement comment cela se passe. D'où vient exactement le message d'erreur? Ce n'est pas un message d'erreur PostgreSQL. Etes-vous en train de mélanger différentes façons de démarrer/arrêter le serveur (initscripts parfois et pg_ctl parfois, par exemple)? Cela pourrait probablement causer une désynchronisation des choses. Mais pour répondre à la question directe - utilisez un kill régulier (no -9) sur le processus pour l'éteindre. Assurez-vous de tuer tous les processus postgres s'il y en a plusieurs en cours d'exécution.

La base de données effectuera toujours une récupération automatique chaque fois qu'elle est arrêtée. Ce shuold arrive avec kill -9 aussi - toute donnée qui est commise devrait être là-haut. Cela ressemble presque à deux répertoires de données différents montés les uns sur les autres ou quelque chose comme ça - cela a été un problème connu avec NFS au moins avant.

+1

pourquoi ne jamais utiliser -9? – Magne

0

J'utilise un script comme celui-ci exécuté par cron chaque minute.

#!/bin/bash 

DB="YOUR_DB" 

# Here's a snippet to watch how long each connection to the db has been open: 
#  watch -n 1 'ps -o pid,cmd,etime -C postgres | grep $DB' 

# This program kills any postgres workers/connections to the specified database 
# which have been running for 2 or 3 minutes. It actually kills workers which 
# have an elapsed time including "02:" or "03:". That'll be anything running 
# for at least 2 minutes and less than 4. It'll also cover anything that 
# managed to stay around until an hour and 2 or 3 minutes, etc. 
# 
# Run this once a minute via cron and it should catch any connection open 
# between 2 and 3 minutes. You can temporarily disable it if if you need to run 
# a long connection once in a while. 
# 
# The check for "03:" is in case there's a little lag starting the cron job and 
# the timing is really bad and it never sees a worker in the 1 minute window 
# when it's got "02:". 
old=$(ps -o pid,cmd,etime -C postgres | grep "$DB" | egrep '0[23]:') 
if [ -n "$old" ]; then 
    echo "Killing:" 
    echo "$old" 
    echo "$old" | awk '{print $1}' | xargs -I {} kill {} 
fi 
Questions connexes