Chapitre 49. Stockage physique de la base de données

Table des matières
49.1. Emplacement des fichiers de la base de données
49.2. TOAST
49.3. Emplacement des pages de la base de données

Ce chapitre fournit un aperçu du format de stockage physique utilisé par les bases de données PostgreSQL.

49.1. Emplacement des fichiers de la base de données

Cette section décrit le format de stockage au niveau des fichiers et répertoires.

Toutes les données nécessaires pour un groupe de bases de données sont stockées dans le répertoire data du groupe, habituellement référencé en tant que PGDATA (d'après le nom de la variable d'environnement qui peut être utilisé pour la définir). Un emplacement commun pour PGDATA est /var/lib/pgsql/data. Plusieurs groupes, gérés par différents postmasters, peuvent exister sur la même machine.

Le répertoire PGDATA contient plusieurs sous-répertoires et fichiers de contrôle, comme indiqué dans le Tableau 49-1. En plus de ces éléments requis, les fichiers de configuration du groupe, postgresql.conf, pg_hba.conf et pg_ident.conf sont traditionnellement stockés dans PGDATA (bien qu'il soit possible, à partir de la version 8.0 de PostgreSQL, de les conserver ailleurs).

Tableau 49-1. Contenu de PGDATA

ÉlémentDescription
PG_VERSIONUn fichier contenant le numéro de version majeur de PostgreSQL
baseSous-répertoire contenant les sous-répertoires par base de données
globalSous-répertoire contenant les tables communes au groupe, telles que pg_database
pg_clogSous-répertoire contenant les données d'état de validation des transactions
pg_subtransSous-répertoire contenant les données d'états des sous-transaction
pg_tblspcSous-répertoire contenant les liens symboliques vers les espaces logiques
pg_xlogSous-répertoire contenant les fichiers WAL (Write Ahead Log)
postmaster.optsUn fichier enregistrant les options en ligne de commande avec lesquelles le postmaster a été lancé la dernière fois
postmaster.pidUn fichier verrou enregistrant le PID du postmaster et l'identifiant du segment de mémoire partagé (absent après l'arrêt de postmaster)

Pour chaque base de données dans le groupe, il existe un sous-répertoire dans PGDATA/base, nommé d'après l'OID de la base de données dans pg_database. Ce sous-répertoire est l'emplacement par défaut pour les fichiers de la base de données ; en particulier, ses catalogues système sont stockés ici.

Chaque table et index est stocké dans un fichier séparé, nommé d'après le numéro filenode de la table ou de l'index, lequel se trouve dans pg_class.relfilenode.

Attention

Notez que, bien que le filenode de la table correspond souvent à son OID, cela n'est pas nécessairement le cas ; certaines opérations, comme TRUNCATE, REINDEX, CLUSTER et quelques formes d'ALTER TABLE, peuvent modifier le filenode tout en préservant l'OID. Évitez de supposer que filenode et OID sont identiques.

Quand une table ou un index dépasse 1 Go, il est divisé en segments. Le nom du fichier du premier segment est identique à filenode ; les segments suivants sont nommés filenode.1, filenode.2, etc. Cet arrangement évite des problèmes sur les plateformes qui ont des limitations sur les tailles des fichiers. Le contenu des tables et index est discuté plus en détails dans Section 49.3.

Une table qui contient des colonnes pouvant accueillir potentiellement de grandes entrées auront une table TOAST associée. Elle est utilisée pour le stockage de valeurs de champs trop importantes pour conserver des lignes propres. pg_class.reltoastrelid établit un lien entre une table et sa table TOAST, si elle existe. Voir Section 49.2 pour plus d'informations.

Les espaces logiques rendent ce scénario plus compliqués. Chaque espace logique défini par l'utilisateur contient un lien symbolique dans le répertoire PGDATA/pg_tblspc, pointant vers le répertoire physique de l'espace logique (comme spécifié dans la commande CREATE TABLESPACE). Le lien symbolique est nommé d'après l'OID de l'espace logique. À l'intérieur de l'espace logique, il existe un sous-répertoire pour chaque base de données contenant des éléments dans l'espace logique. Ce sous-répertoire est nommé d'après l'OID de la base. Les tables comprises dans ce répertoire suivent le schéma de nommage des filenodes. L'espace logique pg_default n'est pas accèdé via pg_tblspc mais correspond à PGDATA/base. De façon similaire, l'espace logique pg_global n'est pas accèdé via pg_tblspc mais correspond à PGDATA/global.