Website Backup: Tool für FTP und MySQL-Daten

22. August 2009

Bislang habe ich mir über ein Backup meiner Webseiten eigentlich nur wenig Gedanken gemacht und immer gehofft, dass schon alles gut gehen wird. Wenn dann aber das Kind doch mal in den Brunnen gefallen ist, dann macht man sich doch seine Gedanken, wie man in Zukunft seine Daten effizient und regelmäßig sichert, so dass man einen alten Stand einer Website ganz einfach wiederherstellen kann. Ziel sollte es also sein, dass ein Backup sämtlicher Webseiten (Files und MySQL-Datenbank) auf jedem Webspace mit nur einem Knopfdruck oder sogar regelmäßig automatisch geschieht.

Dazu habe ich nun einmal mehrere Stunden geopfert und habe mich durch die Lösungen im Internet gequält. Ein Programm, das dieses beherrscht scheint SiteVault zu sein. Dieses macht auch einen vernünftigen Eindruck, kostet leider aber auch 99 Dollar für unbegrenzt viele Webseiten. Eine All-in-one Open Source Lösung konnte ich nicht finden. Durch geschicktes Kombinieren mehrere Angebote kann man allerdings das gleiche auch umsonst erhalten. Und das geht so.

Zunächst muss man regelmäßig die Datenbank auf dem jeweiligen Webspace sichern, danach holt man sich sämtliche Dateien über FTP. Für die Datenbanksicherung wird gerne das Tool MySQLDumper empfohlen, da man mit diesem auch große Datenbanken problemlos sichern kann. Für kleinere Datenmengen reicht aber auch vollkommen das folgende Script:


<?php
$datenbankhost = "Hostname (in der Regel: localhost)";
$datenbankuser = "Username";
$datenbankpasswort = "Passwort";
$datenbankname = "Datenbankname";
$connect = @mysql_connect($datenbankhost, $datenbankuser, $datenbankpasswort);
if (!$connect) {
die(mysql_error());
}
mysql_select_db($datenbankname);
$f = fopen("Pfad/Datenbankname.sql", "w");
$tabellen = mysql_list_tables($datenbankname);
while ($zellen = mysql_fetch_array($tabellen)) {
$table = $zellen[0];
$res = mysql_query("SHOW CREATE TABLE `$table`");
if ($res) {
$create = mysql_fetch_array($res);
$create[1] .= ";";
$line = str_replace("\n", "", $create[1]);
fwrite($f, $line."\n");
$data = mysql_query("SELECT * FROM `$table`");
$num = mysql_num_fields($data);
while ($row = mysql_fetch_array($data)){
$line = "INSERT INTO `$table` VALUES(";
for ($i=1;$i<=$num;$i++) {
$line .= "'".mysql_real_escape_string($row[$i-1])."', ";
}
$line = substr($line,0,-2);
fwrite($f, $line.");\n");
}
}
}
fclose($f);
?>

Die Platzhalter muss man nur mit den eigenen Datenbankdaten ersetzen. Um den Pfad herauszubekommen, führt man einfach eine php-Datei auf dem Webspace mit dem folgenden Inhalt aus:


<?php
echo $_SERVER['DOCUMENT_ROOT'];
?>

Nun lädt man die php-Datei für den MySQL-Dump auf seinen Webspace und ruft sie im Browser auf. Falls ein Fehler angezeigt wird, dass mysql_list_tables deprecated ist, einfach den folgenden Code an den Anfang der Datei stellen:

ini_set(’display_errors’, on );
error_reporting(E_ALL);

Jetzt sollte die komplette Datenbank in das gewählte Verzeichnis auf dem Webspace geschrieben worden sein. Diese Datei sollte man nun einfach regelmäßig ausführen lassen. Dazu bietet sich, wenn man keine eigenen Cron Jobs auf dem Server ausführen kann, der kostenlose Service auf www.cronjob.de an.

Als nächstes muss man also nur noch sämtliche Dateien auf dem Webspace via FTP herunterziehen. Dafür eignet sich zum Beispiel das Programm Cobian Backup. Man kann dort alle seine Webseitenprofile hinterlegen und auch auswählen, welche Dateien man herunterladen will bzw. welche ausgeschlossen werden sollen. Dann kann man die Downloads manuell oder auch nach einem automatischen Zeitplan starten. Wenn man dann ganz auf Nummer sicher gehen will, zieht man sich die heruntergeladenen Dateien noch auf einen USB-Stick oder eine separate Festplatte.

So kann man in Zukunft ruhig schlafen und braucht vor einem Hack der eigenen Webseite oder einem Servercrash eigentlich keine Angst mehr zu haben.



