Bestellungen an einem bekannten Wiederherstellungspunkt sichern

PostgreSQLBeginner
Jetzt üben

Einführung

PAPER & FORM verkauft Papierdrucke und Schreibtischobjekte. Der Umzug zu einem anderen Dienst steht an, und die Inhaberin muss genau wissen, welche Bestellungen eine Sicherung zurückholen kann. Eine vorhandene Datei reicht nicht: Sie muss jede Bestellung mit ihren Artikeln an einem klaren Wiederherstellungspunkt enthalten.

Du gibst eine kleine Bestellung auf, sicherst ein PostgreSQL-Archiv im Custom-Format und fügst eine weitere Bestellung hinzu, um deren Ausschluss aus der Sicherung zu verstehen. Grundlegende Terminalkenntnisse genügen. Datenbank, Werkzeuge und Website sind vorbereitet; du schreibst kein SQL und installierst keine Software. Kunden, Preise und Bestellungen sind erfunden; es gibt keine Zahlung oder E-Mail.

Nutze Original Shop für den aktiven Shop und Workstation für Befehle. Restored Copy ist ein unabhängiges leeres Ziel für das nächste Lab; stelle in dieser Einheit dort nichts wieder her. Jede Einheit beginnt mit eigenen Daten. Erhalte das bereitgestellte Programm und uploads/ unverändert. Dies ist eine Übung zum logischen Datenbankexport, keine vollständige Notfallwiederherstellung oder zeitpunktgenaue Wiederherstellung (PITR).

Die Bestellung für die Sicherung erfassen

In diesem Schritt erfasst du eine echte Bestellung mit ihren Artikeln. Beginne in Original Shop. Das blaue Band nennt die ursprüngliche Datenbank shop_source. Öffne Explore the collection ↗. Der Katalog bietet Print pair für $18.00 je Stück und Desk tray für $26.00. Öffne oben Orders, wähle R-101 und lies die Artikelzeile: Zwei Print pair ergeben $36.00. Wähle Download receipt ↓ und lies die gespeicherte Datei. Sie enthält Referenz, Kunde, Artikel, Menge und Summe. Kehre über PAPER & FORM zurück.

Eine Datenbank speichert strukturierte Datensätze. Hier enthält orders Referenz und Kunde jeder Bestellung; order_items enthält die Artikelzeilen. Jeder Artikel verweist auf seine übergeordnete Bestellung. Nur Kundennamen oder Summen zu behalten würde diese benötigte Beziehung verlieren. Detailseite und Beleg lesen die tatsächlich verknüpften Zeilen.

Wechsle zu Workstation. pwd zeigt das Arbeitsverzeichnis, ls listet seine Dateien:

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

Du solltest backups, shopctl und uploads sehen. Speichere Exporte in backups/. uploads/packing-note.txt gehört nicht zur Aufgabe und muss unverändert bleiben. Ein logischer Datenbankexport enthält keine Dateien außerhalb der Datenbank.

./shopctl startet den bereitgestellten Helfer im aktuellen Verzeichnis. Seine Aktion identity zeigt tatsächliche Verbindungen. Eine Rolle ist das Datenbankkonto, das Berechtigungen bestimmt. Host und Port identifizieren den Datenbankdienst. Führe aus:

./shopctl identity

Erkenne die Quelle shop_source mit der schreibgeschützten Clientrolle d09_reader und das Ziel shop_copy mit der beschreibbaren Rolle d09_copy, beide auf 127.0.0.1:5432. Ein gemeinsamer Server bedeutet keine gemeinsame Datenbank. Die Kopierolle kann sich nicht mit der Quelle verbinden. Die Website nutzt eine andere Rolle für Schreibzugriffe auf die Quelle. Das sind Übungsgrenzen, kein Schutz gegen einen Systemadministrator.

Öffne in Original Shop die Collection und scrolle zu Place an order. Lies vor dem Absenden Writing to: shop_source · ORIGINAL SHOP. Verwende genau:

Feld Wert
Reference R-103
Name Rae
Item Print pair
Quantity 2

