mySQL-Datenbank über PHP Script sichern

Auszusetzen ist an dem Script eigentlich nichts,
nur wie beschrieben das es automatisch zu einer bestimmten Zeit geht funktioniert noch nicht.
Oder gibt es dort irgendwo ein fertiges PHP-Script was man verwendet kann?

Bis jetzt kann ich alles nur manuell eingeben das ein Backup gestartet werden soll.
 
Nun ja, du könntest das PHP-Skript per cronjob auf dem Webserver aufrufen lassen. Oder aber eine while-Schleife, sowie sleep einbauen und das dann per Kommando-Zeile starten. Problem dabei ist, dass du eine maximale Ausführungszeit bei PHP-Skripten hast. Wird also eher nicht funktionieren.
 
Wo liegt denn das Problem? Du sagst oben doch selbst, dass Du das Script über einen Cronjob ausführen willst. Also: Script auf den Server laden, Cronjob erstellen (am besten rufst Du das Script über cURL oder Wget auf) et voilà.
 
Das Problem liegt darin das ich das einzelne Skript nicht habe.
Ich habe MySQLDumper installiert und dann übers Webinterface das Backup gemacht.
Ist im Prinzip dasselbe wie MyPHPAdmin.
Wo finde ich denn das einzelne Skript um ein Backup das Datenbank zu machen?
 
Hier: http://www.tutorials.de/forum/1792516-post6.html

Du musst in diesem Script noch den Aufruf der Funktion backup() einbauen. Beispiel:

Die Datenbank, die du sichern möchtest, heißt meinethalben "foo". Dann baust du in die Datei den Aufruf ganz unten ein:

PHP:
backup("foo");

Das lädst du dann auf deinen Webserver. Dann erstellst du einen Cronjob, der diese Datei aufruft. Bei jedem Aufruf des Jobs wird eine SQL-Datei erstellt, die den Namen "foo.datum.sql" erhält. Evtl. kann man noch die Uhrzeit in den Dateinamen aufnehmen, wenn man mehrere Sicherungen pro Tag haben will. Dazu müsstest du nur diese Zeile ersetzen:

PHP:
//$cur_date=date("Y-m-d");
$cur_date = date("Y-m-d_His");

Solltest du weitere Fragen haben, beantworte ich dir das auch gerne. Zu MySQLDumper kann ich leider nichts sagen.
 
Hi,

also wenn ich es ausführe bekomme ich die Meldung das es ausgeführt worden ist und eine neue Datei angelegt worden wäre:
Code:
# Dump created with phpMyBackup on 2009-08-29 13:08

Aber wo wird denn die Datei hingelegt?
Ich kann die nirgends finden.
 
Ich gebe zu, das ist eher sub-optimal. Am besten wäre es, wenn du folgende Zeile suchst:

PHP:
$filename = $db_name.".".$cur_date.".sql";

und vor den Dateinamen noch einen absoluten Pfad einfügst:

PHP:
$filename = "/pfad/irgendwo/im/dateisystem/des/webservers" . $db_name.".".$cur_date.".sql";

Du könntest als Pfad z.B. den Ordner verwenden, der auf deinem Webserver DOCUMENT_ROOT darstellt. Dann werden die Backups direkt in den Webordner geschoben und du kannst sie direkt über den Browser abholen. Das würde ich allerdings nicht so lassen. Besser du erstellst einen Ordner in deinem DOCUMENT_ROOT und lässt die Backups dort hin schreiben. Diesen neuen Ordner schützt du mit .htaccess, damit keiner außer dir die SQL-Backups ansehen kann.
 
Hi,

ich habe es wie du beschrieben hast geändert.
Es wird jetzt auch eine Textdatei erstellt,
in der aber nur
Code:
# Dump created with phpMyBackup on 2009-08-29 14:12
steht.

Weißt du vielleicht wodran das liegen kann?
 
Könnte sein, das ein Fehler im Script ist. Du solltest überall dort, wo mysql-Funktionen verwendet werden, eine Prüfung einbauen. Ich habe das mal für dich erledigt:

PHP:
<?php
define("SAVE_PATH", "/my/save/path/to/store/backups");
define("DB_TO_BACKUP", "foo");

