Sauvegarder les commandes à un point de reprise connu

PostgreSQLBeginner
Pratiquer maintenant

Introduction

PAPER & FORM vend des impressions sur papier et des objets de bureau. Un transfert vers un autre service approche, et la propriétaire doit savoir exactement quelles commandes une sauvegarde pourra restituer. Un fichier présent ne suffit pas : il doit contenir chaque commande et ses articles à un point de reprise précis.

Vous passerez une petite commande, sauvegarderez une archive PostgreSQL au format personnalisé, puis ajouterez une autre commande pour comprendre pourquoi elle en est exclue. Les bases du terminal suffisent. La base, les outils et le site sont prêts ; vous n’écrirez pas de SQL et n’installerez rien. Clients, prix et commandes sont fictifs ; aucun paiement ni courriel n’est envoyé.

Utilisez Original Shop pour la boutique active et Workstation pour les commandes du terminal. Restored Copy est une destination indépendante vide destinée au prochain laboratoire ; ne restaurez rien dedans dans cette unité. Chaque unité possède ses propres données initiales. Préservez le programme fourni et uploads/. Cet exercice porte sur l’export logique, pas sur une reprise complète après sinistre ni une restauration à un instant donné (PITR).

Enregistrer la commande à inclure dans la sauvegarde

Dans cette étape, vous créerez une vraie commande avec ses articles. Commencez dans Original Shop. Le bandeau bleu identifie la base originale, shop_source. Ouvrez Explore the collection ↗. Le catalogue propose Print pair à $18.00 l’unité et Desk tray à $26.00. Ouvrez Orders dans la navigation, puis R-101 : ses deux Print pair totalisent $36.00. Sélectionnez Download receipt ↓ et lisez le texte enregistré. Il contient référence, client, article, quantité et total. Revenez avec PAPER & FORM.

Une base de données conserve des enregistrements structurés. Ici, orders contient référence et client de chaque commande ; order_items contient ses articles. Chaque article pointe vers sa commande parente. Ne garder que les clients ou les totaux ferait perdre la relation nécessaire à la boutique. La page et le reçu lisent ces véritables lignes liées.

Passez dans Workstation. pwd affiche le répertoire courant ; ls en énumère les fichiers :

pwd
/home/labex/project/shop-backup
ls

Vous devez voir backups, shopctl et uploads. Enregistrez les exports dans backups/. uploads/packing-note.txt est un fichier sans rapport avec la tâche, à préserver. Un export logique n’inclut pas les fichiers extérieurs à la base.

./shopctl exécute l’outil fourni dans le répertoire courant. Son action identity montre les connexions réelles. Un rôle est le compte qui détermine les permissions dans la base. Un hôte et un port identifient le service. Exécutez :

./shopctl identity

Repérez la source shop_source, avec le rôle client en lecture seule d09_reader, et la cible shop_copy, avec le rôle accessible en écriture d09_copy, toutes deux sur 127.0.0.1:5432. Partager un serveur ne signifie pas partager une base. Le rôle de copie ne peut pas se connecter à la source. Le site utilise un rôle distinct pour écrire dans l’original. Ce sont des limites de formation, pas une protection contre un administrateur système.

Dans Original Shop, ouvrez Collection et descendez jusqu’à Place an order. Avant l’envoi, lisez Writing to: shop_source · ORIGINAL SHOP. Saisissez exactement :

Champ Valeur
Reference R-103
Name Rae
Item Print pair
Quantity 2

Sélectionnez Place order ↗. La page affiche R-103, Rae, deux Print pair et $36.00 au total. Cette commande fixe la limite et doit figurer dans la sauvegarde. Le formulaire original refuse les références inconnues ou réservées à la copie sans écrire de données. R-104 envoyé avant un cutoff-kept.dump valide et protégé renvoie aussi Keep the earlier point first, sans rien écrire. Si vous vouliez R-103, revenez à Collection et corrigez la référence. Cela protège l’ordre de cet exercice ; en production, une boutique n’attend généralement pas une sauvegarde pour accepter des commandes. Si un R-103 existant comporte un client, un article ou une quantité erronés, corrigez seulement cet enregistrement de pratique depuis Workstation :