Wähle Place order ↗. Die Seite zeigt R-103, Rae, zwei Print pair und $36.00. Das ist die Grenzbestellung, die in die Sicherung gehört. Das Originalformular lehnt unbekannte und nur für die Kopie vorgesehene Referenzen ohne Schreiben ab. R-104 vor einem gültigen geschützten cutoff-kept.dump ergibt ebenfalls Keep the earlier point first, ohne Daten zu schreiben. Falls du R-103 meintest, kehre zur Collection zurück und korrigiere die Referenz. Das schützt die vorgegebene Übungsreihenfolge; ein Produktionsshop wartet normalerweise nicht auf eine Sicherung, bevor er Bestellungen annimmt. Bei falschem Kunden, Artikel oder falscher Menge eines vorhandenen R-103 korrigierst du nur diesen reservierten Übungsdatensatz in Workstation:

./shopctl correct source R-103

Der Helfer zeigt das echte Ziel und ändert nur R-103 auf Rae / Print pair / 2. Ursprüngliche Basisreferenzen werden abgelehnt; andere Bestellungen, spätere Datensätze, Uploads und Archive bleiben erhalten. Dies ist eine ausdrückliche Korrektur durch dich, niemals eine Aktion der Prüfung. Korrigiere und lies vor dem Export erneut. Ergibt ein wiederholter Klick eine vorhandene Referenz, meldet das Formular Already recorded; öffne Orders und prüfe den vorhandenen Datensatz statt eines Duplikats.

Kehre zu Workstation zurück. records zeigt echte verknüpfte Daten; die letzten Zahlen sind Menge und Stückpreis in Cent:

./shopctl records source

Finde R-103 | Rae | Print pair | 2 | 1800 und insgesamt $98.00 für drei Bestellungen. Die gewünschte Bestellung wurde hinzugefügt, ohne R-101 und R-102 zu ändern.

Ein konsistentes Archiv im Custom-Format sichern

In diesem Schritt sicherst du die drei bestätigten Bestellungen. Ein Wiederherstellungspunkt ist der erfasste Datenbankzustand, nicht Dateiname oder Änderungszeit. PostgreSQLs pg_dump erzeugt einen konsistenten Schnappschuss: Verknüpfte Tabellen stammen aus derselben Datenbanksicht, auch wenn andere Nutzer aktiv sind. Schließe für diese Übung R-103 vor dem Export ab und warte auf dessen Ende, bevor du die nächste Bestellung anlegst. So ist die Grenze ohne Uhrenvergleich eindeutig.

Bleibe in Workstation. pg_dump exportiert Datenbanken, pg_restore liest deren Archivformate. Prüfe die installierten Clientversionen:

pg_dump --version
pg_restore --version

Beide sollten PostgreSQL 14 melden; auch der Server ist Version 14. Ein älteres pg_dump kann mit einem neueren Server scheitern. Umgehe einen Versionsfehler nicht durch eine leere Datei. Passende Werkzeuge sind vorbereitet.

Zeige vor der Quellwahl erneut die Verbindungen:

./shopctl identity

PostgreSQL-Verbindungsdienste sind gespeicherte Verbindungseinstellungen. service=shop-source wählt shop_source mit seiner schreibgeschützten Rolle; service=shop-copy wählt das unabhängige Ziel. --dbname bestimmt diese Verbindung. Nenne den Dienst immer ausdrücklich, statt Clientvorgaben zu verwenden.

--format=custom erzeugt PostgreSQLs komprimiertes Archivformat für pg_restore statt eines einfachen SQL-Skripts. --file benennt die Ausgabe. --no-privileges lässt Quellberechtigungen weg. Bei einem Custom-Archiv wird pg_dump --no-owner ignoriert; die Eigentümerschaft wird später mit --no-owner bei pg_restore übersprungen. Dadurch gehören wiederhergestellte Objekte der Zielrolle. Der folgende Befehl liest die Quelle und schreibt nur die benannte lokale Sicherungsdatei:

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

Ein erfolgreicher Export bleibt normalerweise still. Gib die nächste Geschäftsbestellung erst nach Abschluss ein. Bei Verbindungs- oder Dateifehlern prüfe pwd, ./shopctl identity und den Ausgabepfad und versuche es erneut. Eine Wiederholung ersetzt backups/cutoff.dump; tue das nur, solange die Quelle noch den gewünschten Grenzzustand hat. Ein späterer Export erfasst spätere Daten.

pg_restore --list liest das Inhaltsverzeichnis ohne Import:

pg_restore --list backups/cutoff.dump

Finde oben Format: CUSTOM, dbname: shop_source und passende Versionen des exportierten Servers und Clients. Weiter unten stehen orders, order_items, deren Daten, Sequenzen und Constraints. Das beschreibt die Struktur, beweist aber keine richtigen Geschäftszeilen. Wiederherstellung und Lesen der Zeilen sind stärkere Belege.

