web-dev-qa-db-fra.com

erreur postgresql PANIC: impossible de localiser un enregistrement de point de contrôle valide

Lorsque je charge le serveur postgres (v9.0.1), je reçois une panique qui l'empêche de démarrer:

PANIQUE: impossible de localiser un enregistrement de point de contrôle valide

Comment puis-je réparer cela?

46
nathan_scott

Il recherche un enregistrement de point de contrôle dans le journal des transactions qui n'existe probablement pas ou qui est corrompu. Vous pouvez déterminer si c'est le cas en exécutant:

# Postgres < 10.0
pg_resetxlog DATADIR

# Postgres >= 10.0
pg_resetwal DATADIR

Si le journal des transactions est corrompu, vous verrez un message comme:

Le serveur de base de données n'a pas été arrêté correctement. La réinitialisation du journal des transactions peut entraîner la perte de données. Si vous souhaitez continuer, utilisez -f pour forcer la réinitialisation.

Vous pouvez ensuite suivre les instructions et exécuter avec -f pour forcer la mise à jour:

# Postgres < 10.0
pg_resetxlog -f DATADIR 

# Postgres >= 10.0
pg_resetwal -f DATADIR

Cela devrait réinitialiser le journal des transactions, mais cela pourrait laisser votre base de données dans un état indéterminé comme expliqué dans la documentation PostgreSQL sur pg_resetxlog :

Si pg_resetxlog se plaint de ne pas pouvoir déterminer des données valides pour pg_control, vous pouvez le forcer à continuer quand même en spécifiant le -f (forcer) l'interrupteur. Dans ce cas, des valeurs plausibles remplaceront les données manquantes. On peut s'attendre à ce que la plupart des champs correspondent, mais une assistance manuelle peut être nécessaire pour le prochain OID, le prochain ID et Epoch de transaction, le prochain ID et décalage multitransaction et les champs d'adresse de départ WAL. Ces champs peuvent être définis à l'aide des commutateurs décrits ci-dessous. Si vous n'êtes pas en mesure de déterminer les valeurs correctes pour tous ces champs, -f peut toujours être utilisé, mais la base de données récupérée doit être traitée avec encore plus de suspicion que d'habitude: un vidage et un rechargement immédiats sont impératifs. N'exécutez aucune opération de modification des données dans la base de données avant d'effectuer un vidage, car une telle action risque d'aggraver la corruption.

81
Erwin Brandstetter

J'utilise 9.1.7 et je trouve que j'ai exécuté avec succès les éléments suivants:

/usr/lib/postgresql/9.1/bin/pg_resetxlog -f /var/lib/postgresql/9.1/main

Votre dernier argument à la commande pg_resetxlog Devrait être l'emplacement sur le disque où postgres stocke vos données de base de données.

15
limlam

Comme indiqué ici pg_resetxlog ne doit pas être exécuté. Les réponses qui s'y réfèrent sont de mauvais conseils. En supposant que l'erreur s'est produite dans un contexte d'instance de copie/réplication, le lien fournit un moyen plus succinct de faire une copie/réplication avec pg_basebackup

8
Jerome

Faites-vous un archivage continu? Si vous effectuez une sauvegarde à ce moment-là, il peut être plus prudent de supprimer backup_label. pg_resetxlog est une chose grave.

3
fdr

tout comme le journal dit: impossible de localiser un enregistrement de point de contrôle valide.Postgres ne peut pas trouver un WAL correctement sous le répertoire $ PGDATA/pg_xlog /. Essayez d'utiliser pg_resetxlog

1
sgzhan