function logger($text_to_log)
{
    $cur_time=date("Y-m-d H:i");
    $handle = fopen(SAVE_PATH . "/backup.log", "a");
    if($handle)
    {
        fputs($handle, "$cur_time\t$text_to_log\n");
        fclose(handle);
    }
}

function get_def($dbname, $table) {
    $def = "";
    $def .= "DROP TABLE IF EXISTS $table;\n";
    $def .= "CREATE TABLE $table (\n";
    $result = mysql_db_query($dbname, "SHOW FIELDS FROM $table") or logger(mysql_error());
    while($row = mysql_fetch_array($result)) {
        if(mysql_error()) logger(mysql_error());
        $def .= "    $row[Field] $row[Type]";
        if ($row["Default"] != "") $def .= " DEFAULT '$row[Default]'";
        if ($row["Null"] != "YES") $def .= " NOT NULL";
           if ($row[Extra] != "") $def .= " $row[Extra]";
            $def .= ",\n";
     }
     $def = ereg_replace(",\n$","", $def);
     $result = mysql_db_query($dbname, "SHOW KEYS FROM $table") or logger(mysql_error());
     while($row = mysql_fetch_array($result)) {
        if(mysql_error()) logger(mysql_error());
            
        $kname=$row[Key_name];
        if(($kname != "PRIMARY") && ($row[Non_unique] == 0)) $kname="UNIQUE|$kname";
        if(!isset($index[$kname])) $index[$kname] = array();
        $index[$kname][] = $row[Column_name];
     }
     while(list($x, $columns) = @each($index)) {
          $def .= ",\n";
          if($x == "PRIMARY") $def .= "   PRIMARY KEY (" . implode($columns, ", ") . ")";
          else if (substr($x,0,6) == "UNIQUE") $def .= "   UNIQUE ".substr($x,7)." (" . implode($columns, ", ") . ")";
          else $def .= "   KEY $x (" . implode($columns, ", ") . ")";
     }

     $def .= "\n);";
     return (stripslashes($def));
}

function get_content($dbname, $table) {
    $content="";
    $result = mysql_db_query($dbname, "SELECT * FROM $table") or logger(mysql_error());
    while($row = mysql_fetch_row($result)) {
        if(mysql_error()) logger(mysql_error());
        $insert = "INSERT INTO $table VALUES (";
        for($j=0; $j<mysql_num_fields($result);$j++) {
            if(!isset($row[$j])) $insert .= "NULL,";
            else if($row[$j] != "") $insert .= "'".$row[$j]."',";
            else $insert .= "'',";
        }
        $insert = ereg_replace(",$","",$insert);
        $insert .= ");\n";
        $content .= $insert;
    }
    return $content;
}

function backup($db_name, $send = true)
{
    $cur_date=date("Y-m-d");
    $cur_time=date("Y-m-d H:i");
    $newfile="# Dump created with phpMyBackup on $cur_time\r\n";
    $tables = mysql_list_tables($db_name) or logger(mysql_error());
    $num_tables = @mysql_num_rows($tables) or logger(mysql_error());
    $i = 0;
    while($i < $num_tables) { 
       $table = mysql_tablename($tables, $i) or logger(mysql_error());
    
       $newfile .= "\n# ----------------------------------------------------------\n#\n";
       $newfile .= "# structur for table '$table'\n#\n\n";
       $newfile .= get_def($db_name,$table);
       $newfile .= "\n\n";
       $newfile .= "#\n# data for table '$table'\n#\n\n";
       $newfile .= get_content($db_name,$table);
       $newfile .= "\n\n";
       $i++;
    }

    $filename = SAVE_PATH . "/" . $db_name.".".$cur_date.".sql";
    $fp = fopen ("$filename","w");
    fwrite ($fp,$newfile);
    fclose ($fp);
    

    if($send != false)
    {
        header("Content-Type: text/sql");
        header("Content-Disposition: attachment; filename=$filename");
        readfile("$filename");
        unlink($filename);
    }
    else
        return($filename);
}

backup(DB_TO_BACKUP, false);
?>

Du brauchst eigentlich lediglich die defines anpassen. Wenn ein Fehler aufgetreten sein sollte, wird das in ein Log-File am Speicher-Ort abgelegt, was du dann einsehen kannst. Notfalls bitte die Meldungen aus dem Log-File posten.
 

Neue Beiträge

Zurück