LOXODATA

PostgreSQL 9.6.2 et autres correctifs

2017-02-09   1143 mots, 6 minutes de lecture

Publication de PostgreSQL 9.6.2 et autres mises à jour cumulatives

Le PostgreSQL Global Development Group a publié une mise à jour de toutes les versions supportées de notre système de base de données.
Il s’agit des versions mineures 9.6.2, 9.5.6, 9.4.11, 9.3.16 et 9.2.20.
Cette publication corrige des problèmes potentiels de corruptions de données lors de la construction d’index et dans certaines situations d’applications des journaux de transactions (write-ahead-log).
Ces situations sont détaillées ci-dessous.
Elle corrige aussi plus de 75 bugs reportés ces 3 derniers mois.

Comme toujours, les mises à jour doivent être appliquées le plus rapidement possible.

Corruption due à CREATE INDEX CONCURRENTLY

Il existe une situation de concurrence (« race condition ») si CREATE INDEX CONCURRENTLY est appelé sur une colonne qui n’a pas déjà été indexée.
Il se peut que des enregistrements insérées ou mis à jour par des transactions exécutées en même temps que la commande CREATE INDEX CONCURRENTLY soient indexés incorrectement.

Si un tel cas est suspecté, la solution la plus fiable consiste à reconstruire les index concernés après l’installation de la mise à jour.

Ce problème est présent dans les versions 9.2, 9.3, 9.4, 9.5, et 9.6 de PostgreSQL.

Correctifs de visibilité et stabilité de l’enregistrement des journaux de transactions

Cette publication contient plusieurs correctifs améliorant la stabilité des données visibles et les enregistrements des journaux de transactions (WAL) que nous souhaitons mettre en évidence ici.

Avant cette publication, des données pouvaient être prématurément supprimées par une opération de maintenance (« vacuum ») lorsqu’un « snapshot » particulier, utilisé pour les lectures du catalogue, est disponible.
Plus particulièrement, le « vacuum » n’a pas connaissance du plus vieux « xmin » de ce « snapshot » spécial. L’erreur apparaîtra avec un message du style :

    “cache lookup failed for relation 1255”

Cette mise à jour s’assure que les « vacuum » prennent en compte les « snapshots » de lectures du catalogue.

Il y a égalament plusieurs correctifs améliorant la stabilité de l’enregistrement des journaux de transactions, dont :

  • un correctif pour l’enregistrement dans les journaux de transactions des index BRIN où une application pouvait rendre une portion de l’index BRIN inutile et nécessiter un nouveau calcul ;
  • un correctif à propos des tables non-tracées (« unlogged ») où un enregistrement dans les journaux de transactions était créé, avec le paramètre wal_level = minimal, mais lors d’un rejeu après crash, la table semblait n’avoir pas été correctement réinitialisée ;
  • un correctif dans la validation de l’entête d’une page des journaux de transactions (« WAL »), lors de la relecture des segments, corrigeant l’erreur “out-of-sequence TLI” pouvant être reportée pendant la phase de restauration.

Ces problèmes sont présents dans la version 9.6 de PostgreSQL et peuvent être présents dans les versions 9.2, 9.3, 9.4 et 9.5.

Correctifs et améliorations

