Récupération à un instant donné
Restaurez vos données à n’importe quel instant avec WAL.
Récupération à un instant donné est une leçon SQL Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage SQL Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Academy comprend 4 leçons au total.
Qu’est-ce que la récupération à un instant donné ?
La récupération à un instant donné (PITR) vous permet de restaurer une base de données à n’importe quel instant précis du passé, et pas seulement à l’heure du dernier instantané de sauvegarde.
Cela est possible car PostgreSQL écrit continuellement chaque modification dans un flux appelé le journal à écriture anticipée (WAL). En rejouant les enregistrements WAL par-dessus une sauvegarde de base, vous pouvez revenir exactement à l’instant nécessaire.
Le journal à écriture anticipée (WAL)
Chaque instruction INSERT, UPDATE, DELETE et DDL est d’abord écrite dans le WAL avant de modifier les fichiers de données proprement dits. Cela garantit la durabilité même si le serveur tombe en panne au milieu de l’écriture.
Pour PITR, les segments WAL archivés sont les bandes de la machine à remonter le temps. La sauvegarde de base est le point de départ ; WAL comble tout ce qui s’est produit ensuite.
-- Check current WAL write location
SELECT pg_current_wal_lsn() AS current_lsn,
pg_walfile_name(pg_current_wal_lsn()) AS current_wal_file;Activer l’archivage de WAL
Avant que PITR soit possible, l’archivage de WAL doit être activé dans postgresql.conf. Les paramètres clés sont wal_level, archive_mode et archive_command.
La commande d’archivage copie chaque segment WAL terminé vers un emplacement sûr tel qu’un répertoire local, un montage NFS ou un compartiment de stockage en nuage.
-- View current WAL and archive settings
SELECT name, setting, unit
FROM pg_settings
WHERE name IN (
'wal_level',
'archive_mode',
'archive_command',
'archive_status'
)
ORDER BY name;Effectuer une sauvegarde de base
Une sauvegarde de base est une copie cohérente de l’intégralité du répertoire de données effectuée alors que le serveur fonctionne. PostgreSQL fournit l’utilitaire pg_basebackup et les fonctions SQL de bas niveau pour coordonner ce processus.
La sauvegarde, combinée aux segments WAL archivés enregistrés à partir de l’heure de début de la sauvegarde, constitue tout ce dont vous avez besoin pour la récupération à un instant donné.
-- Check the latest base backup information
SELECT backup_start,
backup_end,
pg_size_pretty(backup_total) AS total_size
FROM pg_stat_basebackup;Définir l’heure cible de récupération
Lorsqu’un sinistre survient, la première étape consiste à déterminer l’horodatage exact auquel vous souhaitez restaurer la base de données. Une approche courante consiste à trouver l’horodatage juste avant l’événement dommageable, par exemple un DELETE massif accidentel.
Les tables du journal des transactions ou les journaux de l’application contiennent souvent cet horodatage. WAL enregistre lui-même les horodatages de validation lorsque track_commit_timestamp est activé.
-- Find the commit timestamp of recent transactions (requires track_commit_timestamp=on)
SELECT xid,
pg_xact_commit_timestamp(xid::xid) AS committed_at
FROM pg_stat_activity
WHERE state = 'idle'
LIMIT 10;Les paramètres de recovery.conf / de récupération
Le comportement de la récupération est contrôlé par des paramètres placés dans postgresql.conf (PostgreSQL 12+) ou dans l’ancien fichier recovery.conf. Les plus importants sont :
restore_command— comment récupérer les segments WAL archivésrecovery_target_time— l’horodatage exact auquel s’arrêterrecovery_target_action— quoi faire lorsque la cible est atteinte (promote,pause,shutdown)
-- Inspect recovery settings that are currently active
SELECT name, setting
FROM pg_settings
WHERE name IN (
'restore_command',
'recovery_target_time',
'recovery_target_action',
'recovery_target_inclusive'
)
ORDER BY name;Autres types de cibles de récupération
Le temps n'est pas le seul moyen de définir une cible de récupération. PostgreSQL prend en charge quatre types de cibles :
recovery_target_time— une chaîne d'horodatagerecovery_target_xid— un ID de transaction précisrecovery_target_lsn— un numéro de séquence de journal WALrecovery_target_name— un point de restauration nommé créé avecpg_create_restore_point()
-- Create a named restore point before a risky migration
SELECT pg_create_restore_point('before_migration_2024_07_01') AS restore_lsn;Simuler le sinistre
Pour vous exercer à la récupération à un instant donné dans un environnement de test, corrompez ou supprimez volontairement des données après avoir noté l'heure actuelle. Vous pourrez ainsi vérifier que la récupération aboutit au bon instant et que les lignes supprimées réapparaissent.
-- Record the 'safe' timestamp, then simulate an accident
SELECT now() AS safe_point;
-- (In a test DB only!) accidentally delete important rows
DELETE FROM orders WHERE created_at < '2024-01-01';
-- Confirm the damage
SELECT COUNT(*) AS remaining_orders FROM orders;Effectuer la récupération
La récupération comporte trois étapes :
- Arrêtez l'instance PostgreSQL en cours d'exécution.
- Restaurez la sauvegarde de base dans le répertoire de données.
- Configurez les paramètres de récupération et démarrez PostgreSQL en mode récupération — il rejoue WAL jusqu'à atteindre l'instant cible, puis est promu en serveur normal en lecture-écriture.
Les journaux du serveur indiquent chaque fichier WAL appliqué, ce qui permet de suivre facilement la progression.
-- After recovery completes, confirm the cluster is no longer in recovery
SELECT pg_is_in_recovery() AS in_recovery,
pg_last_xact_replay_timestamp() AS last_replayed_txn;Vérifier la récupération
Une fois le serveur promu, vérifiez que les données se trouvent dans l'état attendu. Contrôlez le nombre de lignes, les horodatages des lignes les plus récentes et toute valeur essentielle à l'activité.
Il est judicieux d'exécuter ces requêtes de vérification avant de réautoriser le trafic applicatif, afin de pouvoir poursuivre la récupération jusqu'à un point ultérieur ou ajuster l'instant cible si nécessaire.
-- Verify row counts and the latest transaction timestamp after recovery
SELECT 'orders' AS tbl, COUNT(*) AS rows FROM orders
UNION ALL
SELECT 'order_items' AS tbl, COUNT(*) AS rows FROM order_items
UNION ALL
SELECT 'customers' AS tbl, COUNT(*) AS rows FROM customers
ORDER BY tbl;Bonnes pratiques de PITR
Une configuration PITR fiable nécessite davantage que la simple activation de l'archivage. Les pratiques essentielles comprennent :
- Testez régulièrement les restaurations — une sauvegarde qui n'a pas été testée n'est pas une sauvegarde.
- Surveillez le retard de l'archivage de WAL — des lacunes dans WAL archivé rendent toute récupération complète impossible.
- Conservez suffisamment d'historique WAL — gardez les segments au moins jusqu'à la date de votre plus ancienne sauvegarde de base valide.
- Utilisez un emplacement de stockage distinct — si le disque principal tombe en panne, les WAL archivés sur ce même disque seront eux aussi perdus.
-- Check for any WAL archiving failures
SELECT archived_count,
failed_count,
last_archived_wal,
last_archived_time,
last_failed_wal,
last_failed_time
FROM pg_stat_archiver;Vérification rapide
Testez votre compréhension de la récupération à un instant donné.
Récapitulatif : récupération à un instant donné
Dans cette leçon, vous avez appris comment le journal d'écriture anticipée (WAL) de PostgreSQL permet de récupérer les données à n'importe quel instant passé :
- Archivage de WAL : capture chaque modification effectuée après une sauvegarde de base.
- Cibles de récupération : il peut s'agir d'un horodatage, d'un ID de transaction, d'un LSN ou d'un point de restauration nommé.
- Processus de récupération : il restaure la sauvegarde de base, rejoue les WAL archivés et effectue la promotion lorsque la cible est atteinte.
- Vérification : elle confirme l'intégrité des données avant la réouverture au trafic.
- Bonnes pratiques : elles comprennent des tests réguliers de restauration, la surveillance de l'archivage et le stockage de WAL hors site.
La récupération à un instant donné est votre filet de sécurité contre les erreurs humaines et la corruption des données — maîtrisez-la pour maîtriser la reprise après sinistre.
Questions Fréquemment Posées
La leçon « Récupération à un instant donné » est-elle gratuite ?
Oui — le texte complet de « Récupération à un instant donné » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours SQL Academy, passe à CoddyKit PRO. Le cours SQL Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Récupération à un instant donné » ?
Restaurez vos données à n’importe quel instant avec WAL. Tu pratiques SQL Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer SQL Academy ?
Aucune expérience préalable n'est requise. SQL Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Récupération à un instant donné » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon SQL Academy ?
Oui. Chaque leçon SQL Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Sauvegardes logiques ou physiques
- Récupération à un instant donné
- Tester vos restaurations
- Planification de la reprise après sinistre