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.
Même s'ils sont positionnés en dehors du répertoire de données principal de PostgreSQL, les tablespaces font partie intégrante de l'instance et ne peuvent pas être considérés comme des ensembles autonomes de fichiers de données et ne peuvent par conséquent pas être rattachés à une autre instance ou sauvegardés individuellement. De la même façon, si un tablespace est perdu (fichier supprimé, défaillance du disque dur, etc), l'instance pourrait devenir illisible ou même incapable de démarrer. Positionner un tablespace sur un système de fichiers temporaire comme un disque RAM met en péril la fiabilité de l'instance entière.
Pour définir un tablespace, utilisez la commande CREATE TABLESPACE, par exemple :
CREATE TABLESPACE espace_rapide LOCATION '/ssd1/postgresql/data';
L'emplacement doit être un répertoire existant, dont le propriétaire doit être l'utilisateur du système d'exploitation démarrant PostgreSQL. Tous les objets créés par la suite dans le tablespace seront stockés dans des fichiers contenus dans ce répertoire. Cet emplacement ne doit pas être amovible ou volatile, sinon l'instance pourrait cesser de fonctionner si le tablespace venait à manquer ou être perdu.
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.
Il existe aussi un paramètre temp_tablespaces, qui détermine l'emplacement des tables et index temporaires, ainsi les fichiers temporaires qui sont utilisés pour le tri de gros ensembles de données. Ce paramètre peut aussi contenir une liste de tablespaces, plutôt qu'une seule, pour que la charge associée aux objets temporaires soit répartie sur plusieurs tablespaces. Un membre de la liste est pris au hasard à chaque fois qu'un objet temporaire doit être créé.
Le tablespace associé avec une base de données est utilisé pour stocker
les catalogues système de la base. De plus, il est l'espace par défaut
pour les tables, index et fichiers temporaires créés à l'intérieur de
cette base de données si aucune clause TABLESPACE
n'est
fournie et qu'aucune sélection n'est spécifiée par
default_tablespace
ou
temp_tablespaces
(comme approprié). 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 lors de l'initialisation du
cluster de bases de données. 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 est aussi utile pour afficher les tablespaces
existants.
PostgreSQL utilise 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. Cette
opération ne doit jamais être réalisée alors que le serveur est en cours
d'exécution. Notez qu'avec les versions 9.1 et antérieures de PostgreSQL
9.1, vous aurez aussi besoin de mettre à jour le catalogue
pg_tablespace
avec les nouveaux emplacements. (Si
vous ne le faites pas, pg_dump
continuera à afficher
les anciens emplacements des tablespaces.)