Problematik
In Datenbanken (auch in Webdatenbanken) sind oft wichtige Daten abgelegt. Grund genug, um sich über regelmäßige Datensicherungen Gedanken zu machen. Auch dann, wenn der Hosting-Provider tägliche bzw. nächtliche Backups auf Dateisystem-Ebene anbietet. Für zusätzliche, separate Datenbank-Backups gibt es jedoch gute Gründe. So lässt sich ein hier vorgestelltes MySQL-Datenbank-Backup beispielsweise problemlos auf andere Rechner portieren, auf denen ebenfalls MySQL installiert ist. Auch für die Portierung auf ein anderes DBMS kann so ein Backup die Basis sein.
Wir verwenden dazu das zum Lieferumfang von MySQL gehörende Dienstprogramm mysqldump, das sowohl unter Linux/Unix als auch unter DOS auf Shell-Ebene ausführbar ist.
Code: Backup und Restore einer Datenbank
Zunächst der Shell-Kommandoaufruf für das Backup einer Datenbank:
mysqldump -u username -p database_name > backup_file.sql
Dann der Shell-Kommandoaufruf für das Restore einer Datenbank aus einem zuvor erzeugten Backup:
mysql -u username -p database_name < backup_file.sql
oder (bei Portierung und vorangegangener Bearbeitung der SQL-Batchdatei):
mysql -u username -p < backup_file.sql
Erläuterung
mysqldump wird wie der Konsolen-Client mysql üblicherweise mit -u username -p aufgerufen. Für username müssen Sie natürlich einen gültigen Datenbank-Usernamen einsetzen. Die Option -p sorgt dafür, dass nach dem Starten des Kommandos zunächst die Eingabe des Passworts für den Datenbank-User abgefragt wird. Erst nach erfolgreicher Eingabe des Passworts beginnt der eigentliche Programmlauf.
Für database_name müssen Sie den Namen der MySQL-Datenbank eingeben, die Sie sichern wollen. Hinter dem Datenbanknamen folgt das Umleitungszeichen >, mit dessen Hilfe die Ausgabe, die ansonsten auf Standard-Out (stdio) geschrieben würde, in eine Datei umgelenkt wird. Nur so entsteht ein gespeichertes Backup.
mysqldump erzeugt so wie oben aufgerufen SQL-Code, der geeignet ist, um die gesamte Datenbank mit all ihren momentanen Daten neu zu erzeugen. Der erzeugte SQL-Code enthält also beispielsweise alle erforderlichen create-table-Statements sowie lauter insert-Statements, um die Daten in die Datenbank zu schreiben. Deshalb ist es sinnvoll, der Backupdatei die Endung .sql zu geben. Selbstverständlich können Sie im Zusammenhang mit der Backupdatei auch einen Pfadnamen mit angeben.
Für das Restore wird der MySQL-Shell-Client mysql aufgerufen. Dieses Dienstprogramm wird typischerweise ebenfalls mit -u username -p aufgerufen. Folgt dahinter das Umleitungszeichen <, gefolgt von einem Dateinamen, dann liest der mysql-Client seinen Input nicht von der Standardeingabe, sondern aus der angegebenen Datei. Geeignet sind dazu SQL-Batchdateien, wie sie von mysqldump erzeugt werden.
Hinweise
Falls Sie die SQL-Batchdatei auf ein anderes System portieren, ist es in der Regel erforderlich, zunächst die beim Backup erzeugte SQL-Batchdatei mit einem Texteditor zu bearbeiten. Notieren Sie vor dem ersten Eintrag — Table structure for table … das SQL-Statement zum Erzeugen der Datenbank: CREATE DATABASE `database_name`; (geben Sie dabei den gewünschten Namen der Datenbank an). Notieren Sie unterhalb des Statements zum Erzeugen der Datenbank das USE-Statement zum Verwenden der Datenbank: USE database_name;.
Nun können Sie die SQL-Batchdatei wie im untersten der obigen Kommando gezeigt importieren, also ohne Angabe eines Datenbanknamens.
Die obigen Kommandos lassen sich auch automatisch und zeitgesteuert ausführen (unter Linux/Unix etwa als cron-Jobs). So lassen sich beispielsweise tägliche Backups einer Datenbank anfertigen. Ein Problem stellt dabei jedoch die interaktive Passwortabfrage der Kommandos dar. Sie können diese umgehen, indem Sie direkt hinter der Kommando-Option -p das Passwort des Datenbank-Users eingeben (also ohne Leerzeichen dazwischen). Nachteil dieser Methode ist jedoch, dass das Passwort des Datenbank-Users dann offen lesbar im Kommando steht und somit für alle einsehbar ist, die lesenden Zugang zur cron-Job-Datei haben. Falls das in Ihrer Umgebung kein Sicherheitsproblem darstellt, spricht nichts gegen diese Lösung.
