PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 15.10 » Administration du serveur » Configuration du serveur et mise en place » Créer un groupe de base de données

19.2. Créer un groupe de base de données

Avant de faire quoi que ce soit, vous devez initialiser un emplacement de stockage pour la base de données. Nous appelons ceci un groupe de bases de données (le standard SQL utilise le terme de groupe de catalogues). Un groupe de bases de données est une collection de bases données et est géré par une seule instance d'un serveur de bases de données en cours d'exécution. Après initialisation, un groupe de bases de données contiendra une base de données nommée postgres, qui a pour but d'être la base de données par défaut utilisée par les outils, les utilisateurs et les applications tiers. Le serveur de la base de données lui-même ne requiert pas la présence de la base de données postgres mais beaucoup d'outils supposent son existence. Il existe deux bases de données supplémentaires créées dans chaque instance lors de l'initialisation. Elles ont pour nom template1 et template0. Comme leur nom le suggère, elles seront utilisées comme modèle pour les bases de données créées après ; elles ne devraient pas être utilisées pour un vrai travail (voir le Chapitre 23 pour des informations sur la création de nouvelles bases de données dans l'instance).

En terme de système de fichiers, un groupe de bases de données est un simple répertoire sous lequel les données seront stockées. Nous l'appelons le répertoire de données ou l'emplacement des données. Le choix de cet emplacement vous appartient complètement. Il n'existe pas de valeur par défaut bien que les emplacements tels que /usr/local/pgsql/data ou /var/lib/pgsql/data sont populaires. Le répertoire de données doit être initialisé avant d'être utilisé, en utilisant le programme initdb qui est installé avec PostgreSQL.

Si vous utilisez une version pré-packagée de PostgreSQL, il pourrait bien avoir une convention spécifique pour l'emplacement du répertoire de données, et il pourrait aussi fournir un script pour créer le répertoire de données. Dans ce cas, il est conseillé d'utiliser ce script plutôt que d'exécuter directement initdb. Consultez la documentation du paquet pour les détails.

Pour initialiser un groupe de bases de données, exécutez la commande initdb et indiquez l'emplacement désiré sur le système de fichiers de l'instance avec l'option -D, par exemple

$ initdb -D /usr/local/pgsql/data

Notez que vous devez exécuter cette commande en étant connecté sous le compte de l'utilisateur PostgreSQL décrit dans la section précédente.

Astuce

Comme alternative à l'option -d, vous pouvez initialiser la variable d'environnement pgdata.

Autrement, vous pouvez exécuter initdb via le programme pg_ctl ainsi :

$ pg_ctl -D /usr/local/pgsql/data initdb
   

C'est peut-être plus intuitif si vous utilisez déjà pg_ctl pour démarrer et arrêter le serveur (voir Section 19.3 pour les détails). Un gros intérêt est de ne connaître que cette seule commande pour gérer l'instance du serveur de bases de données.

initdb tentera de créer le répertoire que vous avez spécifié si celui-ci n'existe pas déjà. Bien sûr, cela peut échouer si initdb n'a pas les droits pour écrire dans le répertoire parent. Il est généralement recommandé que l'utilisateur PostgreSQL soit propriétaire du répertoire des données, mais aussi du répertoire parent pour que ce problème ne se présente pas. Si le répertoire parent souhaité n'existe pas plus, vous aurez besoin de le créer, en utilisant les droits de l'utilisateur root si nécessaire. Le processus pourrait ressembler à ceci :

root# mkdir /usr/local/pgsql
root# chown postgres /usr/local/pgsql

initdb refusera de s'exécuter si le répertoire des données existe et contient déjà des fichiers. Cela permet de prévenir tout écrasement accidentel d'une installation existante.

Comme le répertoire des données contient toutes les données stockées dans la base, il est essentiel qu'il soit protégé contre les accès non autorisés. En conséquence, initdb supprime les droits d'accès à tout le monde sauf à l'utilisateur PostgreSQL, et optionnellement au groupe. L'accès au groupe, s'il est autorisé, est en lecture seule. Cela permet à un utilisateur non privilégié, du même groupe que le propriétaire de l'instance, de faire une sauvegarde des fichiers ou d'effectuer des opérations qui ne requièrent qu'un accès en lecture.

Notez qu'activer ou désactiver l'accès au groupe sur une instance préexistante exige qu'elle soit arrêtée et que les droits soient mis en place sur tous les répertoires et fichiers avant de redémarrer PostgreSQL. Sinon, un mélange des droits pourrait exister dans le répertoire de données. Pour les instances qui ne donnent accès qu'au propriétaire, les droits appropriés sont 0700 sur les répertoires et 0600 sur les fichiers. Pour les instances qui permettent aussi la lecture par le groupe, les droits appropriés sont 0750 sur les répertoires et 0640 sur les fichiers.

