Nouveautés de PostgreSQL 15

Workshop 15

Dalibo & Contributors

Administration

Fonctionnement interne

Lancement du background writer et du checkpointer lors d’une récupération suite à un crash

  • Les processus checkpointer et bgwriter sont lancés dès la phase de crash recovery
    • simplifier le code en limitant la duplication
    • améliorer les performances dans certains cas

Plus de checkpoint lors de la création d’une database

  • CREATE DATABASE .. STRATEGY WAL_LOG (valeur par défaut)
    • opération entièrement tracée dans les WAL
    • évite deux checkpoints potentiellement impactant pour les performances
    • manipulation plus sécurisée à la fois sur l’instance primaire et les instances qui rejouent les WAL par la suite, notamment les instances secondaires
  • CREATE DATABASE .. STRATEGY FILE_COPY
    • méthode historique
    • génère moins de WAL
    • plus rapide quand la base modèle est très grosse

Statistiques d’activité en mémoire partagée

  • Statistiques d’activité stockées en mémoire
  • Données perdues en cas de crash.
  • Disparition du processus stats collector
  • Disparition du paramètre stats_temp_directory
  • Nouveau paramètre stats_fetch_consistency

Préservation de l’OID des relfilenodes, tablespaces, et bases de données après une migration pg_upgrade

  • pg_upgrade préserve désormais :
    • les relfilenode
    • les oid de tablespaces
    • les oid de base de données
  • pour :
    • faciliter les analyses post upgrade
    • économiser de la bande passante quand on resynchronise une instance post upgrade avec rsync

psql

Optimisation des performances de la commande \copy

  • optimisation de la méta-commande psql \copy from

Nouvelles commandes \getenv et \dconfig

  • Ajout de nouvelles méta-commandes psql
  • commande \dconfig pour afficher la configuration de l’instance
  • commande \getenv pour récupérer la valeur d’une variable d’environnement

Diverses améliorations sur l’auto-complétion

  • Recherche insensible à la casse
  • Affichage des noms complets des commandes plutôt que leurs abréviations
  • Amélioration de l’auto-complétion de différentes commandes SQL :
    • EXPLAIN EXECUTE
    • LOCK TABLE ONLY | NOWAIT
    • ALTER TABLE ... ADD
    • CREATE, ALTER, DROP

Sauvegarde et restauration

Fin des backups exclusifs

  • le mode backup exclusive:
    • risqué en cas de crash de l’instance
    • déprécié depuis la version 9.6
    • supprimé depuis la version 15
  • renommage des fonctions de backup :
    • pg_start_backup() devient pg_backup_start()
    • pg_stop_backup() devient pg_backup_stop()

Archive_library & module “basic archive”

  • Option de remplacement pour l’archive_command
  • Nouveau paramètre archive_library
  • Module basic_archive :
    • basic_archive.archive_directory

Permettre le pre-fetch du contenu des fichiers WAL pendant le recovery

  • Accélération du recovery grâce au prefetch des blocs de données accédés dans les enregistrements de WAL
    • recovery_prefetch : try, on, off
    • wal_decode_buffer_size distance à laquelle on peut lire les WAL en avance de phase
  • nouvelle vue : pg_stat_recovery_prefetch

pg_basebackup --target

  • Nouveau paramètre -t/--target pour pg_basebackup
    • client, server ou blackhole
  • Sauvegarde sur le serveur seulement accessible aux membres du groupe pg_write_server_files
  • Possibilité d’ajouter des cibles via des modules additionnels
    • module basebackup_to_shell fourni en exemple

Ajout de nouveaux algorithmes de compression

  • Écritures de page complètes :
    • pglz (défaut utilisé pour on), lz4, zstd
  • Sauvegardes avec pg_basebackup :
    • --compression [{client|server}-]method:detail
    • method: gzip, lz4, zstd
    • detail: [level=]entier, workers=entier (zstd)
  • Récupération de WAL avec pg_receivewal :
    • --compression method:detail
    • method: gzip, lz4
    • detail: [level=]entier

pg_dump

  • Amélioration des performances d’export de bases avec de nombreux objets
    • désormais une seule requête pour toutes les tables à exporter
    • élimination de sous-requêtes non nécessaires
    • utilisation de PREPARE/EXECUTE pour les requêtes répétitives
  • Amélioration des performances d’export parallélisé de tables TOAST
    • données TOAST désormais comptabilisées dans la planification d’un export parallélisé

Nouvelles vues et paramètres

Ajout de la vue système pg_ident_file_mappings pour reporter les informations du fichier pg_ident.conf

  • Nouvelle vue pg_ident_file_mappings
  • Résume le contenu actuel du fichier pg_ident.conf
  • Permet le diagnostique d’erreur et la validation de la configuration

Ajout de la vue système pg_stat_subscription_stats pour reporter l’activité d’un souscripteur (cf. Réplication logique)

  • Donne des informations sur les erreurs qui se sont produites durant la réplication logique
  • Ajout de la fonction pg_stat_reset_subscription_stats()

Ajout de nouvelles variables serveur shared_memory_size et shared_memory_size_in_huge_pages

  • Ajout de deux nouvelles variables serveur :
    • shared_memory_size : détermine la taille de la mémoire partagée
    • shared_memory_size_in_huge_pages : détermine le nombre de Huge Pages nécessaires pour stocker la mémoire partagée
  • Englobe les éléments chargés avec shared_preload_libraries
  • Uniquement accessible en lecture seule

Partitionnement

