PostgreSQL – Déplacer un tablespace ou un groupe de tablespaces


Il peut être nécessaire pour diverses raisons, de déplacer des tablespaces d’un répertoire vers un autre.

Un tablespace PostgreSQL est un répertoire.

PostgreSQL dans le cadre d’un upgrade de version, nécessite de connaître l’ancien répertoire de données et le nouveau répertoire de données. Cela implique donc que tous les tablespaces soient sous l’arborescence principale du serveur.

Dans le cas qui me préoccupe, j’avais créé mes tablespaces à l’extérieur du répertoire racine de mon serveur. Cette configuration n’est pas compatible avec la future migration que je prévois de mon serveur de la version 9.4 vers la version 9.5.

Méthode de déplacement des tablespaces

Etape 1 : Arrêter le serveur

systemctl stop pg94

Etape 2 : Déplacer les répertoires des tablespaces à la destination

cd /pgdata
mv pg94_tbs pg94

Etape 3 : Recréer les liens symboliques du répertoire pg_tblspc

[postgres@postgresql02 ~]$ cd /pgdata/pg94/pg_tblspc
[postgres@postgresql02 pg_tblspc]$ ls -l
total 0
lrwxrwxrwx 1 postgres postgres 28 Mar 8 17:14 16385 -> /pgdata/pg94_tbs/recensement
lrwxrwxrwx 1 postgres postgres 26 Mar 8 17:16 16386 -> /pgdata/pg94_tbs/annee1968
lrwxrwxrwx 1 postgres postgres 26 Mar 8 17:16 16387 -> /pgdata/pg94_tbs/annee1975
lrwxrwxrwx 1 postgres postgres 26 Mar 8 17:17 16388 -> /pgdata/pg94_tbs/annee1982
lrwxrwxrwx 1 postgres postgres 26 Mar 8 17:17 16389 -> /pgdata/pg94_tbs/annee1990
lrwxrwxrwx 1 postgres postgres 26 Mar 8 17:17 16390 -> /pgdata/pg94_tbs/annee1999
lrwxrwxrwx 1 postgres postgres 26 Mar 8 17:17 16391 -> /pgdata/pg94_tbs/annee2009
[postgres@postgresql02 pg_tblspc]$ rm 16385
[postgres@postgresql02 pg_tblspc]$ ln -s /pgdata/pg94/pg94_tbs/recensement 16385
[postgres@postgresql02 pg_tblspc]$ rm 16386
[postgres@postgresql02 pg_tblspc]$ ln -s /pgdata/pg94/pg94_tbs/annee1968 16386
[postgres@postgresql02 pg_tblspc]$ rm 16387
[postgres@postgresql02 pg_tblspc]$ ln -s /pgdata/pg94/pg94_tbs/annee1975 16387
[postgres@postgresql02 pg_tblspc]$ rm 16388
[postgres@postgresql02 pg_tblspc]$ ln -s /pgdata/pg94/pg94_tbs/annee1982 16388
[postgres@postgresql02 pg_tblspc]$ rm 16389
[postgres@postgresql02 pg_tblspc]$ ln -s /pgdata/pg94/pg94_tbs/annee1990 16389
[postgres@postgresql02 pg_tblspc]$ rm 16390
[postgres@postgresql02 pg_tblspc]$ ln -s /pgdata/pg94/pg94_tbs/annee1999 16390
[postgres@postgresql02 pg_tblspc]$ rm 16391
[postgres@postgresql02 pg_tblspc]$ ln -s /pgdata/pg94/pg94_tbs/annee2009 16391
[postgres@postgresql02 pg_tblspc]$ ls -l
total 0
lrwxrwxrwx 1 postgres postgres 33 Mar 17 16:17 16385 -> /pgdata/pg94/pg94_tbs/recensement 
lrwxrwxrwx 1 postgres postgres 31 Mar 17 16:17 16386 -> /pgdata/pg94/pg94_tbs/annee1968 
lrwxrwxrwx 1 postgres postgres 31 Mar 17 16:17 16387 -> /pgdata/pg94/pg94_tbs/annee1975 
lrwxrwxrwx 1 postgres postgres 31 Mar 17 16:18 16388 -> /pgdata/pg94/pg94_tbs/annee1982 
lrwxrwxrwx 1 postgres postgres 31 Mar 17 16:18 16389 -> /pgdata/pg94/pg94_tbs/annee1990 
lrwxrwxrwx 1 postgres postgres 31 Mar 17 16:18 16390 -> /pgdata/pg94/pg94_tbs/annee1999 
lrwxrwxrwx 1 postgres postgres 31 Mar 17 16:18 16391 -> /pgdata/pg94/pg94_tbs/annee2009

Etape 4 : Démarrer le serveur

systemctl start pg94

Etape 5 : Vérifier (pour la forme) que le serveur reconnaît bien le nouvel emplacement de chaque tablespace

postgres=# \db
 List of tablespaces
 Name | Owner | Location 
-------------+-------------+-----------------------------------
 annee1968 | recensement | /pgdata/pg94/pg94_tbs/annee1968
 annee1975 | recensement | /pgdata/pg94/pg94_tbs/annee1975
 annee1982 | recensement | /pgdata/pg94/pg94_tbs/annee1982
 annee1990 | recensement | /pgdata/pg94/pg94_tbs/annee1990
 annee1999 | recensement | /pgdata/pg94/pg94_tbs/annee1999
 annee2009 | recensement | /pgdata/pg94/pg94_tbs/annee2009
 pg_default | postgres | 
 pg_global | postgres | 
 recensement | recensement | /pgdata/pg94/pg94_tbs/recensement
(9 rows)

 

Depuis la version 9.2, la vue catalogue pg_tablespace ne contient plus la colonne spclocation, afin de faciliter les déplacements de tablespaces. Avant cette version, il est nécessaire de mettre à jour la colonne spclocation pour que les tablespaces soient normalement reconnus. Sans cela, pg_dump ne sait pas reconnaître la nouvelle localisation des tablespaces déplacés.