2009-05-28 19 views
3

gelegentlich in unserem Labor graziös Prozess veralteten Servers töten, unser Postgres 8.3 Datenbank wird aus der pid-Datei verwaist erhalten, und wir bekommen diese Meldung, wenn die Datenbank herunterzuzufahren versucht:wie kann ich postgres

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

Wenn dies passiert, machen wir sofort eine pg_dump, damit wir die Datenbank später wiederherstellen können. Aber wenn wir den Prozess "Waise" -9 einfach beenden und dann starten, startet die Datenbank nur mit den Daten vom letzten erfolgreichen Herunterfahren. Aber wenn Sie psql, bevor Sie es töten, sind die Daten alle verfügbar, also warum die pg_dump funktioniert.

Gibt es eine Möglichkeit, den verwaisten Postgres-Prozess ordnungsgemäß zu beenden, so dass wir nicht durch pg_dump gehen und wiederherstellen müssen? Oder gibt es eine Möglichkeit, die Datenbank wiederherzustellen, nachdem der verwaiste Prozess beendet wurde?

Antwort

4

Nach der documentation können Sie entweder SIGTERM oder SIGQUIT senden. SIGTERM ist bevorzugt. So oder so, verwende niemals SIGKILL (wie du aus eigener Erfahrung weißt).

Edit: auf der anderen Seite, was Sie erleben, ist nicht normal und könnte eine Fehlkonfiguration oder einen Fehler anzeigen. Bitte fragen Sie nach Unterstützung auf der Mailingliste pgsql-admin.

3

Nie Verwenden Sie Kill -9.

Und ich würde Ihnen dringend empfehlen, zu versuchen, genau herauszufinden, wie das passiert. Woher genau kommt die Fehlermeldung? Es ist keine PostgreSQL-Fehlermeldung. Vermischst du zufällig verschiedene Möglichkeiten, den Server zu starten/zu stoppen (manchmal initscripts und manchmal pg_ctl)? Das könnte dazu führen, dass die Dinge nicht mehr synchron laufen.

Aber um die direkte Frage zu beantworten - verwenden Sie eine regelmäßige Kill (No-9) auf den Prozess, um es herunterzufahren. Stellen Sie sicher, dass Sie alle Postgres-Prozesse beenden, wenn mehrere ausgeführt werden.

Die Datenbank wird immer automatisch wiederhergestellt, wenn sie heruntergefahren wird. Dieser Fehler tritt auch bei kill -9 auf - alle Daten, die übergeben werden, sollten da sein. Das hört sich fast so an, als hätten Sie zwei verschiedene Datenverzeichnisse, die übereinander angeordnet sind, oder so ähnlich - das war zumindest bei NFS ein bekanntes Problem.

+1

warum nie -9 verwenden? – Magne

0

Ich benutze ein Skript wie folgt von Cron jede Minute ausgeführt.

#!/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 
Verwandte Themen