Néanmoins, bien que le contenu du répertoire soit sécurisé, la configuration d'authentification du client par défaut permet à tout utilisateur local de se connecter à la base de données et même à devenir le superutilisateur de la base de données. Si vous ne faites pas confiance aux utilisateurs locaux, nous vous recommandons d'utiliser une des options -w ou --pwprompt de la commande initdb pour affecter un mot de passe au superutilisateur de la base de données . De plus, spécifiez -A scram-sha-256 de façon à ce que la méthode d'authentification trust par défaut ne soit pas utilisée ; ou modifiez le fichier pg_hba.conf généré après l'exécution d'initdb (d'autres approches raisonnables incluent l'utilisation de l'authentification peer ou les droits du système de fichiers pour restreindre les connexions. Voir le Chapitre 21 pour plus d'informations).

initdb initialise aussi la locale par défaut du groupe de bases de données. Normalement, elle prends seulement le paramétrage local dans l'environnement et l'applique à la base de données initialisée. Il est possible de spécifier une locale différente pour la base de données ; la Section 24.1 propose plus d'informations là-dessus. L'ordre de tri utilisé par défaut pour ce cluster de bases de données est initialisé par initdb et, bien que vous pouvez créer de nouvelles bases de données en utilisant des ordres de tris différents, l'ordre utilisé dans les bases de données modèle que initdb a créé ne peut pas être modifié sans les supprimer et les re-créer. Cela a aussi un impact sur les performances pour l'utilisation de locales autres que c ou posix. Du coup, il est important de faire ce choix correctement la première fois.

initdb configure aussi le codage par défaut de l'ensemble de caractères pour le groupe de bases de données. Normalement, cela doit être choisi pour correspondre au paramétrage de la locale. Pour les détails, voir la Section 24.3.

Les locales différentes de C et POSIX se basent sur la bibliothèque de collationnement du système pour le tri dépendant du jeu de caractères. Cela contrôle l'ordre des clés stockées dans les index. Pour cette raison, une instance ne peut pas basculer vers une version incompatible de la bibliothèque de collationnement, que ce soit pour une restauration d'une sauvegarde PITR mais aussi pour de la réplication binaire en flux ou pour un système d'exploitation différent, ou une mise à jour du système d'exploitation.

19.2.1. Utilisation de systèmes de fichiers secondaires

Beaucoup d'installations créent leur instance dans des systèmes de fichiers (volumes) autres que le volume racine de la machine. Si c'est votre choix, il est déconseillé d'utiliser le répertoire principal de ce volume secondaire (son point de montage) comme répertoire de données. Une meilleure pratique est de créer un répertoire au sein du point de montage, répertoire possédé par l'utilisateur PostgreSQL, puis de créer le répertoire de données à l'intérieur. Ceci évite des problèmes de droits, tout particulièrement lors d'opérations comme pg_upgrade, et garantit aussi des échecs propres si le volume secondaire n'est pas disponible.

19.2.2. Systèmes de fichiers

De manière générale, tout système de fichiers avec une sémantique POSIX est utilisable avec PostgreSQL. Les utilisateurs peuvent en choisir de différents pour diverses raisons, comme le support du fournisseur, la performance ou la familiarité. L'expérience montre que, toutes choses égales par ailleurs, on ne doit pas espérer de grosses différences de performances ou de comportement en changeant juste de système de fichiers ni en faisant de petites modifications de sa configuration.

19.2.2.1. NFS

Il est possible d'utiliser un système de fichier NFS pour le répertoire des données de PostgreSQL. PostgreSQL ne fait rien de spécial sur un un système de fichier NFS, c'est-à-dire qu'il suppose un comportement identique à celui de disques connectés locaux. PostgreSQL n'utilise aucune fonctionnalité connue pour un comportement non standard sur NFS, comme le verrouillage de fichier.

Le seul pré-requis ferme pour l'utilisation de NFS avec PostgreSQL est que celui-ci soit monté avec l'option hard. Avec cette option, des processus peuvent rester « pendants » indéfiniment s'il y a des problèmes réseau ;cette configuration nécessite donc une mise en place soigneuse. L'option soft interrompra les appels système en cas de problème réseau, mais PostgreSQL ne répétera pas ces appels interrompus ; une telle interruption mènera donc à la levée d'une erreur d'entrée-sortie.

Il n'est pas nécessaire d'utiliser l'option de montage sync. Le comportement de async est suffisant car PostgreSQL génère des appels fsync quand c'est approprié pour purger les caches en écriture. (C'est analogue au fonctionnement sur un système de fichiers local). Cependant, il est fortement conseillé d'utiliser l'option sync pour l'export depuis le serveur NFS sur les systèmes où elle existe (principalement Linux). Sinon, il n'y a pas de garantie qu'un fsync, ou son équivalent, sur le client NFS, atteigne le stockage permanent du serveur, ce qui causerait une corruption, comme si on tournait avec fsync à off. Les valeurs par défaut des options de montage et d'export diffèrent selon les fournisseurs et les versions ; il est donc recommandé de les vérifier, voire de les préciser explicitement pour lever toute ambiguïté.

Dans certains cas, un stockage externe peut être utilisé soit par NFS, soit par un protocole de plus bas niveau comme iSCSI. Dans ce dernier cas, le stockage apparaît comme un périphérique par bloc et n'importe quel système de fichiers peut y être créé. Cette approche peut éviter au DBA de gérer les particularités du NFS, mais la complexité de la gestion du stockage distant est bien sûr repoussée à un autre niveau.