2022-06-16 Correctif
Le PostgreSQL Global Development Group publiera une mise à jour de PostgreSQL 14 le 16 juin 2022.
Cette mise à jour corrige une erreur présente dans toutes les versions de
PostgreSQL 14 pouvant causer des corruptions silencieuses d’index. Depuis la
sortie de PostgreSQL 14, les commandes
CREATE INDEX CONCURRENTLY
et REINDEX CONCURRENTLY
pouvaient conduire à une
corruption d’index. Ce problème est corrigé avec la prochaine version mineure,
PostgreSQL 14.4, qui sort en dehors du cycle habituel, comme c’est le cas lors de
corrections urgentes.
Description
Le problème a été introduit dans la version majeure 14 de PostgreSQL et impacte
toutes les versions mineures (14.0 à 14.3). Il vient de l’amélioration apportée au
mécanisme de VACUUM
permettant d’ignorer les transactions exécutant les commandes
CREATE INDEX CONCURRENTLY
et REINDEX CONCURRENTLY
. Ces changements
rendent possible la perte de lignes de données marquées comme HOT-updated
ou
HOT-pruned
dans les index créés avec l’option CONCURRENTLY
. Cette dernière
option étant utile pour ne pas mettre de verrou exclusif d’accès sur les tables.
Cette corruption silencieuse est causée par un problème existant dans la
construction concurrente d’index avec l’option CONCURRENTLY
, laissant ce
dernier dans un état corrompu.
Tout utilisateur des versions mineures 14.0 à 14.3 doit procéder à la mise à jour vers 14.4 dès sa sortie le 16 juin prochain.
Correction
Si vous avez besoin d’apporter une correction immédiate à ce problème avant la
disponibilité de la mise à jour, il vous est possible de supprimer les index
existants et de les recréer avec la commande CREATE INDEX
ou REINDEX
mais
sans l’option CONCURRENTLY
.
Vous pouvez aussi uitiser la commande reindexdb
avec l’option -j (jobs)
pour augmenter le parallélisme et diminuer l’interruption de service pendant
la création des index.
Il vous est également possible de vérifier la présence d’index corrompus en
utilisant l’utilitaire pg_amcheck.
Ce dernier ne fonctionne que sur les index de type B-Tree
. Il permet de contrôler
que chaque ligne de données possède une entrée dans l’index correspondant, en
vérifiant que la donnée pointée par l’index existe réellement.