10 Antworten auf “Website Backup: Tool für FTP und MySQL-Daten”

  1. Markus schreibt:

    Eine schöne Sammlung von Shareware-Tools und Vollversionen findet man auch auf download-seite.de. Da ist ebenfalls der Download kostenlos.

  2. Daniel schreibt:

    Super Artikel genau danach habe ich gesucht, da mir das manuelle Backup von mehreren seiten lässtig wurde.

  3. Thomas schreibt:

    Danke für die Tipps.

    Ich hab das Script noch um die gzip-Funktion erweitert und den Dateinamen um Datum/Uhrzeit ergänzt. Zusätzlich werden die alten Sicherungen zu Begin gelöscht und ein paar Zeilen Outpup-Log.

    Herausgekommen ist dann folgendes:

    Das Script läßt sich auch prima über wget vom Cobian Backup aus vor dem Lauf starten:
    wget www.mein-servername.de/pfad/MyBackupScript.php
    (über Ereignisse vor Sicherung -> Ausführen)

    Damit entfällt das die Registrierung bei www.cronjob.de und die gesicherten Daten passen auf jeden Fall besser zusammen, da der DB-Dump unmittelbar vor dem FTP-Backup erstellt wird.

  4. Thomas schreibt:

    Hmmm… da ist jetzt wohl das Script verschwunden.

    Noch ein Versuch:

    [code]
    $datenbankhost = “Hostname (in der Regel: localhost)”;
    $datenbankuser = “Username”;
    $datenbankpasswort = “Passwort”;
    $datenbankname = “Datenbankname”;
    $pfad = $_SERVER[’DOCUMENT_ROOT’].”/backup/”;
    $Zeitstempel = date(”-Ymd-His”);

    foreach(glob($pfad.$datenbankname.”*.sql.gz”) as $fn) {
    echo “Delete: “.$fn.”\n”;
    unlink($fn);
    }

    echo “Backup: “.$datenbankname.”\n”;
    echo “Ziel: “.$pfad.$datenbankname.$Zeitstempel.”.sql.gz”.”\n”;

    $connect = @mysql_connect($datenbankhost, $datenbankuser, $datenbankpasswort);
    if (!$connect) {
    die(mysql_error());
    }
    mysql_select_db($datenbankname);
    $f = gzopen($pfad.$datenbankname.$Zeitstempel.”.sql.gz”, “w9″);
    $tabellen = mysql_list_tables($datenbankname);
    while ($zellen = mysql_fetch_array($tabellen)) {
    $table = $zellen[0];
    echo “Tabelle: “.$table.”\n”;
    $res = mysql_query(”SHOW CREATE TABLE `$table`”);
    if ($res) {
    $create = mysql_fetch_array($res);
    $create[1] .= “;”;
    $line = str_replace(”\n”, “”, $create[1]);
    gzwrite($f, $line.”\n”);
    $data = mysql_query(”SELECT * FROM `$table`”);
    $num = mysql_num_fields($data);
    while ($row = mysql_fetch_array($data)){
    $line = “INSERT INTO `$table` VALUES(”;
    for ($i=1;$i
    [/code]

  5. Thomas schreibt:

    Das Script hat noch ein Problem mit NULL-Feldern.

    Dazu muss folgender Teil angepasst werden:

    Alt:
    [code]
    for ($i=1;$i

  6. Thomas schreibt:

    Irgenwie kann man in den Kommentaren keinen richtigen Code mitgeben. Immer wird was weggeschnitten.

    Versuchen wir mal die Kurzform:

    ALT:
    $line .= “‘”.mysql_real_escape_string($row[$i-1]).”‘, “;

    NEU:
    if (is_NULL($row[$i-1])){
    $line .= “NULL, “;
    } else {
    $line .= “‘”.mysql_real_escape_string($row[$i-1]).”‘, “;
    }

  7. Florian schreibt:

    Super, genau nach soetwas habe ich gesucht! Werd ich gleich mal testen

  8. Sebastian schreibt:

    Inzwischen ist ja etwas Zeit vergangen, ich bin jedoch erst heute auf das Skript aufmerksam geworden. Allerdings wird mir immer ein syntax error angezeigt. Er schreibt: syntax error, unexpected ‘:’, expecting ‘,’ or ‘;’ in /meineSeite/Sicherungsskript_Datenbank.php on line 15
    Ich habe das Skript von Thomas verwendet. Kann mir vielleicht jemand helfen?

  9. Thomas schreibt:

    Hallo Sebastian,
    da hier alle Script-Kommentare nur “verstümmelt” angezeigt werden habe ich das Script noch einmal auf einen Webserver hochgeladen:

    http://ipinfo.freeunix.net/scripte/MySqlBackup.txt

  10. Nick schreibt:

    Hallo,
    ein tolles Skript! Allerdings sollte man bei sensiblen Daten daran denken, das Skript mit einem Kennwort zu versehen.

    Gibt es denn wirklich kein kostenloses Tool, mit welchem man die Backups direkt vom PC ausführen kann?

    Wie sieht es denn mit http://mysqlbackupftp.com/ oder http://www.phpmybackuppro.net/ (zwar auch wieder online; aber umfangreicher) aus?

    Kann mir jemand einen Tipp bzgl. der Tools geben?

    Danke!

Einen Kommentar abgeben:

Weitere Beiträge zum Thema: