Les paramètres de configuration de PostgreSQL sont appelés GUC ce qui signifie Grand Unified Configuration, c’est le nom de la partie du code qui gère les paramètres de configuration. En gros, ce sont tous les paramètres du fichier postgresql.conf.

Ce qui est moins connu et utilisé, c’est la possibilité de configurer ces paramètres à différents niveaux :

  1. Fichier postgresql.conf
  2. Ligne de commande du postmaster, le processus principal du serveur
  3. Base de données
  4. Rôle
  5. Rôle sur une base de données
  6. Session
  7. Transaction

La précédence des valeurs va en descendant dans la liste, par exemple la valeur d’un paramètre au niveau d’un rôle écrase celle positionnée au niveau de la base de donnée ou la ligne de commande. Ce comportement est très intéressant pour définir une valeur d’un paramètre dépendante du contexte d’exécution d’un traitement. Par exemple on peut placer un timeout des requêtes au niveau de la base pour éviter qu’une application ne jette l’éponge avant PostgreSQL, et configurer l’absence de timeout pour un rôle dédié aux opérations de VACUUM et ANALYSE, on limite ainsi l’effet de bord du timeout :

-- timeout à 30 secondes sur la base de données
ALTER DATABASE mabase SET statement_timeout TO 30000;

-- pas de timeout pour le role maintenance chargé du vacuum
ALTER ROLE maintenance SET statement_timeout TO 0;

Selon l’endroit où doit être positionné la valeur on utilise :

  • postgresql.conf : directement dans le fichier
  • ligne de commande : dans le script d’init avec l’option -c et à l’exécution de pg_ctl avec l’option -o
  • base de données : ALTER DATABASE nom_base SET param TO valeur;
  • rôle : ALTER ROLE nom_role SET param TO valeur;
  • rôle dans une base de données : ALTER ROLE nom_role IN DATABASE nom_base SET param TO valeur;
  • session : SET [ SESSION ] param TO valeur;
  • transaction : SET LOCAL param TO valeur;

Pour le passage des valeurs au niveau SQL, on peut utiliser RESET param à la place de SET param TO pour réinitialiser la valeur à son défaut pour le contexte choisi.

Pour les paramètres au niveau des bases de données et des rôle, ces informations sont stockées dans la table du catalogue système pg_catalog.pg_db_role_setting. La commande psql \drdspermet de facilement afficher son contenu.

On peut également définir des paramètres personnalisés, comme le font certaines extensions. Pour cela il faut définir une classe de variables personnalisée, en déclarant un préfixe (on en sépare plusieurs par des virgules) dans le paramètre de configuration custom_variable_classes :

custom_variable_classes = 'nico'

Ensuite, on peut directement ajouter nos variables personnalisées en les préfixant par nico. :

nico.test_guc = 1000

On peut alors manipuler ces variables comme ceci :

mydb=# SHOW nico.test_guc;
 nico.test_guc 
---------------
 1000
(1 row)

mydb=# SHOW nico.test_guc;
 nico.test_guc 
---------------
 1000
(1 row)

mydb=# SET nico.test_guc = 3;
SET
mydb=# SHOW nico.test_guc;
 nico.test_guc 
---------------
 3
(1 row)

mydb=# SET nico.reguc = on;
SET
mydb=# SHOW nico.reguc;
 nico.reguc 
------------
 on
(1 row)

Enfin, on peut utiliser les fonctions current_setting() et set_config() pour manipuler ces variables dans des fonctions :

mydb=# SELECT set_config('nico.test_guc', '100', false);
 set_config 
------------
 100
(1 row)

mydb=# SELECT current_setting('nico.test_guc');
 current_setting 
-----------------
 100
(1 row)

PS: merci à ce post pour l’idée de creuser le sujet.