Ce chapitre fournit un aperçu du format de stockage physique utilisé
par les bases de données PostgreSQL™.
52.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 à 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 le
définir). Un emplacement courant pour PGDATA est /var/lib/pgsql/data. Plusieurs groupes, gérés par
différentes instances du serveur, 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 52.1,
« Contenu de PGDATA ». 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 de les
conserver ailleurs à partir de la version 8.0 de PostgreSQL™).
Tableau 52.1. Contenu de PGDATA
|
Élément
|
Description
|
|
PG_VERSION
|
Un fichier contenant le numéro de version majeur de
PostgreSQL™
|
|
base
|
Sous-répertoire contenant les sous-répertoires par base
de données
|
|
global
|
Sous-répertoire contenant les tables communes au groupe,
telles que pg_database
|
|
pg_clog
|
Sous-répertoire contenant les données d'état de
validation des transactions
|
|
pg_multixact
|
Sous-répertoire contenant des données sur l'état des
multi-transactions (utilisé pour les verrous de lignes
partagées)
|
|
pg_subtrans
|
Sous-répertoire contenant les données d'états des
sous-transaction
|
|
pg_tblspc
|
Sous-répertoire contenant les liens symboliques vers les
espaces logiques
|
|
pg_twophase
|
Sous-répertoire contenant les fichiers d'état pour les
transactions préparées
|
|
pg_xlog
|
Sous-répertoire contenant les fichiers WAL (Write Ahead
Log)
|
|
postmaster.opts
|
Un fichier enregistrant les options en ligne de commande
avec lesquelles le serveur a été lancé la dernière fois
|
|
postmaster.pid
|
Un fichier verrou enregistrant le PID courant du serveur
et l'identifiant du segment de mémoire partagé (absent
après l'arrêt du serveur)
|
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 sont stockés 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 d'un Go. Le nom du fichier du
premier segment est identique au filenode; les segments suivants
sont nommés filenode.1, filenode.2, etc. Cette disposition évite
des problèmes sur les plateformes qui ont des limitations sur les
tailles des fichiers. Le contenu des tables et des index est
discuté plus en détails dans Section 52.3,
« Emplacement des pages de la base de données ».
Une table contenant des colonnes avec des entrées potentiellement
volumineuses aura une table TOAST
associée, qui est utilisée pour le stockage de valeurs de champs
trop importantes pour conserver des lignes adéquates. pg_class.
reltoastrelid
établit un lien entre une
table et sa table TOAST, si elle
existe. Voir Section 52.2, « TOAST » pour
plus d'informations.
Les tablespaces 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 du
tablespace (comme spécifié dans sa commande
CREATE TABLESPACE
). Le lien
symbolique est nommé d'après l'OID du tablespace. À l'intérieur du
répertoire du tablespace, il existe un sous-répertoire pour chacune
des bases de données contenant des éléments dans ce tablespace. Ce
sous-répertoire est nommé d'après l'OID de la base. Les tables de
ce répertoire suivent le schéma de nommage des filenodes. Le
tablespace pg_default n'est pas accédé via
pg_tblspc mais correspond à PGDATA
/base. De façon
similaire, le tablespace pg_global n'est
pas accédé via pg_tblspc mais correspond
à PGDATA
/global.