Sauvegarde PostgreSQL
Août 2023
Évidemment qu’on fait des sauvegardes ! Le Raid1 c’est cool, mais ce n’est pour autant pas une sauvegarde, c’est un bon moyen d’assurer une redondance matérielle, si un disque foire, l’autre est là. Mais on fait comment pour récupérer un état stable des données de la veille si un incident intervient par exemple ? Bah on restaure une sauvegarde bien sûr. Encore mieux si celle-ci est régulière et stockée sur un autre disque ! C’est ce qu’on fait chez g33ks.coffee.
Pré-requis
Pour comprendre cet article tu dois déjà :
- Savoir ce qu’est un script sous Linux
- Avoir une base de données PostgreSQL
- Comprendre le fonctionnement de Crontab
Script
Il en existe des outils pour faire de la sauvegarde automatique, distribuée, dans le cloud & co… mais ici on est #smallWeb, fait maison, à la mano et avec des solutions simples et à taille humaine. Ainsi en plus des 2 disques de 1 To montés en Raid1, on a un disque dédié de 4 To uniquement pour les sauvegardes. Et bien sûr on automatise la tâche et pour se faire rien de mieux que son propre petit script bash comme celui que j’ai écrit :
#Script de sauvegarde de la base PostgreSQL
#
#L'idée étant de garder un historique de 6 jours.
#Le script est lancé quotidiennement à 3h du matin via une tâche cron.
#toBeDeleted prend la valeur de la date il y a 6 jours dans le format ddmmyy
#today prend la valeur de la date du jour dans le format ddmmyy
toBeDeleted=$(date -d "$date -6 days" +"%d%m%y")
today=$(date '+%d%m%y')
#suppression de la sauvegarde d'il y a 6 jours
rm -rf /backup/daily_db_backup/$toBeDeleted
#création du répertoire pour la sauvegarde du jour
mkdir /backup/daily_db_backup/$today
#lancement de la sauvegarde du jour
pg_basebackup -D /backup/daily_db_backup/$today -Ft -z
J’utilise pg_basebackup sur les bons conseils de @kedare puisque cette commande permet de faire une sauvegarde « physique » de la base. Non seulement son contenu, mais aussi toute la structure et sa configuration. En cas de besoin on pourra donc reconstruire entièrement la base de données.
Cron
Une fois le script créé, placé dans le dossier $HOME de mon user « postgres », et autorisé à être exécuté (chmod +x obpdb.sh) , je vais ajouté un ligne dans crontab de façon à ce que le script soit lancé automatiquement tous les matins à 3h :
crontab -e
Les 2 dernières lignes ressemblent alors à :
# m h dom mon dow command
0 3 * * * ~/obpdb.sh
Vérification
Bien sûr on vérifie au préalable que le script fonctionne bien et de temps en temps je liste le contenu de mon dossier de sauvegarde pour voir s’il a la tête voulue comme ici, on voit que tout fonctionne bien :
postgres@g33ks:~$ ls -l /backup/daily_db_backup/
total 24
drwxrwxr-x 2 postgres postgres 4096 Jul 25 03:02 250723
drwxrwxr-x 2 postgres postgres 4096 Jul 26 03:02 260723
drwxrwxr-x 2 postgres postgres 4096 Jul 27 03:02 270723
drwxrwxr-x 2 postgres postgres 4096 Jul 28 03:02 280723
drwxrwxr-x 2 postgres postgres 4096 Jul 29 03:03 290723
drwxrwxr-x 2 postgres postgres 4096 Jul 30 03:02 300723
postgres@g33ks:~$
Et pourvu qu’on en ait jamais besoin surtout :p