Introduction
pg_dump est tres bien pour des petites bases. Pour de la prod serieuse, il faut pgBackRest :
- Backups full, differential, incremental
- PITR : restaurer a un instant precis (timestamp ou LSN)
- Parallelisation (plusieurs CPU pour backup et restore)
- Compression LZ4 / Zstd / Gzip
- Encryption AES-256 native
- Stockage : local, S3, Azure, GCS
- Verification d'integrite (checksum)
- Backup depuis replica (sans charger le primary)
Prerequis
- PostgreSQL 12+
- VPS Linux Debian / Ubuntu
- Acces root
- Espace de stockage (local ou S3)
Etape 1 : Installation
sudo apt update
sudo apt install -y pgbackrest
pgbackrest version
Etape 2 : Preparer le stash de backup local
sudo mkdir -p /var/lib/pgbackrest
sudo chown postgres:postgres /var/lib/pgbackrest
sudo chmod 750 /var/lib/pgbackrest
Etape 3 : Configuration pgBackRest
sudo nano /etc/pgbackrest/pgbackrest.conf
[global]
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2
repo1-retention-diff=4
process-max=2
compress-type=zst
compress-level=3
log-level-console=info
log-level-file=detail
log-path=/var/log/pgbackrest
[main]
pg1-path=/var/lib/postgresql/16/main
pg1-port=5432
pg1-user=postgres
Creez le dossier de logs :
sudo mkdir -p /var/log/pgbackrest
sudo chown postgres:postgres /var/log/pgbackrest
Etape 4 : Configurer PostgreSQL pour archive_command
/etc/postgresql/16/main/postgresql.conf :
archive_mode = on
archive_command = 'pgbackrest --stanza=main archive-push %p'
archive_timeout = 60
max_wal_senders = 3
wal_level = replica
Restart :
sudo systemctl restart postgresql
Etape 5 : Initialiser le stanza
sudo -u postgres pgbackrest --stanza=main --log-level-console=info stanza-create
Verifiez :
sudo -u postgres pgbackrest --stanza=main check
Etape 6 : Premier backup full
sudo -u postgres pgbackrest --stanza=main --type=full --log-level-console=info backup
Le premier backup peut prendre du temps (lit toute la base). Les suivants sont incrementaux.
Sortie typique :
P00 INFO: backup command begin 2.49: --log-level-console=info --pg1-path=/var/lib/postgresql/16/main --pg1-port=5432 --repo1-path=/var/lib/pgbackrest --stanza=main --type=full
P00 INFO: execute non-exclusive backup start: backup begins after the next regular checkpoint completes
P00 INFO: backup start archive = 000000010000000000000004, lsn = 0/4000028
P01 INFO: backup file ...
P00 INFO: full backup size = 22MB
Etape 7 : Lister les backups
sudo -u postgres pgbackrest --stanza=main info
stanza: main
status: ok
cipher: none
db (current)
wal archive min/max (16): 000000010000000000000004/000000010000000000000010
full backup: 20260517-143000F
timestamp start/stop: 2026-05-17 14:30:00 / 2026-05-17 14:30:30
wal start/stop: 000000010000000000000004 / 000000010000000000000005
database size: 22MB, database backup size: 22MB
repo1: backup set size: 5MB, backup size: 5MB
Etape 8 : Backup differential et incremental
# Differential : depuis dernier full
sudo -u postgres pgbackrest --stanza=main --type=diff backup
# Incremental : depuis dernier backup (full ou diff)
sudo -u postgres pgbackrest --stanza=main --type=incr backup
Une bonne strategie :
- 1 backup full par semaine (dimanche)
- 1 diff par jour
- 1 incr par heure
Etape 9 : Automatiser avec cron
sudo crontab -u postgres -e
# Full le dimanche a 1h
0 1 * * 0 pgbackrest --stanza=main --type=full backup
# Diff les autres jours a 1h
0 1 * * 1-6 pgbackrest --stanza=main --type=diff backup
# Incremental toutes les heures
0 * * * * pgbackrest --stanza=main --type=incr backup
Etape 10 : Restore complet
⚠️ A faire sur un serveur de test ou apres confirmation.
Stop PG :
sudo systemctl stop postgresql
Vider le datadir :
sudo -u postgres rm -rf /var/lib/postgresql/16/main/*
Restore :
sudo -u postgres pgbackrest --stanza=main --log-level-console=info restore
Restart :
sudo systemctl start postgresql
PG rejoue les WAL et rouvre la base.
Etape 11 : Point-In-Time Recovery (PITR)
Vous voulez restaurer a un timestamp precis (avant qu'un DROP TABLE accidentel ait eu lieu) :
sudo systemctl stop postgresql
sudo -u postgres rm -rf /var/lib/postgresql/16/main/*
sudo -u postgres pgbackrest --stanza=main \
--type=time \
--target="2026-05-17 14:45:00" \
--target-action=promote \
restore
sudo systemctl start postgresql
PG rejoue les WAL jusqu'au timestamp puis stoppe la replication WAL. Verifiez :
SELECT now() - pg_last_xact_replay_timestamp();
Etape 12 : Stockage distant S3
Pour repo S3 (AWS, Wasabi, Backblaze B2, MinIO) :
/etc/pgbackrest/pgbackrest.conf :
[global]
repo1-type=s3
repo1-s3-bucket=mon-bucket-backups
repo1-s3-endpoint=s3.eu-west-3.amazonaws.com
repo1-s3-region=eu-west-3
repo1-s3-key=AKIA...
repo1-s3-key-secret=secret...
repo1-path=/pgbackrest
repo1-cipher-type=aes-256-cbc
repo1-cipher-pass=passphrase-tres-longue
[main]
pg1-path=/var/lib/postgresql/16/main
Re-initialisez le stanza :
sudo -u postgres pgbackrest --stanza=main stanza-create
sudo -u postgres pgbackrest --stanza=main backup
Vos backups partent direct sur S3, chiffres avec AES-256.
Depannage
"archive command failed"
sudo -u postgres pgbackrest --stanza=main check
Verifiez que archive_command est correct, que /var/log/pgbackrest existe et est ecrivable.
"WAL segment missing"
Le WAL n'a pas pu etre archive. Verifiez l'espace disque et les logs pgbackrest :
sudo tail -f /var/log/pgbackrest/main-archive-push.log
Backup tres lent
Augmentez process-max (parallelisme). Si vous etes I/O bound, ajoutez du compression hardware acceleration ou utilisez NVMe.
Restore echoue avec "pg_control file is corrupt"
Le datadir n'a pas ete bien vide. Reverifiez rm -rf et permissions.
S3 access denied
Verifiez les permissions IAM (s3:GetObject, s3:PutObject, s3:ListBucket, s3:DeleteObject).
Commandes utiles
# Info sur tous les backups
sudo -u postgres pgbackrest --stanza=main info
# Backup full / diff / incr
sudo -u postgres pgbackrest --stanza=main --type=full backup
sudo -u postgres pgbackrest --stanza=main --type=diff backup
sudo -u postgres pgbackrest --stanza=main --type=incr backup
# Verifier l'integrite
sudo -u postgres pgbackrest --stanza=main check
sudo -u postgres pgbackrest --stanza=main verify
# Restore
sudo -u postgres pgbackrest --stanza=main restore
sudo -u postgres pgbackrest --stanza=main --type=time --target="2026-05-17 14:00:00" restore
# Supprimer manuellement un backup
sudo -u postgres pgbackrest --stanza=main --set=20260517-143000F expire
# Logs
sudo tail -f /var/log/pgbackrest/main-backup.log
sudo tail -f /var/log/pgbackrest/main-archive-push.log
Conclusion
pgBackRest est essentiel pour la production :
- Backups efficaces (compression, parallelisme)
- PITR fiable
- Verification d'integrite automatique
- Stockage distant chiffre
Pour aller plus loin :
- Combinez avec streaming replication pour la HA
- Faites des restores reguliers sur un serveur de test pour valider
- Surveillez l'execution avec Prometheus + node_exporter + textfile collector
Ressources
- Documentation officielle : https://pgbackrest.org/user-guide.html
- Github : https://github.com/pgbackrest/pgbackrest
- Configurations exemples : https://pgbackrest.org/configuration.html
- Comparaison outils backup PG : https://pgbackrest.org/



