Cette mise à jour corrige un certain nombre de bugs rapportés au cours des derniers mois. Certains de ces problèmes affectent uniquement la version 9.6, mais la plupart affectent toutes les versions supportées.
Il y a plus de 75 correctifs fournis dans cette publication, dont :

  • plusieurs correctifs pour le fonctionnement en mode « hot standby » ;
  • interdication du réglage num_sync à zéro dans synchronous_standby_names ;
  • ne pas comparer le nombre de processus d’arrière-plan et la limite de connexions d’un utilisateur ;
  • correction de la vérification de la possibilité de suppression d’un objet membre d’une extension ;
  • correction du suivi des privilèges initiaux des objets membres d’une extension afin de faire fonctionner correctement ALTER EXTENSION … ADD/DROP ;
  • plusieurs correctifs sur vacuum et autovacuum ;
  • correction de CREATE OR REPLACE VIEW pour mettre à jour la requête de la vue avant d’essayer d’appliquer les nouvelles options de la vue ;
  • s’assurer qu’un ALTER TABLE préserve l’assignation du tablespace d’un index lors de la reconstruction des index ;
  • plusieurs correctifs sur le planificateur de requêtes, incluant des correctifs sur les tables étrangères et les CTEs ;
  • plusieurs correctifs autour de la recherche plein-texte pour améliorer la pertinence et les performances de la recherche ;
  • plusieurs correctifs et améliorations de performance des fonctions « tableaux » (« array functions ») ;
  • plusieurs correctifs d’interactions entre les contraintes de clés étrangères et les fonctions déclencheurs autour d’opérations spécifiques d’ALTER TABLE ;
  • suppression d’optimisations des types de données date et heure retournant des données incorrectes ;
  • correction de l’usage incorrect de la vue reloptions en tant que table régulière reloptions ;
  • correction du message incorrect « target lists can have at most N entries » lors de l’utilisation de ON CONFLICT avec de grandes tables ;
  • correction de la fausse erreur « query provides a value for a dropped column » pendant l’utilisation de INSERT ou UPDATE sur une table ayant une colonne supprimée ;
  • interdiction de l’expansion multi-colonne de foo.* dans une expression source d’un UPDATE ;
  • assurance que le typmods d’une colonne est déterminé avec précision pour les constructions VALUES multi-colonnes ;
  • plusieurs correctifs pour l’outil en ligne de commande psql ;
  • interdiction de l’exécution concurrente de plusieurs appels de pg_start_backup() et pg_stop_backup() ;
  • plusieurs correctifs pour pg_dump, pg_restore et pg_basebackup, incluant un possible échec de pg_basebackup sur un serveur standby incluant les journaux de transactions ;
  • plusieurs correctifs pour les tâches de parallélisation et les plans d’exécution des requêtes parallèles, incluant la correction d’une interruption de service si le nombre de tâches disponibles pour une requête parallèle décroît pendant une relecture ;
  • plusieurs correctifs à PL/pgSQL, PL/Python, et PL/Tcl ;
  • plusieurs correctifs des modules contrib ;
  • permettre les terminateurs de ligne de style DOS dans le fichier ~/.pgpass, même sur Unix.

Cette mise à jour contient également la version 2016j de tzdata avec les modifications de loi DST en Chypre du nord (ajout d’une nouvelle zone Asia/Famagusta), Russie (ajout d’une nouvelle zone Europe/Saratov), Tonga, et Antarctica/Casey. Corrections historiques pour l’Italie, Kazakhstan, Malte, et la Palestine. Bascule vers l’utilisation préférentielle de l’abréviation numérique pour Tonga.

Mise à jour

Toutes les mises à jours de PostgreSQL sont cumulatives.
Comme pour toutes les mises à jours, il n’est pas nécessaire d’effectuer un export/import des bases ou d’utiliser pg_upgrade pour appliquer la mise à jour courante. Il suffit d’arrêter PostgreSQL et de mettre à jour les binaires.

Si vous pensez avoir été affecté par le bug CREATE INDEX CONCURRENTLY mentionné ci-dessus, vous aurez à reconstruire l’index.
Exemple de reconstruction d’index sans perdre la possibilité de l’utiliser :

    CREATE INDEX CONCURRENTLY new_index_name ON table_name (column_name);
    DROP INDEX CONCURRENTLY old_index_name;
    ALTER INDEX new_index_name RENAME TO old_index_name;

Il est à noter que cette méthode implique la présence temporaire de deux copies de l’index. Si l’espace disque pose problème, il faut utiliser une autre méthode.

Les utilisateurs qui ont manqué une ou plusieurs mises à jour devront éventuellement effectuer des opérations post-mise à jour supplémentaires. Voir les notes de version à ce propos.

Liens