Un grand nombre de paramètres de configuration permettent de modifier le comportement du système de bases de données. Dans la première section de ce chapitre, les méthodes de configuration de ces paramètres sont décrites ; les sections suivantes discutent de chaque paramètre en détail.
Tous les noms de paramètres sont insensibles à la casse. Chaque paramètre prend une valeur d'un de ces cinq types : booléen, entier, nombre à virgule flottante, chaîne de caractères ou énumération. Les unités par défaut peuvent être récupérées en référençant pg_settings.unit. Les valeurs booléennes peuvent être on, off, true, false, yes, no, 1, 0 ou tout préfixe non ambigü de celles-ci (toutes ces écritures sont insensibles à la casse).
Certains paramètres indiquent une valeur de taille mémoire ou de durée. Ils ont chacun une unité implicite, soit Ko, soit blocs (typiquement 8 Ko), soit millisecondes, soit secondes, soit minutes. Les unités par défaut peuvent être obtenues en interrogeant pg_settings.unit. Pour simplifier la saisie, une unité différente peut être indiquée de façon explicite. Les unités mémoire valides sont kB (kilo-octets), MB (Méga-octets) et GB (Giga-octets) ; les unités de temps valides sont ms (millisecondes), s (secondes), min (minutes), h (heures), et d (jours). Les unités de mémoire sont des multiples de 1024, pas de 1000.
Les paramètres de type « enum » sont spécifiés de la même façon que les paramètres de type chaîne, mais sont restreints à un jeu limité de valeurs. Les valeurs autorisées peuvent être obtenues de pg_settings.enumvals. Les paramètres enum sont insensibles à la casse.
Une façon d'initialiser ces paramètres est d'éditer le fichier postgresql.conf qui est normalement placé dans le répertoire des données (une copie par défaut est installé ici quand le répertoire des données est initialisé). Un exemple de contenu peut être :
# Ceci est un commentaire log_connections = yes log_destination = 'syslog' search_path = '"$user", public' shared_buffers = 128MB
Un paramètre est indiqué par ligne. Le signe égal entre le nom et la valeur est optionnel. Les espaces n'ont pas de signification et les lignes vides sont ignorées. Les symboles dièse (#) désignent le reste de la ligne comme un commentaire. Les valeurs des paramètres qui ne sont pas des identificateurs simples ou des nombres doivent être placées entre guillemets simples. Pour intégrer un guillemet simple dans la valeur d'un paramètre, on écrit soit deux guillemets (c'est la méthode préférée) soit un antislash suivi du guillemet.
En plus de la configuration des paramètres, le fichier postgresql.conf peut contenir des directives d'inclusion indiquant un autre fichier à lire et dont le contenu doit être traité à ce niveau comme partie intégrante du fichier de configuration. Les directives d'inclusion ressemblent simplement à :
include 'nom_fichier'
Si le nom du fichier n'est pas un chemin absolu, il est pris comme relatif au répertoire contenant le fichier de configuration le référençant. Les inclusions peuvent être imbriquées.
Le fichier de configuration est relu à chaque fois que le processus serveur principal reçoit un signal SIGHUP (pg_ctl reload est le moyen le plus simple de l'envoyer). Le processus serveur principal propage aussi ce signal aux processus serveur en cours d'exécution de façon à ce que les sessions existantes obtiennent aussi la nouvelle valeur. Il est également possible d'envoyer le signal directement à un seul processus serveur. Quelques paramètres ne peuvent être initialisés qu'au lancement du serveur ; tout changement de leur valeur dans le fichier de configuration est ignoré jusqu'au prochain démarrage du serveur.
Une autre façon de configurer ces paramètres est de les passer comme option de la commande postgres :
postgres -c log_connections=yes -c log_destination='syslog'
Les options de la ligne de commande surchargent le paramétrage effectué dans le fichier postgresql.conf. Ce qui signifie que la valeur d'un paramètre passé en ligne de commande ne peut plus être modifiée et rechargée à la volée à l'aide du fichier postgresql.conf. C'est pourquoi, bien que la méthode de la ligne de commande paraisse pratique, elle peut coûter en flexibilité par la suite.
Il est parfois utile de donner une option en ligne de commande pour une session particulière unique. La variable d'environnement PGOPTIONS est utilisée côté client à ce propos :
env PGOPTIONS='-c geqo=off' psql
(Cela fonctionne pour toute application client fondée sur libpq, et non pas seulement pour psql.) Cela ne fonctionne pas pour les paramètres fixés au démarrage du serveur ou qui doivent être précisés dans postgresql.conf.
De plus, il est possible d'affecter un ensemble de paramètres à un utilisateur ou à une base de données. Quand une session est lancée, les paramètres par défaut de l'utilisateur et de la base de données impliqués sont chargés. Les commandes ALTER ROLE(7) et ALTER DATABASE(7) sont respectivement utilisées pour configurer ces paramètres. Les paramètres par base de données surchargent ceux passés sur la ligne de commande de postgres ou du fichier de configuration et sont à leur tour surchargés par ceux de l'utilisateur ; les deux sont surchargés par les paramètres de session.
Quelques paramètres peuvent être modifiés dans les sessions SQL individuelles avec la commande SET(7), par exemple :
SET ENABLE_SEQSCAN TO OFF;
Si SET est autorisé, il surcharge toutes les autres sources de valeurs pour le paramètre. Quelques paramètres ne peuvent pas être changés via SET : s'ils contrôlent un comportement qui ne peut pas être modifié sans relancer le serveur PostgreSQL™, par exemple. De plus, quelques paramètres peuvent être modifiés via SET ou ALTER par les superutilisateurs.
La commande SHOW(7) permet d'inspecter les valeurs courantes de tous les paramètres.
La table virtuelle pg_settings autorise aussi l'affichage et la mise à jour de paramètres de session à l'exécution ; voir Section 45.62, « pg_settings » pour les détails et une description des différents types de variable et de comment ils peuvent être changés. pg_settings est équivalente à SHOW et SET mais peut être plus facile à utiliser parce qu'elle peut être jointe avec d'autres tables et que ses lignes peuvent être sélectionnées en utilisant des conditions personnalisées. Elle contient aussi davantage d'informations sur les valeurs autorisées pour les paramètres.