pg_dump et ERREUR: numéro de bloc 0 manquant pour la valeur de toast

10

J'utilise PostgreSQL 8.4.15. Lors de l'exécution pg_dumppour sauvegarder une base de données, j'ai eu l'erreur suivante:

pg_dump: SQL command failed
pg_dump: Error message from server: ERROR:  missing chunk number 0 for toast value 123456789 in pg_toast_987654321
pg_dump: The command was: COPY public.my_table (id, .... all the columns ...)

Lors de la recherche de ce message d'erreur, j'ai trouvé quelques références ( ici et ici ) qui suggéraient de réindexer la table. (Dans ces discussions, il y avait une référence à l'interrogation de la pg_classtable pour trouver la bonne pg_toast_XXXXXXvaleur, mais il semblait que c'était parce qu'elle n'était pas affichée dans leurs messages d'erreur. J'ai ignoré cette partie car j'avais une valeur affichée dans le message d'erreur . Je suppose que cela pourrait être pratique en raison d'une version ultérieure de PostgreSQL.)

J'ai couru ce qui suit:

REINDEX table pg_toast.pg_toast_987654321;
VACUUM ANALYZE my_table;

Je peux maintenant utiliser pg_dumpsans erreurs.

Que font pg_toastet que font réellement ces commandes? S'agit-il simplement d'un simple nettoyage ou auraient-ils pu supprimer certaines lignes de ce tableau? Qu'est-ce qui aurait pu causer le problème en premier lieu?

Il y a environ 300 000 lignes dans cette table, mais je m'attends à ce qu'il n'y ait que 250 nouvelles lignes depuis la sauvegarde réussie précédente (cette table n'est utilisée que pour INSERT / SELECT, pas de MISE À JOUR).

Bruno
la source
J'ai trouvé cette idée . Pouvez-vous vérifier si votre cas est le même?
dezso
Cela pourrait également aider stackoverflow.com/questions/47533639/…
papanito

Réponses:

6

Étant donné que ce que vous avez fait était une réindexation, ce qui s'est probablement produit, c'est qu'il a utilisé un balayage d'index pour essayer de localiser les valeurs grillées dans la table et n'a pas pu en trouver une. Cela ressemble à un index corrompu. L'analyse sous vide modifie la table mais pas la réindexation et les changements sont très mineurs.

La façon de penser à cela est que les attributs TOASTed sont en fait divisés en morceaux d'environ 4k et qu'ils sont stockés dans des lignes. Ils sont recherchés et triés / reconnectés avec la ligne principale au moment de la requête. Il semble qu'un index utilisé ici ait été corrompu et donc la réindexation a résolu le problème.

J'ai trouvé que les index corrompus sont généralement un signe que quelque chose ne va pas avec le serveur. Il est bon de vérifier et de s'assurer que la mémoire, les processeurs et les disques durs sont tous satisfaits et ne signalent pas de problèmes. J'ai trouvé que les serveurs en surchauffe étaient particulièrement sujets à la corruption d'index et si les index peuvent être corrompus, il faut s'inquiéter de la corruption des données.

Chris Travers
la source