Erreur de sauvegarde à chaud PostgreSQL 9.1: le système de base de données démarre

16

Je travaille sur une sauvegarde à chaud pour Postgres 9.1 depuis un certain temps et j'ai rencontré un problème cohérent. Après avoir redémarré Postgres sur le serveur esclave, le fichier journal pgstartup et le fichier journal quotidien sous le répertoire pg_log sont lus sans erreur. Cependant, lorsque j'essaie d'entrer dans la base de données à l'aide de la commande psql, j'obtiens l'erreur:

FATAL: le système de base de données démarre.

Le fichier recovery.conf ne se transforme pas non plus en recovery.done. J'ai fait des recherches approfondies sur cette erreur et trouve toujours la même réponse: la base de données n'a pas été correctement fermée avant d'essayer de redémarrer Postgres. La seule façon dont j'ai redémarré Postgres est via les commandes service postgresql-9.1 restartou /etc/init.d/postgresql-9.1 restart. Après avoir reçu cette erreur, je tue tous les processus et j'essaie à nouveau de redémarrer la base de données tout en recevant la même erreur. Je ne sais pas où aller à partir d'ici et comment résoudre ce problème. Vous trouverez ci-dessous le processus exact que j'ai effectué pour terminer la sauvegarde à chaud.

Configurations du serveur maître:

pg_hba.conf, a ajouté la ligne:

réplication d'hôte postgres IPAddressOfSlaveServer trust

postgresql.conf:

wal_level = hot_standby
max_wal_senders = 5
listen_address = '*'
port = 5432
max_wal_senders = 5
wal_keep_segments = 32

Configurations du serveur esclave:

postgresql.conf:

hot_standby = on

recovery.conf:

standby_mode = on
primary_conninfo = host = IPAddressOfMasterServer
port = 5432
user = postgres
restore_command = 'cp /var/lib/pgsql/9.1/data/pg_xlog/%f "% p"'

Après avoir configuré les deux serveurs

Je passe à l'utilisateur postgres sur le serveur maître et exécute les commandes:

psql -c "Sélectionnez pg_start_backup ('label', true);";
rsync -a -v -e ssh /var/lib/pgsql/9.1/data esclave: /var/lib/pgsql/9.1/data \
        --exclure postmaster.pid
pgsql -c "sélectionnez pg_stop_backup ();";

Après la synchronisation de la base de données avec le serveur esclave

Je redémarre le serveur esclave et le démarrage n'échoue pas. Le pgstartup.log se lit comme suit:

Succès. Vous pouvez maintenant démarrer le serveur de base de données en utilisant:

    /usr/pgsql-9.1/bin/postgres -D /var/lib/pgsql/9.1/data
ou
    /usr/pgsql/9.1/bin/pg_ctl -D /var/lib/pgsql/9.1/data -l démarrage du fichier journal

le fichier journal du jour, postgresql-Thu.log, se lit comme suit:

Journal: arrêt
Journal: le système de base de données est arrêté
Journal: le système de base de données a été arrêté lors de la récupération le 2012-4-10
Journal: entrée en mode veille
Journal: fichier journal "logFileName" restauré à partir de l'archive
Journal: état de récupération cohérent atteint à 0 / BF0000B0
Journal: le rétablissement commence à 0 / BF000020
Journal: fichier journal "logFileName" restauré à partir de l'archive
Journal: pageaddr inattendu 0/85000000 dans le fichier journal 0, segment 192, décalage 0
Journal: pageaddr inattendu 0/85000000 dans le fichier journal 0, segment 192, décalage 0
Journal: la réplication en streaming est correctement connectée au serveur principal

J'ai recherché des pageaddr inattendus et des archives postgres, je crois comprendre que c'est tout à fait normal et l'un des moyens attendus pour détecter la fin de WAL.

Tout avis serait grandement apprécié.

Ola Ström
la source

Réponses:

11

Le message "Le système de base de données démarre." n'indique pas une erreur. La raison pour laquelle il est au niveau FATAL est qu'il se rendra toujours dans le journal, quel que soit le paramètre de log_min_messages:

http://www.postgresql.org/docs/9.1/interactive/runtime-config-logging.html#RUNTIME-CONFIG-LOGGING-WHEN

Après la rsync, avez-vous vraiment exécuté ce que vous montrez?:

pgsql -c "sélectionnez pg_stop_backup ();";

Puisqu'il n'y a, pour autant que je sache, aucun pgsqlexécutable, cela laisserait la sauvegarde inachevée, et l'esclave ne sortirait jamais du mode de récupération. D'un autre côté, vous avez peut-être vraiment couru psql, car sinon je ne vois pas comment l'esclave aurait enregistré des messages de réussite tels que:

