Paris, le 14 février 2019
Le PostgreSQL Global Development Group vient de publier une mise à jour pour toutes les versions supportées de PostgreSQL, à savoir : 11.2, 10.7, 9.6.12, 9.5.16 et 9.4.21.
Cette mise à jour change le comportement de PostgreSQL vis-à-vis de fsync()
et inclus des corrections concernant le partitionnement ainsi que plus de 70
autres bugs reportés lors de ces trois derniers mois.
Changement de comportement avec fsync()
Lorsque disponible sur le système et activé dans la configuration (ce qui est
le comportement par défaut), PostgreSQL utilise la fonction du noyau fsync()
pour s’assurer que les données sont écrites sur disque.
Sur certains systèmes fournissant cette fonction, lorsque le noyau ne peut
écrire les données, il renvoie un code d’erreur mais vide de son cache les
données qui étaient supposées être écrites.
L’effet secondaire néfaste de ce vidage de cache est que si PostgreSQL essaie
d’écrire à nouveau ces données sur disque en appelant la fonction fsync()
,
celle-ci ne retournera plus d’erreur, mais les données que PostgreSQL croyait
sauvegardées sur disque n’auront en réalité pas été écrites. Cela représente
un possible scénario de corruption de données.
Cette mise à jour modifie la façon dont PostgreSQL gère les erreurs à l’appel
de la fonction fsync()
. PostgreSQL ne retentera plus d’appeler à nouveau
cette fonction mais entrera en mode “PANIC”.
Dans ce cas, PostgreSQL peut ré-appliquer les données depuis les journaux de
transactions (WAL) pour s’assurer que les données soient bien écrites.
Alors que cela peut ne pas sembler être une solution optimale, il n’existe
actuellement que peu d’alternatives et, d’après les erreurs rapportées,
ce cas de figure ne se produit que très rarement.
Un nouveau paramètre serveur data_sync_retry
a été ajouté pour gérer ce
comportement. Si vous êtes certain que le noyau ne vide pas les données
non écrites dans de tels cas, passez data_sync_retry
à on
restaure
l’ancien comportement.
Corrections de bugs et améliorations
Cette mise à jour introduit un changement dans la manière de présenter les notes de version (“release notes”). À partir de cette mise à jour, toutes les versions supportées de PostgreSQL contiendront uniquement les notes relatives à la version majeure en question. Par exemple, PostgreSQL 11 contiendra uniquement les notes pour les versions 11.2, 11.1 et 11.0. Les notes de version des versions non supportées (PostgreSQL 9.3 et précédentes) seront disponibles dans les anciennes publications et dans une archive qui sera prochainement disponible sur le site web de PostgreSQL.
Cette mise à jour corrige également plus de 70 bugs qui ont été rapportés durant les derniers mois. Certains de ces problèmes affectent uniquement la version 11, mais beaucoup concernent toutes les versions supportées :
Ces corrections concernent notamment :
- Correction de la gestion des index uniques avec colonnes incluses (
INCLUDE
) sur les tables partitionnées - Garantir que les contraintes
NOT NULL
sur une table partitionnée sont respectées dans les partitions - Plusieurs corrections concernant les contraintes sur les tables partitionnées
- Corrections de problèmes lors de l’application de
ON COMMIT DROP
et
ON COMMIT DELETE ROWS
sur des tables partitionnées et sur les tables ayant des tables enfants (héritage) - Interdiction de
COPY FREEZE
sur les tables partitionnées - Plusieurs corrections pour la commande
ALTER TABLE .. ADD COLUMN
avec une valeur par défaut non-null, incluant un possible risque de corruption d’index - Plusieurs corrections sur les index GIN, notamment pour éviter un blocage de verrou pendant un VACUUM et l’ajout d’index de manière concurrente (ce changement annule partiellement une amélioration de performance introduite dans la version 10)
- Correction de crash potentiels de la réplication logique lorsque des index sont utilisés avec des expressions ou des prédicats
- Plusieurs corrections concernant les journaux de transactions (WAL)
- Correction d’un crash potentiel de requêtes
UPDATE
avec plusieurs clausesSET
utilisant des sous-requêtesSELECT
- Correction d’un crash lorsqu’aucune ligne n’est fournie aux fonctions
json[b]_populate_recordset()
oujson[b]_to_recordset()
- Plusieurs corrections liée à la gestion des collations, notamment le décodage
des expressions sensibles à la collation dans les arguments d’une requête
CALL
- Plusieurs correctifs du planificateur, incluant une amélioration de la vitesse de la planification pour de grands groupes d’héritage ou tables partitionnées
- Plusieurs correctifs pour
TRUNCATE
- S’assurer que
ALTER TABLE ONLY ADD COLUMN IF NOT EXISTS
est traité correctement - Permet
UNLISTEN
en mode standby (réplica) - Correction du parsing des listes de noms de serveurs séparées par des espaces dans le paramètre ldapserver des entrées LDAP de
pg_hba.conf
- Plusieurs correctifs pour ecpg
- Plusieurs correctifs pour psql, dont le fonctionnement de
\g target
avecCOPY TO STDOUT
- Le générateur de nombres aléatoires de
pgbench
avec--random-seed=N
est à présent totalement déterministe et indépendant de la plateforme - Correction de
pg_basebackup
etpg_verify_checksums
pour ignorer correctement les fichiers temporaires - Plusieurs correctifs pour
pg_dump
, incluant la présence de commandesALTER INDEX SET STATISTICS
- Prévenir de fausses alertes de corruption d’index par contrib/amcheck causées par des données compressées en ligne
- Support de nouvelles variables de Makefile pour la construction d’extensions
Cette mise à jour contient la version 2018i des modifications légales des fuseaux horaires au Kazakhstan, à Metlakatla et Saó Tomé et Principe. La zone Qyzylorda au Kazakhstan est coupée en deux, créant une nouvelle zone Asia/Qostanay, car certains endroits n’ont pas changé d’écart par rapport à UTC. Corrections historiques pour Hong Kong et plusieurs îles du Pacifique.
Fin de vie pour PostgreSQL 9.4
La version 9.4 sera en fin de vie à compter du 13 février 2020. Pour de plus amples explications, reportez-vous à la politique de versionnement.
Mise à jour
Toutes les mises à jour PostgreSQL sont cumulatives. Tout comme les autres versions mineures, il n’est pas utile pour les utilisateurs de décharger et recharger leur base de données ou d’utiliser pg_upgrade pour appliquer cette mise à jour. Vous devrez simplement arrêter votre instance PostgreSQL et mettre à jour les exécutables.
Les utilisateurs qui ont sauté une ou plusieurs mises à jour mineures pourraient avoir besoin de lancer des étapes supplémentaires après la mise à jour. Merci de consulter les notes de version des versions précédentes pour plus de détails.
Liens
- PostgreSQL (402) ,
- release (84) ,
- mineure (31) ,
- sécurité (55) ,
- 9 (57) ,
- 10 (32) ,
- 11 (26) ,
- update (46)