19.6. Tablespaces
Les tablespaces dans PostgreSQL™ permettent aux administrateurs
de bases de données de définir l'emplacement dans le système de
fichiers où seront stockés les fichiers représentant les objets de la
base de données. Une fois créé, un tablespace peut être référencé par
son nom lors de la création d'objets.
En utilisant les tablespaces, un administrateur peut contrôler les
emplacements sur le disque d'une installation PostgreSQL™. Ceci est utile dans au moins
deux cas. Tout d'abord, si la partition ou le volume sur lequel le
groupe a été initialisé arrive à court d'espace disque mais ne peut
pas être étendu, un tablespace peut être créé sur une partition
différente et utilisé jusqu'à ce que le système soit reconfiguré.
Deuxièmement, les tablespaces permettent à un administrateur
d'utiliser sa connaissance des objets de la base pour optimiser les
performances. Par exemple, un index qui est très utilisé peut être
placé sur un disque très rapide et disponible, comme un périphérique
mémoire. En même temps, une table stockant des données archivées et
peu utilisée ou dont les performances ne portent pas à conséquence
pourra être stockée sur un disque système plus lent, moins cher.
Pour définir un tablespace, utilisez la commande CREATE
TABLESPACE, par exemple :
CREATE TABLESPACE espace_rapide LOCATION '/mnt/sda1/postgresql/data';
L'emplacement doit être un répertoire existant, possédé par
l'utilisateur système PostgreSQL™. Tous les objets créés par la
suite dans le tablespace seront stockés dans des fichiers contenus
dans ce répertoire.
Note
Il n'y a généralement aucune raison de créer plus d'un tablespace
sur un système de fichiers logique car vous ne pouvez pas
contrôler l'emplacement des fichiers individuels à l'intérieur de
ce système de fichiers logique. Néanmoins, PostgreSQL™ ne vous impose aucune
limitation et, en fait, il n'est pas directement conscient des
limites du système de fichiers sur votre système. Il stocke juste
les fichiers dans les répertoires que vous lui indiquez.
La création d'un tablespace lui-même doit être fait en tant que
superutilisateur de la base de données mais, après cela, vous pouvez
autoriser des utilisateurs standards de la base de données à
l'utiliser. Pour cela, donnez-leur le droit CREATE sur le tablespace.
Les tables, index et des bases de données entières peuvent être
affectés à des tablespaces particuliers. Pour cela, un utilisateur
disposant du droit CREATE sur un tablespace
donné doit passer le nom du tablespace comme paramètre de la
commande. Par exemple, ce qui suit crée une table dans le tablespace
espace1 :
CREATE TABLE foo(i int) TABLESPACE espace1;
Autrement, utilisez le paramètre default_tablespace
:
SET default_tablespace = espace1;
CREATE TABLE foo(i int);
Quand default_tablespace est configuré avec
autre chose qu'une chaîne vide, il fournit une clause TABLESPACE implicite pour les commandes
CREATE TABLE
et
CREATE INDEX
qui n'en ont pas
d'explicites.
Le tablespace associé avec une base de données est utilisé pour
stocker les catalogues système de la base, ainsi que tous les fichier
temporaires créés par les processus serveur utilisant cette base de
données. De plus, il est l'espace par défaut pour les tables et index
créés à l'intérieur de cette base de données si aucune clause
TABLESPACE n'est fournie (soit explicitement
soit via default_tablespace) lors de la
création des objets. Si une base de données est créée sans spécifier
de tablespace pour elle, le serveur utilise le même tablespace que
celui de la base modèle utilisée comme copie.
Deux tablespaces sont automatiquement créés par initdb. Le tablespace pg_global est utilisé pour les catalogues système
partagés. Le tablespace pg_default est
l'espace logique par défaut des bases de données template1 et template0 (et,
du coup, sera le tablespace par défaut pour les autres bases de
données sauf en cas de surcharge par une clause TABLESPACE dans
CREATE
DATABASE
).
Une fois créé, un tablespace peut être utilisé à partir de toute base
de données si l'utilisateur le souhaitant dispose du droit
nécessaire. Ceci signifie qu'un tablespace ne peut pas supprimé tant
que tous les objets de toutes les bases de données utilisant le
tablespace n'ont pas été supprimés.
Pour supprimer un tablespace vide, utilisez la commande DROP
TABLESPACE.
Pour déterminer l'ensemble des tablespaces existants, examinez le
catalogue système pg_tablespace, par
exemple
SELECT spcname FROM pg_tablespace;
La métacommande \db du programme
psql(1)
est aussi utile pour afficher les tablespaces existants.
PostgreSQL™ fait une
utilisation intensive des liens symboliques pour simplifier
l'implémentation des tablespaces. Ceci signifie que les tablespaces
peuvent être utilisés
seulement
sur les systèmes supportant les
liens symboliques.
Le répertoire $PGDATA/pg_tblspc contient
des liens symboliques qui pointent vers chacun des tablespaces
utilisateur dans le groupe. Bien que non recommandé, il est possible
d'ajuster la configuration des tablespaces à la main en redéfinissant
ces liens. Deux avertissements : ne pas le faire alors que le serveur
est en cours d'exécution, mettez à jour le catalogue pg_tablespace pour indiquer les nouveaux
emplacements (si vous ne le faites pas, pg_dump continuera à afficher les anciens emplacements
des tablespaces).