Die Prüfung testet dein echtes Archiv in einer neuen Wegwerfdatenbank einschließlich Grenzbestellung und Artikelbeziehung. Dein Restored Copy-Tab wird dadurch nicht wiederhergestellt. Behalte das Archiv für den nächsten Schritt.

Lies vor dem Weitergehen das Prüfergebnis und bewahre das geprüfte Archiv auf. cp kopiert eine Datei unter einen zweiten Namen. chmod a-w entfernt für alle Benutzer Schreibrechte und schützt beide Namen vor versehentlichem Überschreiben mit pg_dump --file:

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

Tue das erst nach erfolgreicher Sicherungsprüfung. Direkter Export auf eine geschützte Datei scheitert nun mit Permission denied, statt den Stand zu ersetzen. Wird der ursprüngliche Name gelöscht, stellt cp backups/cutoff-kept.dump backups/cutoff.dump seine Bytes wieder her. Die aufbewahrte Datei ist eine zweite lokale Kopie gegen normale Fehler, keine externe Notfallsicherung.

Spätere Bestellungen vom gesicherten Stand unterscheiden

In diesem Schritt entwickelt sich die Quelle weiter, während das Archiv beim früheren Stand bleibt. Öffne Original Shop, dann Collection, und lies vor dem Schreiben Writing to: shop_source · ORIGINAL SHOP. Sende:

Feld Wert
Reference R-104
Name Sol
Item Desk tray
Quantity 1

Der neue Datensatz ergibt $26.00. In Orders müssen R-101, R-102, R-103 und R-104 stehen. R-104 wurde nach Abschluss von pg_dump bestätigt und ist deshalb nicht in backups/cutoff.dump. Eine Sicherung ist keine aktive Verbindung, die weitere Bestellungen empfängt. Exportiere jetzt nicht über das Grenzarchiv.

Lies die Quelle in Workstation erneut:

./shopctl records source

Die Ausgabe enthält jetzt R-104 | Sol | Desk tray | 1 | 2600 und insgesamt $124.00. Die Quelle bleibt nutzbar; du hast keine Geschäftsdaten zerstört, um eine Wiederherstellung zu inszenieren. Erneutes Auflisten des Archivs zeigt weiterhin seine ursprüngliche Struktur:

pg_restore --list backups/cutoff.dump

Die Archivprüfung stellt nur in einer Wegwerftestdatenbank wieder her. Sie erwartet R-101 bis R-103 ohne R-104. Das belegt einen Wiederherstellungspunkt statt bloßer Dateiexistenz. Lasse Restored Copy in dieser Einheit leer.

Bei einem Fehler in R-104 zeigt ./shopctl correct source R-104 die Quelle und korrigiert nur diese vorhandene Übungsbestellung auf Sol / Desk tray / 1; frühere Datensätze bleiben erhalten. Unbekannte Referenzen lehnt das Formular ab. Korrigiere dann die Referenz und sende erneut.

Falls du cutoff.dump versehentlich gelöscht oder ersetzt hast, verwende die aufbewahrten früheren Bytes statt eines neuen zukünftigen Schnappschusses. In Workstation gibt chmod u+w dem Eigentümer Schreibrechte auf diese eine Datei. Danach stellt cp sie wieder her und chmod a-w schützt sie erneut:

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

Wurde die Datei gelöscht, lasse den ersten Befehl aus und nutze direkt die aufbewahrte Kopie. Prüfe das Archiv danach erneut. Lösche R-104 nicht und setze die Quelle nicht zurück: Spätere Geschäftsdatensätze müssen erhalten bleiben. Sind sämtliche Kopien eines früheren Punkts verloren, kann ein neuer logischer Export die Vergangenheit nicht erzeugen. Deshalb prüft und schützt der vorige Schritt eine zweite Kopie, bevor die Quelle weitergehen darf. Das nächste unabhängige Lab stellt denselben Stand bereit, damit du dich auf sichere Wiederherstellung konzentrieren kannst.

Zusammenfassung

Du hast eine echte Bestellung aufgegeben, ein konsistentes PostgreSQL-Archiv im Custom-Format exportiert und den gesicherten Stand von einer späteren Quellbestellung unterschieden. Die Archivprüfung hat tatsächlich wiederhergestellte Beziehungen in einer Wegwerfdatenbank getestet. Das nächste unabhängige Lab öffnet den gesicherten Zustand als nutzbare Shop-Kopie.