pgBackRest : backups PostgreSQL professionnels

pgBackRest : backups PostgreSQL professionnels

pgBackRest est l'outil de reference pour les backups PostgreSQL serieux : full / differential / incremental, PITR (Point-In-Time Recovery), parallelisation, compression, encryption, repo distant (S3, Azure, GCS).

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

Join our Discord community server

For any questions, suggestions, or just to chat with the community, join us on Discord!

900+Members