J'utilise PostgreSQL 8.4.15. Lors de l'exécution pg_dump
pour 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_class
table pour trouver la bonne pg_toast_XXXXXX
valeur, 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_dump
sans erreurs.
Que font pg_toast
et 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).
la source
Réponses:
É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.
la source