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.