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.)