Déplacement d'une base de données PostgreSQL

Nous allons aujourd’hui nous préoccuper du déplacement des éléphants dans nos infrastructures !
Non, à l’heure où j’écris cet article, je suis totalement sobre !
Laissez-moi vous planter le décor ! Comme tout le monde le sait, PostgreSQL a choisi un éléphant nommé Slonik… Et bien aujourd’hui, nous allons justement déplacer Slonik.
J’ai récemment été confronté, avec un collègue, à un système qui ne respecte plus la norme que nous nous sommes fixée.
De ce fait, nous avons décidé de remettre au carré cette machine pour nous simplifier la vie.

Comment était installée notre VM ?

Tout simplement en utilisant le RPM fourni par RedHat. Logique mais pas forcément conforme à nos souhaits. Ainsi, les données et les WAL étaient stockés dans /var/lib/pgsql/9.4.

Notre souhait ?

Avoir une belle machine où les données sont dans /postgres/data et les WAL dans /postgres/wal !
Commençons les manipulations par un arrêt de l’applicatif (que je ne détaillerai pas) et de notre instance en utilisant la commande suivante :

[postgres@prod] $ pg_ctl stop –m fast

Afin de sécuriser la manipulation, nous avons décidé d’uniquement copier les données afin de pouvoir faire un retour arrière efficient en cas de soucis. Nous avons donc simplement renommé nos dossiers :

[postgres@prod] $ mv /var/lib/pgsql/9.4/data /var/lib/pgsql/9.4/data_old
[postgres@prod] $ mv /var/lib/pgsql/9.4/wal /var/lib/pgsql/9.4/wal_old
[postgres@prod] $ mv /var/lib/pgsql/9.4/backups /var/lib/pgsql/9.4/backups_old

Créons les dossiers qui hébergerons nos nouvelles données :

[root@prod] # mkdir -p /postgres/data /postgres/wal /postgres/backups
[root@prod] # chown -R /postgres/*

Voilà, tout est prêt, nous n’avons plus qu’à déplacer nos données !

[postgres@prod] $ cp -R /var/lib/pgsql/9.4/data_old/* /postgres/data/
[postgres@prod] $ cp -R /var/lib/pgsql/9.4/wal_old/* /postgres/wal/
[postgres@prod] $ cp -R /var/lib/pgsql/9.4/backups_old/* /postgres/backups/

Pensez à modifier vos variables d’environnement !
Dans notre cas, nous avons des déclarations pour les variables PGDATA et PGBACKUPS dans le fichier .bash_profile de l’utilisateur postgres.
De même, pensez à vos crontab pour les scripts de backup ou de vacuum par exemple 😉
Redémarrons maintenant notre instance !
Là encore, assurez-vous d’avoir rechargé vos variables d’environnement :

[postgres@prod] $ . ~/.bash_profile
[postgres@prod] $ pg_ctl start

Testons que tout est bien là :

[postgres@prod] $ psql -d checkdb –U checkuser –w
psql> select count(*) from checktable ;
Count
---------
12002546
(1 row)

Et voilà ! vous n’avez plus qu’à redémarrer vos applicatifs !
Comme moi, pensez à sauver vos vieux éléphants 🙂