Die Änderung, die niemand zurücknehmen konnte
An einem Freitagnachmittag korrigiert ein Ingenieur die Preise eines Lieferanten. Das UPDATE ist richtig. Im WHERE steckt ein Tippfehler, und es trifft die ganze Tabelle.
Eine Datenbank hat keine Rückgängig-Taste. Der einzige Weg zurück ist eine Kopie, die vor der Änderung gemacht wurde.
Im Beruf ist diese Kopie der erste Schritt, jedes Mal.
Am Ende dieser Lektion
Notiz
Ich kann eine Tabelle vor einer Änderung sichern und sie wiederherstellen, wenn die Änderung falsch war.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Sicherung | eine Kopie von Daten, damit Sie sie zurückholen können |
| Dump | eine Textdatei mit dem SQL, das eine Tabelle und ihre Zeilen neu aufbaut |
| Wiederherstellen | die Daten aus einer Sicherung zurückspielen |
| Betroffene Zeilen | wie viele Zeilen eine Änderung berührt hat |
| Probelauf | eine Änderung in einer Transaktion ausprobieren und zurückrollen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Arbeiten Sie an einer Kopie des Shops
Sie werden Daten ändern und dann reparieren. Der Shop soll unverändert bleiben.
Diese Runs legen in Ihrer eigenen Datenbank eine Tabelle preisliste an, kopiert aus den Artikeln des Shops.
Sie können sie jederzeit wiederholen, um von vorn zu beginnen.
Das Zertifikat des Servers annehmen
printf '[client]\nssl-verify-server-cert=0\n' > ~/.my.cnfHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Abkürzung für den Client
alias db='mariadb -h db -u student -pstudent -t -e'Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine eigene Datenbank anlegen
db "CREATE DATABASE IF NOT EXISTS student_depot"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine alte Kopie wegwerfen
db "DROP TABLE IF EXISTS student_depot.preisliste"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Artikel kopieren
db "CREATE TABLE student_depot.preisliste AS SELECT id, name, price AS preis, stock AS bestand FROM shop.products"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Zustand jetzt festhalten
db "SELECT COUNT(*) AS zeilen_jetzt, MIN(preis) AS guenstigster, MAX(preis) AS teuerster FROM student_depot.preisliste"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Dump ist eine lesbare Sicherung
Das Werkzeug mariadb-dump fragt den Server nach einer Tabelle und schreibt das SQL, das sie neu aufbaut. Die Datei enthält eine Zeile CREATE TABLE und je Tabellenzeile ein INSERT.
Die Option --skip-extended-insert legt eine Tabellenzeile in eine Dateizeile. --no-tablespaces ist nötig, weil Ihr Konto die Speicherdateien des Servers nicht lesen darf.
Das Zeichen > leitet die Ausgabe in eine Datei um statt auf den Bildschirm.
Die Tabelle in eine Datei sichern
mariadb-dump -h db -u student -pstudent --skip-extended-insert --no-tablespaces student_depot preisliste > preisliste.sqlHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die INSERT-Zeilen der Datei zählen
grep -c "^INSERT" preisliste.sqlHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die erste gesicherte Zeile lesen
grep -m1 "^INSERT" preisliste.sqlHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Fehler machen und dann reparieren
Tun Sie jetzt, was der Ingenieur tat. Führen Sie ein UPDATE ohne WHERE auf der Kopie aus.
Sehen Sie sich dann die Preise an. Spielen Sie danach die Datei zurück. Der Dump beginnt jede Tabelle mit DROP TABLE IF EXISTS, deshalb ersetzt das Laden die beschädigte Tabelle.
Alle Preise auf null setzen
db "UPDATE student_depot.preisliste SET preis = 0"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Schaden ansehen
db "SELECT COUNT(*) AS zeilen_jetzt, MIN(preis) AS guenstigster, MAX(preis) AS teuerster FROM student_depot.preisliste"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Aus der Datei wiederherstellen
mariadb -h db -u student -pstudent student_depot < preisliste.sqlHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die reparierte Tabelle ansehen
db "SELECT COUNT(*) AS zeilen_jetzt, MIN(preis) AS guenstigster, MAX(preis) AS teuerster FROM student_depot.preisliste"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele denken, eine Sicherung sei sicher, sobald die Datei existiert. Eine Datei, die Sie nie zurückgespielt haben, ist nur eine Hoffnung. Sie kann leer oder abgeschnitten sein. Zählen Sie die Zeilen darin und üben Sie das Zurückspielen an einer Kopie.
Prüfen, wie viele Zeilen eine Änderung berührt
Eine Sicherung hilft, wenn etwas schiefgeht. Besser ist es, den Schaden zu sehen, bevor er endgültig ist.
Starten Sie eine Transaktion. Führen Sie das UPDATE aus. Fragen Sie ROW_COUNT(), wie viele Zeilen es geändert hat. Ist die Zahl falsch, machen Sie ROLLBACK. Stimmt sie, führen Sie es noch einmal aus und machen COMMIT.
Das ist ein Probelauf.
Eine Änderung ausprobieren und zurückrollen
db "START TRANSACTION; UPDATE student_depot.preisliste SET bestand = bestand + 5 WHERE bestand < 10; SELECT ROW_COUNT() AS geaendert; ROLLBACK"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Zeilen zählen, die das WHERE wählt
db "SELECT COUNT(*) AS bestand_niedrig FROM student_depot.preisliste WHERE bestand < 10"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Beispiel: eine sichere Änderung in fünf Schritten
| Schritt | Was Sie tun | Wovor es schützt |
|---|---|---|
| 1 | Die Tabelle in eine Datei sichern | eine Änderung, die sich nicht zurücknehmen lässt |
| 2 | SELECT COUNT(*) mit demselben WHERE | ein WHERE, das zu viel trifft |
| 3 | START TRANSACTION und das UPDATE ausführen | eine Änderung, die schon endgültig ist |
| 4 | ROW_COUNT() mit Schritt 2 vergleichen | eine Zahl, die Sie nicht erwartet haben |
| 5 | COMMIT, oder ROLLBACK und neu ansehen | eine falsche Änderung zu beenden |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Zum Weiterdenken
Sichern Sie die ganze Datenbank student_depot, indem Sie den Tabellennamen weglassen. Zählen Sie ihre Zeilen CREATE TABLE.
Im echten Beruf kopieren Sie die Datei auch an einen anderen Ort und testen das Zurückspielen auf einem anderen Server. Eine Sicherung am selben Ort wie die Daten geht mit ihnen verloren.