Amélioration du comportement des clés étrangère lors de mises à jour qui déplacent des lignes entres les partitions

  • Correction du comportement de PostgreSQL lorsqu’un UPDATE sur une table partitionnée référencée par une contrainte de clé étrangère provoque la migration d’une ligne vers une autre partition.

Traces

Activation de la journalisation des CHECKPOINT et opérations de VACUUM lentes

  • Changement des valeurs par défaut des paramètres de journalisation :
    • log_checkpoints par défaut à on
    • log_autovacuum_min_duration par défaut à 10 minutes.

Format de sortie JSON pour les traces

  • Nouveau format de sortie pour les fichiers trace : jsonlog

Informations supplémentaires dans VACUUM VERBOSE

  • Optimisations du code de la commande VACUUM
  • Amélioration de la verbosité de la commande VACUUM VERBOSE

Divers

Possibilité de donner/restreindre les droits aux commandes SET / ALTER SYSTEM pour les utilisateurs non privilégiés

  • Apparition de deux nouveaux privilèges :
    • SET : permet de modifier les paramètres avec le context superuser
    • ALTER SYSTEM : permet à un utilisateur non superuser de modifier des paramètres avec ALTER SYSTEM SET ...
  • Donne des droits par rôle et par paramètre
  • Nouvelle table système pg_parameter_acl qui stocke la configuration

Révocation du droit par défaut CREATE sur le schéma public pour le groupe PUBLIC

  • USAGE par défaut pour le rôle PUBLIC
  • CREATE et USAGE par défaut pour le rôle pg_database_owner
  • adaptation de pg_dump pour extraire ces changements
  • Attention lors des montées de version !

Ajout de la possibilité de créer des séquences UNLOGGED

  • Évite de répliquer une séquence d’une table unlogged
  • Pas dans un but de performance
  • Une séquence d’identité hérite automatiquement de la persistance de la table de référence

Nouvelle variable d’environnement PSQL_WATCH_PAGER

  • Permet de définir un pager pour la commande \watch
  • Privilégier le pager pspg
  • Fonctionne uniquement sous Unix

Collation icu déclarées globalement

  • Définition des collations ICU pour toute l’instance ou une base de données
  • initdb et createdb
    • --locale-provider={icu|libc}
    • --icu-locale=LOCALE
  • CREATE DATABASE .. LOCALE_PROVIDER [icu,libc] ICU_LOCALE "LOCALE"
  • Contrôle des versions de collation par base de données
    • colonne pg_database.datcollversion
    • fonction pg_database_collation_actual_version
    • mise à jour : ALTER DATABASE .. REFRESH COLLATION VERSION

Ajout de l’option –config-file à pg_rewind

  • Nouvelle option -C/--config-file
  • Permet l’utilisation de l’option -c/--restore-target-wal quand la configuration de PostgreSQL n’est pas dans $PGDATA.

Performances

Exécution en parallèle des requêtes SELECT DISTINCT

  • Parallélisation des clauses DISTINCT en deux phases :
    • première phase de déduplication (parallélisée)
    • seconde phase d’agrégation et de déduplication des résultats de la première phase

pg_stat_statements

  • Nouvelles statistiques ajoutées dans pg_stat_statements pour tracer :

    • l’activité de JIT
    • les temps d’accès aux fichiers temporaires
  • L’extension passe en 1.10

Réplication logique

Nouvelle option TABLES IN SCHEMA

  • Permet de publier toutes les tables d’un schéma
  • Possibilité de mixer tables et schéma
  • Nouvelle table système pg_publication_namespace qui référence les schémas à publier

Les données publiées peuvent être filtrées

  • Ajout de la clause WHERE pour filtrer les données d’une table à publier
  • Filtre uniquement par table
  • Pas de restriction de colonne pour l’opération INSERT
  • Restrictions pour les opérations UPDATE et DELETE (colonnes couvertes par REPLICA IDENTITY)
  • Ne fonctionne qu’avec des expressions simples (y compris fonctions de base et opérateurs logiques)

Ajout de la vue système pg_stat_subscription_stats pour reporter l’activité d’un souscripteur

  • Donne des informations sur les erreurs qui se sont produites durant la réplication logique
  • Ajout de la fonction pg_stat_reset_subscription_stats()

Développement + Changement syntaxe SQL

Ajout de la commande SQL MERGE

  • Insérer, mettre à jour ou supprimer des lignes conditionnellement en un seul ordre SQL.

Permettre l’usage d’index pour les condition basées sur ^@ et starts_with()

  • starts_with() et son opérateur ^@ sont indexables directement avec un btree avec une collation C
    • fonctionnement similaire à LIKE 'chaine%'
    • conversion en deux prédicats >=, <
  • Si un index SPGist utilisable existe, LIKE 'chaine%' est transformé en ^@

Ajout de fonctions d’expression régulières pour la compatibilité avec d’autres SGBD

  • nouvelles fonctions :
    • regexp_count()
    • regexp_instr()
    • regexp_like()
    • regexp_substr()
  • fonction améliorée :
    • regexp_replace()

Régressions

Retrait du support des instances de versions 9.1 et antérieures

  • Changement sur la compatibilité des outils en version 15 :
    • psql, pg_dump et pg_dumpall ne supportent plus l’accès à des serveurs 9.1 ou antérieur
    • pg_upgrade ne supporte plus la mise à niveau depuis une instance 9.1 ou antérieur.

Python2 déprécié : Retrait des langages plpython2u et plpythonu

  • Fin du support de Python 2.x
    • Retrait des langages procéduraux plpython2u et plpythonu