Comment déplacer un espace de table PostgreSQL?

12

Existe-t-il un moyen de déplacer physiquement un espace de table PostgreSQL 9.3 de /old/dirvers /new/dir? Je voudrais juste mvle répertoire et dire à PostgreSQL que l'espace disque logique est maintenant situé à /new/dir. On dirait ALTER TABLESPACEque vous ne pouvez que renommer.

Je voudrais éviter de créer un nouvel espace de table et d'y déplacer la base de données. Je suppose que ce serait un processus de copie lent qui nécessite beaucoup de temps et d'espace disque. Je veux également éviter les liens symboliques /old/diravec /new/dir.

kontextify
la source
déplacer / old / dir vers veryold / dir, monter new / dir dans old / dir, copier les données de ver_old dir dans old / dir?
simplexio

Réponses:

12

Je suppose que votre nom d'espace de table est tblspc.

  1. Obtenez Oid de votre espace de table
test = # SELECT oid, spcname FROM pg_tablespace WHERE spcname = 'tblspc';
  oid | spcname
------- + ---------
 24580 | tblspc
(1 rangée)
  1. Arrêtez les postgres
$ pg_ctl -D $ PGDATA stop
  1. Déplacer le répertoire de l'ancien vers le nouveau
$ mv / ancien / dir / nouveau / dir

ou

$ cp -r / old / dir / new / dir
$ rm -rf / old / dir
  1. Changer le lien du tablespace vers un nouveau répertoire
$ cd $ PGDATA / pg_tblspc
$ RM 24580
$ ln -s / new / dir 24580
  1. Démarrer les postgres
$ pg_ctl -D $ PGDATA start

Ensuite, vous pouvez voir que le répertoire du tablespace a changé.

test = # SELECT pg_tablespace_location (24580);
 pg_tablespace_location
------------------------
 / nouveau / dir
(1 rangée)
shx
la source