← Tous les guides

Guide · Sauvegardes

Surveiller pg_dump (sauvegarde PostgreSQL)

Un job cron qui s'arrête silencieusement ressemble exactement à un job cron qui tourne toujours, jusqu'au jour où il faut restaurer. Enveloppez pg_dump dans un seul curl et Mortemain vous alerte dès qu'une sauvegarde nocturne manque ou échoue.

1. Créez un check

Créez un check dans Mortemain correspondant au planning de votre dump (par exemple tous les jours à 02h00) et une fenêtre de grâce couvrant la durée habituelle du dump plus une marge. Copiez son URL de ping :

 votre URL de ping
https://ping.mortemain.com/votre-uuid-de-check

2. Enveloppez pg_dump dans un script

Ne faites pas le check-in directement depuis cron, enveloppez pg_dump dans un petit script pour contrôler précisément quand le succès et l'échec sont signalés. Échouez sur tout code de sortie non nul du pipeline, et ne faites le check-in qu'en cas de succès :

 pg-dump-backup.sh
#!/usr/bin/env bash
set -euo pipefail
URL=https://ping.mortemain.com/votre-uuid-de-check
OUT=/backups/mabase-$(date +%F).sql.gz

pg_dump -Fc -Z6 -h localhost -U postgres mabase | gzip > "$OUT"

# dire à Mortemain que le dump s'est bien terminé
curl -fsS -m 10 --retry 3 "$URL"

Pointez cron vers le script, pas directement vers pg_dump :

 crontab
# dump quotidien à 02h00
0 2 * * *  /usr/local/bin/pg-dump-backup.sh

3. Alertez immédiatement en cas d'échec

Un dump peut échouer bruyamment (disque plein, connexion refusée, mauvais identifiants) bien avant l'expiration de la fenêtre de grâce. Ajoutez un trap pour qu'une erreur pingue /fail et mette le check en panne tout de suite, plutôt que d'attendre des heures pour le découvrir :

 pg-dump-backup.sh
#!/usr/bin/env bash
set -euo pipefail
URL=https://ping.mortemain.com/votre-uuid-de-check
OUT=/backups/mabase-$(date +%F).sql.gz

# en cas d'erreur ci-dessous, dire à Mortemain que le dump a échoué
trap 'curl -fsS -m 10 "$URL/fail"' ERR

pg_dump -Fc -Z6 -h localhost -U postgres mabase | gzip > "$OUT"
curl -fsS -m 10 "$URL"          # succès

set -euo pipefail compte ici : sans ça, un pg_dump qui échoue et est enchaîné dans gzip peut quand même sortir avec un code 0, et le trap ne se déclenche jamais.

4. Mesurez la durée du dump (optionnel)

Pinguez /start juste avant que pg_dump démarre, et Mortemain suit la durée de chaque exécution. Une base qui a discrètement grossi jusqu'à ce que le dump prenne 5× plus longtemps qu'avant apparaît comme un avertissement, pas comme une surprise à 3h du matin lors d'une restauration :

 pg-dump-backup.sh
curl -fsS -m 10 "$URL/start"
pg_dump -Fc -Z6 -h localhost -U postgres mabase | gzip > "$OUT"
curl -fsS -m 10 "$URL"

Vous préférez tout regrouper ? Un script de maintenance psql qui appelle plusieurs bases peut suivre la même logique, voir le guide général shell & cron pour le chaînage, les tentatives et les lignes uniques.

Testez

Lancez le script une fois à la main. Le check devrait passer actif en une seconde ou deux, et sa durée devrait refléter un temps de dump réaliste. Cassez-le ensuite volontairement (mauvais identifiants, hôte injoignable) et vérifiez que l'alerte /fail arrive immédiatement, avant de restaurer discrètement les bons identifiants. C'est tout le filet de sécurité : une sauvegarde qui s'arrête ou se met à échouer ne peut plus se cacher.