In diesem Artikel erfahren Sie, wie Sie die Struktur und den Inhalt Ihrer MySQL-Datenbanken sichern und somit auf einfachste Weise wiederherstellen können.
Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform,
sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc
zu kontaktieren.
Aufgrund der Komplexibilität des Themas werde ich den Artikel in zwei Parts
aufteilen. Zum einen die Theorie und zum anderen die Praxis mit gut kommentiertem
Source-Code. Ziel ist es, am Ende eine *.sql Datei zu haben, mit der man den Zustand
der Datenbank zum Zeitpunkt des Backups 100%ig wiederherstellen kann.
Theorie
Zuerst sollten wir uns einen Überblick darüber verschaffen, was benötigt
wird um eine Datenbank 100%ig wiederherzustellen. Zum einen wäre da ihre
Struktur (Tabellen, Eigenschaften der einzelnen Felder und Extras wie "Primary
Key" oder "Unique") und zum anderen die in ihr enthaltenen Daten
("Records" in den Tabellen).
Es ist üblich, dass eine Datenbank mehrere Tabellen besitzt. Diese Tabellen
sollten nun in ein Array eingelesen werden. Danach wird die folgende Routine von
jeder Tabelle durchlaufen. Es soll ja ein Abbild der gesamten Datenbank entstehen.
Was ist also zuerst zu tun in dieser Routine?
Um einen besseren Überblick zu haben sollte man vielleicht über der
Struktur und den Daten jeder Tabelle einen Header in Form eines Kommentars mit dem Namen der Tabelle einfügen.
Um die ersten Informationen zu erhalten benutzen wir den MySQL Befehl "DESCRIBE
Tabelle". Tabelle muss hier natürlich durch den entsprechenden Namen
ersetzt werden. Als Ergebnis bekommen wir eine tabellarische Auswertung. Für
jedes Feld der Tabelle sind folgende Informationen verfügbar:
Field (Name des Feldes)
Type (Typ des Feldes, z.B. "int(1)")
Null (Enthält die Option, ob das Feld "null" sein kann)
Key (Schlüssel, z.B. "Primary Key")
Default (Default Wert des Feldes)
Extras (Extras, z.B. "auto_increment")
Alle diese Informationen sind von Nöten, um die Struktur der Tabelle zu beschreiben - bis auf das "Key"-Feld. Diese Information bekommen wir später auf einem anderen
Wege.
Nämlich mit dem Befehl "SHOW keys FROM Tabelle". Als Ergebnis gibt
es wieder eine tabellarische Auswertung. Jedoch nicht wieder für jedes Feld
sondern für die komplette Tabelle. Diese Auswertung gibt Aufschluss darüber,
welche Extras auf welches Feld der Tabellen angewendet wurden.
Zum Abschluss des Datenbank-Abbildes müssen noch die in den Tabellen enthaltenen Daten gesichert werden. Das ist eigentlich recht einfach. Man fragt alle Daten aus der Tabelle mittels "SELECT * FROM Tabelle" ab und packt die Ergebnisse formatiert in die Backup-Datei.
Zum Schluss soll dem User selbst überlassen bleiben, ob er die Backup-Datei lieber herunterladen möchte oder lokal auf dem Server speichert will. Für das
Herunterladen müssen die Header modifiziert werden, sodass der Browser die
Datei, die mittels "echo" ausgegeben wurde, als eine von jenen betrachtet, die
es herunterzuladen gilt. Leider gibt es verschiedene Browser, die nur ihre eigene
"Syntax" in Header Befehlen verstehen, so dass man zusätzlich noch
einen "Fallback" einbauen sollte. Dieser überprüft zuerst
welchen Browser der User benutzt und gibt dann die entsprechenden Header aus.
Hiermit ist der theoretische Teil beendet. Falls einige Schritte nicht vollkommen
verstanden wurden, gibt es den kommentierten Source-Code, den vielleicht einige besser verstehen als ihre Muttersprache ;).
Praxis
In der Theorie wurde nur der dynamische Teil des Backups beschrieben. Allerdings
muss der User zuerst einmal die Datenbank auswählen und sonstige Entscheidungen
treffen. Dafür habe ich ein HTML-Formular vorbereitet. Doch auch dieses kommt
ohne Verbindung zur MySQL-Datenbank nicht aus, deshalb muss am Anfang jeder Datei
eine Verbindung aufgebaut werden. Der Einfachheit halber kann man die Verbindungsdaten
in einer separaten Datei ablegen und diese mittels "include()" einbinden.
?>
<br>
Weitere Optionen:<br>
<br>
<input name="type" type="radio" value="structur"> Nur Struktur der Datenbank<br>
<input name="type" type="radio" value="data"> Nur in der Datenbank enthaltene Daten<br>
<input name="type" type="radio" value="both" checked> Struktur und Daten sichern<br>
<br>
<input name="droptable" type="checkbox" value="true"> DROP TABLE miteinbeziehen<br>
<input name="deleteall" type="checkbox" value="true"> DELETE ALL miteinbeziehen<br>
<br>
Speichern unter:<br>
<br>
<input name="saveto" type="radio" value="server"> Server (gleiches Verzeichnis wie dieses Script)<br>
<input name="saveto" type="radio" value="download"> Download (Speichern auf Client-Rechner)<br>
<br>
<input name="export" type="submit" value="Exportieren">
</form>
Script zum Erstellen des Backups (dbsave.php):
<?php
Das Ganze funktioniert fast perfect. Lediglich beim Export muss ich die Daten umständlich über "speichern unter" mit dem Bowser sichern, da sie nur im Browserfenster angezeigt, aber nicht gespeichert werden. Wie erreiche ich dass die Daten sofort als .sql Datei exportiert werden (wie in PHPMyAdmin)?
Sorry falls die Frage dämlich ist. Aber ich arbeite mich gerade erst in diese Thematik ein.
Mac
Das Script gefällt mir ganz gut, nur leider werden keine default-Werte gesichert so das die Datenbank nach der Rücksicherung nicht mehr wie erwartet arbeitet.