Quand on a peur de se louper avant de manipuler violemment une base de données, il est utile de la sauvegarder. Avec postgresql, les commandes les plus couramment utilisées sont pg_dump et pg_restore.
L’inconvénient est que cette manipulation est chiante et très longue avec une base de taille conséquente.
Il est alors préférable de préférer utiliser la réplication qui s’opère en deux lignes avec l’avantage énorme d’être ultra rapide.
Pour répliquer une base de données postgresql, il faut d’abord tuer les connexions existantes sur la base que l’on souhaite dupliquer. Pour cela, il est indispensable de connaître le mot de passe du user
postgres. Pas de panique, si vous l’avez oublié, il vous est possible de
récupérer ce mot de passe super-utilisateur postgres très facilement en suivant ce tuto.
C’est fait ? Alors on continue.
Tuer les connexions Postgresql en cours
Première étape : Se connecter à postgresql en ligne de commande avec psql
user@pc:~$ psql -h localhost -U postgres
psql (9.5.10, server 9.3.15)
Type "help" for help.
postgres=#
Deuxième étape : tuer les connexions en cours sur la base que l’on veut répliquer
La base à traiter s’appelle
restits
postgres=# select pg_terminate_backend(pid) from pg_stat_activity where pid <> pg_backend_pid() and datname = 'restits';
pg_terminate_backend
----------------------
t
(1 row)
C’est fait ! On a tué notre utilisateur (
1 row). Passons à la suite.
Répliquer une base postgresql
A partir d’ici, c’est du velours vu que ça se joue en une ligne (assurez vous préalablement d’avoir l’espace disque suffisant sur votre machine).
postgres=# create database shhh template restits;
CREATE DATABASE
postgres=#
Et voilà. Pour vous donner une idée de la chose, il a fallu 3mn10 secondes pour répliquer 24Go. Cette commande a créé la base
shhh à l’identique de
restits en utilisant comme template la base que l’on souhaitait dupliquer.
Cette opération est rendue possible parce que postgresql crée toujours une base à partir d’une template ; la template standard utilisée par CREATE DATABASE est template1 (
voir la doc).