./shopctl correct source R-103

L’outil affiche la destination réelle, puis modifie uniquement R-103 en Rae / Print pair / 2. Il refuse les références initiales et préserve autres commandes, enregistrements ultérieurs, fichiers téléversés et archives. C’est une correction explicite de l’apprenant, jamais une action du contrôle. Corrigez puis relisez avant d’exporter. Si un clic répété réutilise une référence existante, le formulaire renvoie Already recorded ; ouvrez Orders pour lire l’enregistrement plutôt que le dupliquer.

Revenez dans Workstation. records affiche les données liées réelles ; les derniers nombres sont la quantité et le prix unitaire en centimes :

./shopctl records source

Repérez R-103 | Rae | Print pair | 2 | 1800 et $98.00 pour les trois commandes. Vous avez ajouté la commande voulue sans modifier R-101 ni R-102.

Sauvegarder une archive personnalisée cohérente

Dans cette étape, vous sauvegarderez les trois commandes validées. Un point de reprise est l’état capturé par l’export, pas le nom du fichier ni sa date de modification. pg_dump de PostgreSQL produit un instantané cohérent : les tables liées proviennent d’une même vue de la base, même si d’autres utilisateurs sont actifs. Pour cet exercice, terminez R-103 avant l’export et attendez sa fin avant la commande suivante. Cet ordre rend la limite claire sans comparer les horloges.

Restez dans Workstation. pg_dump exporte une base ; pg_restore lit ses formats d’archive. Vérifiez les versions installées :

pg_dump --version
pg_restore --version

Les deux doivent annoncer PostgreSQL 14 dans cet environnement. Le serveur est également en version 14. Un ancien pg_dump peut échouer face à un serveur plus récent ; ne masquez pas une erreur de version par un fichier vide. Les outils compatibles sont déjà préparés.

Affichez à nouveau les connexions avant de sélectionner la source :

./shopctl identity

Les services de connexion PostgreSQL sont des paramètres enregistrés. service=shop-source sélectionne shop_source et son rôle en lecture seule ; service=shop-copy sélectionne la cible indépendante. --dbname choisit cette connexion. Nommez toujours le service explicitement plutôt que de dépendre des valeurs par défaut.

--format=custom crée une archive PostgreSQL compressée qui nécessite pg_restore, au lieu d’un script SQL texte. --file nomme la sortie. --no-privileges omet les autorisations source. Pour une archive personnalisée, pg_dump --no-owner est ignoré ; on ignore la propriété ultérieurement en passant --no-owner à pg_restore. Cette option de restauration donne les objets au rôle cible. La commande lit la source et écrit seulement le fichier local indiqué :

pg_dump --dbname=service=shop-source --format=custom --no-privileges --file=backups/cutoff.dump

Un export réussi n’affiche généralement rien. N’entrez pas la commande commerciale suivante avant la fin. En cas d’erreur de connexion ou de fichier, vérifiez pwd, ./shopctl identity et le chemin de sortie, puis réessayez. Une répétition remplace backups/cutoff.dump ; faites-le uniquement tant que la source est encore au point voulu. Un export plus tardif capture des données plus tardives.

pg_restore --list lit la table des matières sans importer :

pg_restore --list backups/cutoff.dump

Au début, repérez Format: CUSTOM, dbname: shop_source et les versions compatibles du serveur exporté et du client. Plus bas figurent orders, order_items, leurs données, séquences et contraintes. Ces entrées décrivent la structure, sans prouver que les bonnes lignes commerciales sont présentes ; les restaurer puis les lire constitue une preuve plus forte.

Le contrôle teste votre archive réelle dans une nouvelle base jetable, y compris la commande limite et ses articles liés. Il ne restaure pas votre onglet Restored Copy. Conservez l’archive pour la suite.

Avant l’étape suivante, lisez le résultat du contrôle et conservez l’archive vérifiée. cp copie un fichier sous un second nom. chmod a-w retire l’écriture à tous les utilisateurs, protégeant les deux noms d’un écrasement accidentel par pg_dump --file :

cp backups/cutoff.dump backups/cutoff-kept.dump
chmod a-w backups/cutoff.dump backups/cutoff-kept.dump

Faites-le seulement après la réussite du contrôle. Exporter directement vers l’un des fichiers protégés échoue désormais avec Permission denied au lieu de remplacer le point sauvegardé. Si le nom original est supprimé, cp backups/cutoff-kept.dump backups/cutoff.dump restitue ses octets. Le fichier conservé est une seconde copie locale contre les erreurs ordinaires, pas une protection hors site contre les sinistres.

Distinguer les commandes ultérieures du point sauvegardé

Dans cette étape, la source avancera tandis que l’archive restera à son état antérieur. Dans Original Shop, ouvrez Collection et lisez Writing to: shop_source · ORIGINAL SHOP avant d’écrire. Envoyez :

Champ Valeur
Reference R-104
Name Sol
Item Desk tray
Quantity 1

Le nouvel enregistrement totalise $26.00. Dans Orders, confirmez R-101, R-102, R-103 et R-104. R-104 a été validé après la fin de pg_dump et ne figure donc pas dans backups/cutoff.dump. Une sauvegarde n’est pas une connexion active recevant les prochaines commandes. Ne réexportez pas maintenant par-dessus l’archive limite.

Dans Workstation, relisez la source :

./shopctl records source

Elle contient maintenant R-104 | Sol | Desk tray | 1 | 2600, pour un total de $124.00. La source reste utilisable ; vous n’avez pas détruit de données pour créer une situation de restauration. Relister l’archive montre toujours sa structure d’origine :

pg_restore --list backups/cutoff.dump

Le contrôle restaure l’archive uniquement dans une base de test jetable. Il attend R-101 à R-103 et exclut R-104. Il prouve ainsi un point de reprise, pas seulement l’existence d’un fichier. Laissez Restored Copy vide dans cette unité.

Si R-104 est erroné, ./shopctl correct source R-104 affiche la source et corrige uniquement cette commande de pratique existante en Sol / Desk tray / 1, en préservant les précédentes. Le formulaire refuse une référence inconnue : corrigez-la puis renvoyez.

Si vous avez supprimé ou remplacé cutoff.dump, récupérez les octets antérieurs conservés, pas un nouvel instantané futur. Dans Workstation, chmod u+w rend au propriétaire l’écriture sur ce fichier ; cp en récupère le contenu et chmod a-w le protège à nouveau :

chmod u+w backups/cutoff.dump
cp backups/cutoff-kept.dump backups/cutoff.dump
chmod a-w backups/cutoff.dump

Si le fichier a été supprimé, omettez la première commande et utilisez directement la copie conservée. Relancez ensuite le contrôle. Ne supprimez pas R-104 et ne faites pas reculer la source : les enregistrements ultérieurs doivent rester. Si toutes les copies d’un point antérieur ont disparu, un nouvel export logique ne peut pas recréer le passé. C’est pourquoi l’étape précédente contrôle et conserve une copie protégée avant de laisser avancer la source. Le prochain laboratoire indépendant fournit ce même point pour vous concentrer sur une restauration sûre.

Résumé

Vous avez passé une vraie commande, exporté une archive PostgreSQL personnalisée et cohérente, puis distingué ce point sauvegardé d’une commande ultérieure de l’original. Le contrôle a testé les relations réellement restaurées dans une base jetable. Le prochain laboratoire indépendant ouvrira l’état sauvegardé sous forme de boutique utilisable.