Journal: état de récupération cohérent atteint à 0 / BF0000B0

et:

Journal: la réplication en streaming est correctement connectée au serveur principal

Avez-vous essayé de vous connecter à l'esclave à ce stade? Qu'est-il arrivé?

Le message "Réussite. Vous pouvez maintenant commencer ..." que vous mentionnez est généré par initdb, qui ne doit pas être exécuté dans le cadre de la configuration d'un esclave; donc je pense que vous pouvez être confus à propos de quelque chose là-bas. Je suis également préoccupé par ces déclarations apparemment contradictoires:

La seule façon dont j'ai redémarré Postgres consiste à utiliser le service postgresql-9.1 restart ou les commandes /etc/init.d/postgresql-9.1 restart. Après avoir reçu cette erreur, je tue tous les processus et j'essaie à nouveau de redémarrer la base de données ...

Avez-vous essayé d'arrêter le service via le script de service? Qu'est-il arrivé? Il peut être utile de comprendre les journaux si vous préfixez des lignes avec plus d'informations. Nous utilisons:

log_line_prefix = '[%m] %p %q<%u %d %r> '

Le recovery.confscript semble étrange. Copiez-vous à partir du répertoire pg_xlog du maître, du répertoire pg_xlog actif de l'esclave ou d'un répertoire d'archives?

kgrittn
la source
8

J'ai également eu quelques problèmes avec cela, sauf que j'étais en 9.3, pas en 9.1. Quoi qu'il en soit, le correctif s'est avéré assez trivial:

Le postgresql.conffichier était copié du maître vers l'esclave et je le laissais inchangé sur l'esclave. Je pensais que tout ce que vous aviez à faire était d'ajouter un recovery.conffichier et que tout fonctionnerait (eh bien oui, mais je ne pouvais pas me connecter au serveur esclave répliqué, mais il était en cours de réplication).

J'ai édité le postgresql.conffichier de l'esclave et:

  • commenté le archive_mode=on
  • commenté la archivecommande; et
  • commenté hot_standby=on

Cela l'a fait: j'ai pu obtenir que la base de données soit un serveur en lecture seule prêt à accepter des requêtes en lecture seule.

Il existe un script appelé pg_basebackupqui créera le répertoire d'amorçage pour l'esclave. Il s'agit du répertoire de données contenant la base de données. Vous devez modifier le postgresql.conffichier avant de pouvoir l'utiliser comme esclave comme décrit, quelque chose d'assez simple pour un post- pg_basebackupscript.

Greg
la source
1
Lorsque vous écrivez "commenté hot_standby = on", je suppose que vous voulez dire "supprimé la marque # -comment avant, pour activer réellement hot_standby" :) Si ce n'est pas dans hot_standby, la base de données sera toujours "en cours de démarrage" par conception (il fait chaud veille, prêt pour le basculement, mais sans interrogation). Notez que si vous avez effectué le vidage de sauvegarde de base sans avoir wal_level = hot_standby sur le maître, puis activé hot_stanby sur l'esclave, vous devrez relancer et redémarrer la base de données esclave pour que hot_standby soit opérationnel. Sinon, vous obtiendrez des erreurs fatales.
Frederik Struck-Schøning
hot_standby = on est requis, il doit être là
Abhilash Mishra
7

Fait intéressant, j'ai résolu le problème de la manière opposée à celle de Paul.

J'ai ajouté:

hot_standby = on

ou, plutôt, changé #hot_standby = offà ce qui précède. (Cela utilisait 9.5)

user41734
la source
1

Je l'ai obtenu dans les journaux:

MSK FATAL:  the database system is starting up

Pour corriger le démarrage infini du serveur, procédez comme suit: Arrêtez le service (s'il existe), supprimez le processus «postgres» (il existe généralement). Exécutez ceci dans la console:

pg_resetxlog.exe -D ../Data -f

Cette utilisation apparaît car le répertoire xLog contient des données qui ne doivent pas être écrites avant l'arrêt du service. Et puis au démarrage du service, il essaie de corriger ces données. Parfois, il gèle le démarrage et ne se termine jamais. La commande au nettoyage nettoie ces données non fixées, qui appliquent le service pour commencer avec des données fixes uniquement. Peut-être que certaines parties des données non fixées seront perdues, mais le serveur de base de données fonctionnera normalement et sera accessible par les applications.

Andrew Zolotarev
la source