đ§ Introduction
Mettre en place des sauvegardes, câest essentiel. Mais savoir les restaurer efficacement en cas de besoin, câest encore plus crucial. Câest ici que le PITR (Point In Time Recovery) entre en jeu, une fonctionnalitĂ© puissante offerte par PostgreSQL et parfaitement gĂ©rĂ©e par Barman.
Que ce soit pour corriger une erreur humaine, revenir avant un dĂ©ploiement ratĂ© ou analyser lâĂ©tat de la base Ă un instant prĂ©cis, Barman permet de ramener PostgreSQL dans le passĂ©, en rejouant uniquement les modifications jusquâĂ un point bien dĂ©fini.
Dans ce chapitre, nous allons explorer :
Ce quâest concrĂštement le PITR,
Les prĂ©requis pour quâil fonctionne,
Et surtout, comment lâutiliser pas Ă pas avec Barman, de maniĂšre fiable.
PrĂȘt Ă voyager dans le temps avec PostgreSQL ? Câest par ici đ
đ°ïž Câest quoi le PITR (Point-In-Time Recovery) ?
Le Point-In-Time Recovery, ou PITR, est une fonctionnalité puissante de PostgreSQL qui permet de restaurer une base de données à un instant précis dans le passé.
Câest un peu comme une machine Ă remonter le temps đłïžđ.
Imaginons quâun bug ou une erreur humaine ait corrompu des donnĂ©es ce matin Ă 10h30. GrĂące au PITR, vous pouvez restaurer la base exactement comme elle Ă©tait Ă 09h29, juste avant le problĂšme.
Pour que cela fonctionne, PostgreSQL enregistre toutes les Ă©criture sur la base de donnĂ©es dans des fichiers appelĂ©s WALs (Write Ahead Logs). Ces fichiers contiennent lâhistorique des modifications apportĂ©es Ă la base.
Barman exploite ces fichiers pour rejouer lâhistoire de la base jusquâĂ lâinstant choisi, Ă partir dâune sauvegarde complĂšte. Il effectue ainsi un rĂ©tropĂ©dalage jusquâĂ un instant dĂ©sirĂ© bien pris en compte par les sauvegardes existantes
đŻ RPO et RTO : Les deux piliers dâune bonne stratĂ©gie de sauvegarde/restauration
Quand on parle de continuitĂ© dâactivitĂ© et de plan de reprise aprĂšs sinistre (disaster recovery), deux notions sont essentielles Ă comprendre avant mĂȘme de parler de sauvegarde ou dâoutil comme Barman :
đ Recovery Point Objective (RPO)
Le RPO, ou objectif de point de reprise, reprĂ©sente la quantitĂ© maximale de donnĂ©es que l'on peut se permettre de perdre en cas dâincident.
đ Exemple :
Si vous acceptez de perdre au maximum 5 minutes de données, votre RPO est de 5 minutes. Cela implique que vos sauvegardes (ou la capture de vos WAL) doivent se faire au moins toutes les 5 minutes.
â± Recovery Time Objective (RTO)
Le RTO, ou objectif de temps de reprise, dĂ©signe la durĂ©e maximale acceptable dâindisponibilitĂ© du service aprĂšs un incident.
đ Exemple :
Si vous estimez quâune interruption de service de 30 minutes est tolĂ©rable, alors votre RTO est de 30 minutes. Cela implique que vos outils et mĂ©canisme de restauration (comme Barman et les automatisations que vous mettrez en place) doivent ĂȘtre capables de restorer et remettre le service en ligne dans ce dĂ©lai.
âïž Trouver le bon Ă©quilibre entre idĂ©al et rĂ©alitĂ©
On aimerait tous avoir un RPO = 0 (aucune perte de donnĂ©es) et un RTO = 0 (aucun temps dâarrĂȘt).
Mais dans la vraie vie, il faut souvent faire un compromis entre le coût et la criticité du service.
Par exemple :
Pour un site vitrine, un RPO/RTO de plusieurs heures peut ĂȘtre tolĂ©rĂ©.
Pour une application bancaire, chaque seconde compte : le RPO/RTO doit ĂȘtre quasi nul.
đĄ RPO et RTO avec PostgreSQL et Barman
Bonne nouvelle : avec un stack open source bien configurĂ©, il est possible de sâapprocher de trĂšs bonnes performances :
RPO = 0 đŻ
GrĂące Ă la rĂ©plication en streaming synchrone de PostgreSQL, vos donnĂ©es peuvent ĂȘtre protĂ©gĂ©es sans perte.RTO minimal â±
En combinant Barman pour les sauvegardes et repmgr pour la haute disponibilité, on peut atteindre un redémarrage quasi instantané en cas de problÚme.
𧰠Prérequis pour une restauration avec PITR
Avant de tenter une restauration point-in-time, quelques Ă©lĂ©ments doivent ĂȘtre en place pour que tout se passe bien :
1. Sauvegarde valide disponible
Vous devez avoir au moins une sauvegarde complÚte dans Barman. Elle servira de point de départ pour la restauration.
2. Archivage WAL activé
Le PITR repose sur la capacitĂ© Ă rejouer les WAL (Write Ahead Logs) jusquâĂ un instant prĂ©cis. Assurez-vous que lâarchivage fonctionne correctement et que les fichiers sont bien prĂ©sents dans le rĂ©pertoire wals
de Barman.
3. Espace disque suffisant
La restauration va crĂ©er une nouvelle copie de la base. Il est essentiel dâavoir suffisamment dâespace libre sur le serveur cible.
4. Horodatage ou XID de restauration
Pour déclencher un PITR, vous devez spécifier le point de restauration, soit :
* une date/heure ('2025-04-11 16:00:00'
),
* un identifiant de transaction (XID),
* ou simplement la fin de la sauvegarde (si vous ne rejouez pas les WAL).
5. Environnement de test (optionnel mais recommandé)
Avant de lancer une restauration en production, il est fortement conseillé de tester la restauration dans un environnement isolé.
đ RĂ©cupĂ©ration des donnĂ©es avec Barman (cas pratique)
Nous allons créer une table au niveau de notre base de données test
et faire plusieurs manipulations afin dâĂ©prouver notre systĂšme de sauvegarde.On va donc ajouter une table Ă notre base de donnĂ©es et y ajouter quelques lignes(tu peux te servir de ce scriptđ):
--- creation d'une table articles
CREATE TABLE articles (
id SERIAL PRIMARY KEY,
title TEXT,
content TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
--- insertion de 20 lignes dans la table articles
INSERT INTO articles (title, content)
SELECT
'Titre de lâarticle ' || i,
'Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.'
FROM generate_series(1, 20) AS s(i);
A cette Ă©tape on va refaire une sauvegarde incrĂ©mentale de notre base donnĂ©e avant de simuler un incident, une suppression involontaire de donnĂ©es par exemple toujours Ă lâaide de la commande barman backup pg
(ici pg est le nom de notre serveur de base de données dans notre configuration barman), voici le retour à mon niveau:
# sur le serveur barman
$ barman backup pg
Starting backup using rsync-concurrent method for server pg in /var/lib/barman/pg/base/20250415T201516
Backup start at LSN: 0/14000028 (000000010000000000000014, 00000028)
Starting backup copy via rsync/SSH for 20250415T201516
Copy done (time: 2 seconds)
Asking PostgreSQL server to finalize the backup.
Backup size: 38.9 MiB. Actual size on disk: 4.8 MiB (-87.55% deduplication ratio).
Backup end at LSN: 0/14000100 (000000010000000000000014, 00000100)
Backup completed (start time: 2025-04-15 20:15:16.336556, elapsed time: 4 seconds)
Processing xlog segments from file archival for pg
000000010000000000000013
000000010000000000000014
000000010000000000000014.00000028.backup
Note bien la date de fin de sauvegarde (start time+ temps ecoulé
ou accesible avec barman show-backup pg id_backup
). Elle te servira de référence pour définir ton --target-time
lors de la restauration.A présent simulons la perte de données:
--- suppression des articles d'id pairs
DELETE FROM articles WHERE id % 2 = 0;
--- vérifier que les éléments ont bien été supprimés
SELECT COUNT(id) FROM article;
/*
--------------------------------------------
OUTPUT
--------------------------------------------
*/
count
-------
10
(1 row)
đ„ Tous les articles avec un identifiant pair etant dĂ©sormais supprimĂ©s (cet incident intervient peu de temps aprĂšs ma derniĂšre sauvegarde). Câest le moment idĂ©al pour utiliser la rĂ©cupĂ©ration incrĂ©mentale et revenir Ă lâĂ©tat initial. Avant de restorer nos donnĂ©es nous allons refaire une nouvelle sauvegarde et arreter notre serveur postgresql:
# sur le serveur barman
$ barman backup pg
Starting backup using rsync-concurrent method for server pg in /var/lib/barman/pg/base/20250415T201754
Backup start at LSN: 0/17000028 (000000010000000000000017, 00000028)
Starting backup copy via rsync/SSH for 20250415T201754
Copy done (time: 2 seconds)
Asking PostgreSQL server to finalize the backup.
Backup size: 38.9 MiB. Actual size on disk: 129.7 KiB (-99.67% deduplication ratio).
Backup end at LSN: 0/17000100 (000000010000000000000017, 00000100)
Backup completed (start time: 2025-04-15 20:17:55.167843, elapsed time: 4 seconds)
Processing xlog segments from file archival for pg
000000010000000000000016
000000010000000000000017
000000010000000000000017.00000028.backup
$ barman list-backup pg
pg 20250415T201754 - Tue Apr 15 20:17:58 2025 - Size: 54.9 MiB - WAL Size: 0 B
pg 20250415T201516 - Tue Apr 15 20:15:19 2025 - Size: 54.9 MiB - WAL Size: 48.0 MiB
pg 20250413T113210 - Sun Apr 13 11:32:14 2025 - Size: 54.8 MiB - WAL Size: 32.0 MiB
# sur le serveur postgres
$ sudo service postgresql stop
A cette Ă©tape deux sauvegardes encadren notre incident, celles dâids 20250415T201516
et 20250415T201754
. La premiĂšre est celle avec dâavant incident qui nous servira donc pour notre PITR.
La commande de restoration Ă taper sur le serveur barman est la suivante:
$ barman recover --remote-ssh-command "ssh postgres@192.168.58.11" --target-time="2025-04-15 20:17:58.270833+00:00" pg 20250415T201754 /var/lib/postgresql/12/main
Starting remote restore for server pg using backup 20250415T201754
Destination directory: /var/lib/postgresql/12/main
Remote command: ssh postgres@192.168.58.11
Doing PITR. Recovery target time: '2025-04-15 20:17:58.270833+00:00'
Using safe horizon time for smart rsync copy: 2025-04-15 20:17:54.690087+00:00
Copying the base backup.
Copying required WAL segments.
Generating recovery configuration
Identify dangerous settings in destination directory.
IMPORTANT
These settings have been modified to prevent data losses
postgresql.conf line 755: archive_command = false
WARNING
You are required to review the following options as potentially dangerous
postgresql.conf line 41: data_directory = '/var/lib/postgresql/12/main' # use data in another directory
postgresql.conf line 43: hba_file = '/etc/postgresql/12/main/pg_hba.conf' # host-based authentication file
postgresql.conf line 45: ident_file = '/etc/postgresql/12/main/pg_ident.conf' # ident configuration file
postgresql.conf line 49: external_pid_file = '/var/run/postgresql/12-main.pid' # write an extra PID file
postgresql.conf line 66: unix_socket_directories = '/var/run/postgresql' # comma-separated list of directories
postgresql.conf line 102: ssl_cert_file = '/etc/ssl/certs/ssl-cert-snakeoil.pem'
postgresql.conf line 104: ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'
postgresql.conf line 740: include_dir = 'conf.d' # include files ending in '.conf' from
Recovery completed (start time: 2025-04-16 15:14:41.903013, elapsed time: 8 seconds)
Your PostgreSQL server has been successfully prepared for recovery!
Les options de cette commande sont: --remote-ssh-command
une commande ssh vers le serveur postgres, --target-time
la date à laquelle restorée les données qui doit etre xxxxxxxxxxxxxx, server_name
pour le nom du serveur, backup_id
le nom du backup et destination_directory
pour le dossier qui doit accepter les sauvegardes. Tu pourrais avoir plus dâoptions avec barman recover -h
.
La recupĂ©ration peut se faire dans nâimporte quel dossier Ă part celui de base de postgres Ă condition de reconfiguer postgres pour pointer sur le dossier considĂ©rĂ©. On peut aprĂšs avoir Ă nouveau accĂšs Ă nos donnĂ©es rĂ©cupĂ©rĂ©es:
--- vérifier que les éléments ont bien été supprimés
SELECT COUNT(id) FROM article;
/*
--------------------------------------------
OUTPUT
--------------------------------------------
*/
count
-------
20
(1 row)
đ Conclusion
Les erreurs humaines, les corruptions logicielles ou les incidents matériels ne sont pas une question de "si", mais de "quand". Dans ce contexte, la capacité à revenir à un état antérieur précis de ta base PostgreSQL est essentielle.
Avec Barman et la fonctionnalitĂ© de Point-In-Time Recovery (PITR), tu disposes dâun outil fiable, robuste et puissant pour rĂ©pondre aux impĂ©ratifs de continuitĂ© dâactivitĂ©. En combinant les sauvegardes complĂštes aux fichiers WAL archivĂ©s, tu peux restaurer ta base Ă la seconde prĂšs, juste avant un incident.
Plus encore, tu lâas vu : ce processus peut sâautomatiser, se tester, sâindustrialiser; autant dâatouts pour renforcer la rĂ©silience de ton architecture PostgreSQL.
Top comments (0)