DB Backup und Syncronisation

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • DB Backup und Syncronisation

    Hallo Zusammen

    Gestützt auf einem Script, hab ich es erweitert. Was ich zusätzlich erstellt habe ist, dass die erstellte .sql gezippt wird mit zlib.
    Danach auf wunsch eine Copy an die e-mailaddi geschickt wird.
    ebenfalls auf wunsch kann man 2 datenbanken in einer richtung syncronisieren. Ich nutze das, damit die DB in der Produktion die gleiche Daten wie in der Testumgebung hat.
    Die erstellte Zip-Backup wird kopiert und entpackt und in die Testumgebung eingelesen. Leider funzt es nur zum teil. Mitten beim einlesen bricht es einfach ab. Also das einlesen funktioniert, nur solllte er sein job beenden und nicht einfach unterbrechen. es gibt auch keine fehlermeldung, d.h der script funktioniert einwandfrei. die entpackte temporäre Backupdatei hat ne grösse von 8.7MB.

    Laufzeit des mysql.socket ist auf -1 und die PHP-Stream ist auf 1000 sekunden eingestellt.

    Die "echos" im script dient nur zur kontrolle. Wenn der Script funzt, dann werde ich den CronJob damit starten.

    Habt ihr vielleicht eine idee, woran das liegen könnte?


    PHP-Code:
    <?php
    // -----------------------------------------------------
    // -----------------------------------------------------
    // Script Konfiguration
    // -----------------------------------------------------
    // -----------------------------------------------------

    //DB-Daten (Source)
    $db_host     "localhost";                  // Hostname
    $db_user     "user1";                   // DB User
    $db_pw       "user1";                   // Passwort
    $db_name     "user1";                  // Datenbank-Name

    //DB-Daten (Target)
    $db_host2     "localhost";          // Hostname
    $db_user2     "user2";           // DB User
    $db_pw2       "user2";           // Passwort
    $db_name2     "user2";              // Datenbank-Name

    //Sonstige Angabgen
    $path            "siaclan/backup/";        // Pfad zum Backupverzeichnis - Endverzeichnis muss chmod 777 sein
    $unlinkzip    0;                                        // ZIP-File löschen? Wenn ja, wird die ZIP-File vorher per Mail geschickt
    $senttomail 0;                                        // ZIP-File per E-Mail senden?
    $dbsync            1;                                        // Datenbank Syncronisation starten?
    $email            "hn@n-sa.biz";                // E-Mail Adresse

    // -----------------------------------------------------
    // -----------------------------------------------------
    // AB HIER NICHT MEHR ÄNDERN!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    // -----------------------------------------------------
    // -----------------------------------------------------

    @error_reporting(7);
    @
    set_time_limit(0);
    @
    set_magic_quotes_runtime(0);
    $phpversion phpversion();
    $noerror 0;
    define('USE_MBSTRING'false);

    require(
    "siaclan/acp/lib/functions.php");
    require(
    "siaclan/acp/lib/class_db_mysql.php");
    require(
    "siaclan/acp/lib/class_query.php");

    if (
    version_compare($phpversion"4.1.0") == -1) {
        
    $_REQUEST array_merge($HTTP_COOKIE_VARS$HTTP_POST_VARS$HTTP_GET_VARS);
        
    $_COOKIE =& $HTTP_COOKIE_VARS;
        
    $_SERVER =& $HTTP_SERVER_VARS;
        
    $_FILES =& $HTTP_POST_FILES;
        
    $_GET =& $HTTP_GET_VARS;
        
    $_POST =& $HTTP_POST_VARS;
    }

    if (
    get_magic_quotes_gpc()) {
        if (
    is_array($_REQUEST)) $_REQUEST stripslashes_array($_REQUEST);
        if (
    is_array($_POST)) $_POST stripslashes_array($_POST);
        if (
    is_array($_GET)) $_GET stripslashes_array($_GET);
        if (
    is_array($_COOKIE)) $_COOKIE stripslashes_array($_COOKIE);
    }

    define('MYSQL_HOST',     $db_host);
    define('MYSQL_USER',     $db_user);
    define('MYSQL_PASS',     $db_pw);
    define('MYSQL_DATABASE'$db_name);
    error_reporting(E_ALL);

    mysql_connect(MYSQL_HOSTMYSQL_USERMYSQL_PASS) OR
    die(
    "Keine Verbindung zur Datenbank. Fehlermeldung:".mysql_error());
    mysql_select_db(MYSQL_DATABASE) OR
    die(
    "Konnte Datenbank nicht benutzen, Fehlermeldung: ".mysql_error());

    //--- DANK DEM UNBEKANNTER PROGGER - START ----
    if (!is_dir($path)) { mkdir($path0777); }
    $database $db_name;
    $zaehler 0;
    $sqlext ".sql";
    $dbfilename $database."_".date("Y-m-d_H-i");
    $file_name $path.$dbfilename.$sqlext;
    $text  "# --------------------------------------------------------\r\n";
    $text .= "# DATENBANK DUMP\r\n";
    $text .= "# Host: ".$db_host."\r\n";
    $text .= "# Erstellungszeit: ".date("d. F Y")." um ".date("H:i")."\r\n";
    $text .= "# Server Betriebssystem: ".php_uname()."\r\n";
    $text .= "# MySQL-Version: ".mysql_get_server_info()."\r\n";
    $text .= "# PHP-Version: ".phpversion()."\r\n";
    $text .= "# Datenbank: `$database`\r\n";
    $text .= "# --------------------------------------------------------\r\n\r\n";
    $fd fopen($file_name,"a+");
    fwrite($fd$text);
    fclose($fd);
    // Alle Datenbanken auf dem Server suchen
    $c 0;
    $result2 = @mysql_list_tables($database);
    // Tabellenname Array auslesen und aufbauen
    for ($i 0$i < @mysql_num_rows($result2); $i++)
    {
        
    $tabelle = @mysql_tablename($result2,$i);
        if (
    $tabelle != "") {
            
    $tbl_array[$c] = @mysql_tablename($result2,$i);
            
    $c++;
            
    $zaehler++;
        }
    }

    // Start Ausgabe und Berechnung
    for ($y 0$y $c$y++) {
        
    $tabelle $tbl_array[$y];
        
    // Struktur der Tabelle einlesen
        
    $def='';
        
    $index=array();
        
    $def .= "DROP TABLE IF EXISTS $tabelle;\r\n";
        
    $def .= "CREATE TABLE $tabelle (\r\n";
        
    $result3 = @mysql_db_query($database"SHOW FIELDS FROM $tabelle");
        while (
    $row = @mysql_fetch_array($result3)) {
            
    $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 .= ",\r\n";
        }
        
    $def ereg_replace(",\r\n$"""$def);
        
    $result3 = @mysql_db_query($database"SHOW KEYS FROM $tabelle");
        while (
    $row = @mysql_fetch_array($result3)) {
            
    $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(
    $xy$columns) = each($index)) {
            
    $def .= ",\r\n";
            if (
    $xy == "PRIMARY"$def .= "    PRIMARY KEY (".implode($columns", ").")";
            else if (
    substr($xy,0,6) == "UNIQUE"$def .= "    UNIQUE ".substr($xy,7)." (".implode($columns", ").")";
            else 
    $def .= "    KEY $xy (".implode($columns", ").")";
        }
        
    $def .= "\r\n);\r\n\r\n";
        
    // Ende Struktur Modul
        
    $db = @mysql_select_db($database);
        
    $tabelle "".$tabelle;
        
    $text "#\r\n# Daten für Tabelle `$tabelle`\r\n#\r\n\r\n";
        
    $fd fopen($file_name,"a+");
        
    fwrite($fd$text.$def);
        
    fclose($fd);
        
    $data "";
        if (
    $tabelle "") {
            
    $ergebnis[] = @mysql_select_db($database);
            
    $result = @mysql_query("SELECT * FROM $tabelle");
            
    $anzahl = @mysql_num_rows($result);
            
    $spaltenzahl = @mysql_num_fields($result);
            for (
    $i 0$i $anzahl$i++) {
                
    $zeile = @mysql_fetch_array($result);
                
    $data .= "INSERT INTO $tabelle (";
                for (
    $spalte 0$spalte $spaltenzahl$spalte++) {
                    
    $feldname = @mysql_field_name($result$spalte);
                    if (
    $spalte == ($spaltenzahl 1)) {
                        
    $data.= $feldname;
                    } else {
                        
    $data.= $feldname.",";
                    }
                }
                
    $data .= ") VALUES (";
                for (
    $k=0;$k $spaltenzahl;$k++) {
                    if (
    $k == ($spaltenzahl 1)) {
                        
    $data .= "'".addslashes($zeile[$k])."'";
                    } else {
                        
    $data .= "'".addslashes($zeile[$k])."',";
                    }
                }
                
    $data .= ");\r\n";
            }
            
    $data .= "\r\n";
        } else {
            
    $ergebnis[] = "Keine Tabelle übergeben";
        }

        
    $fd fopen($file_name,"a+");
        
    fwrite($fd$data);
        
    fclose($fd);
        echo 
    "Schreibe Tabelle ".$tabelle." in die ZIP-File<br>----------------------------<br><br>";
    }
    //--- DANK DEM UNBEKANNTER PROGGER - ENDE ----
    MFG CHRIS
    FlowFact AG

  • #2
    PHP-Code:
    //ERSTELLE BACKUPDATEI
    $tmpfilename $path.$dbfilename.".sql.gz";
    $fp = @gzopen($tmpfilename"w9");
    echo 
    "Erstelle Komprimierte Backupdatei<br>----------------------------<br><br>";

    $fd = @fopen($file_name'rb');
    $filecontent = @fread($fd, @filesize($file_name));
    @
    gzwrite($fp$filecontent);
    echo 
    "Schreibe Daten in die Komprimierte Backupdatei<br>----------------------------<br><br>";

    //SCHLIESSE BACUPDATEIEN
    @gzclose($fp);
    @
    fclose($fd);
    echo 
    "Schliesse alle Backupdateien<br>----------------------------<br><br>";

    //LÖSCHE DIE UNKOMPRIMIERTE BACKUPDATEI
    @unlink($file_name);
    echo 
    "Lösche unkomprimierte Backupdatei<br>----------------------------<br><br>";

    //LÖSCHE DIE ZIP-FILE ODER SENDE DAS ZIP-FILE AN DIE E-MAIL-ADRESSE
    if ($unlinkzip==|| $senttomail==1){
        
    $grenze "grenzlinie";

        
    $betreff "Backup DB: ".$dbfilename;

        
    $xmailer "NSA-MAILER ver6";

        
    $header "Return-Path: <backup@n-sa.biz>\n";
        
    $header .= "MIME-Version: 1.0\n";
        
    $header .= "Content-Type: multipart/mixed; boundary=\"$grenze\"\n";
        
    $header .= "X-Mailer: $xmailer"."\n";
        
    $header .= "X-Sender-IP: [" $_SERVER['REMOTE_ADDR'] . "]" "\n";
        
    $header .= "X-Priority: 3\n";
        
    $header .= "From: Backup-Server <backup@n-sa.biz>\r\n";

        
    $handle fopen($tmpfilename"r");
        
    $fcontent fread($handlefilesize($tmpfilename));
        
    fclose($handle);

        
    $filename $dbfilename.".sql.gz";

        
    $message "\n\n--$grenze\n";
        
    $message .= "Content-Type: application/gz; name=\"" $filename "\"\n";
        
    $message .= "Content-Transfer-Encoding: base64\n";
        
    $message .= "Content-Disposition: ATTACHMENT; filename=\"" $filename "\"\n\n";
        
    $message .= chunk_split(base64_encode($fcontent));
        
    $message .= "\n\n--$grenze";
        
    $message .= "Dies ist ein Backupmail. Die aktuelle Backupdatei ist als Anhang verfügbar";
        
    $message .= "\n--$grenze\n";

        
    mail($email$betreff$message$header);
        @
    unlink("./".$attactmp);
        if (
    $unlinkzip == 1) @unlink($tmpfilename);
    }

    //STARTE DATENBANK SYNCRONISATION WENN AUSGEWàHLT IST
    if ($dbsync == 1){
        echo 
    "Vorbereitung Datenbanksyncronisation<br>----------------------------<br><br>";
        
    define('MYSQL_HOST2',     $db_host2);
        
    define('MYSQL_USER2',     $db_user2);
        
    define('MYSQL_PASS2',     $db_pw2);
        
    define('MYSQL_DATABASE2'$db_name2);
        
    error_reporting(E_ALL);

        
    $db = new db($db_host2$db_user2$db_pw2$db_name2$phpversion);

        
    $backupfile $tmpfilename;

        if (
    file_exists($backupfile))
        {
            
    chmod($backupfile0777);
            echo 
    "Setzte die GZ Backupdatei auf 777<br>----------------------------<br><br>";
            
    copy($backupfile,$path."sqltemp.sql.gz");
            echo 
    "Kopiere die Backupdatei<br>----------------------------<br><br>";
            
    chmod($path."sqltemp.sql.gz"0777);
            echo 
    "Setze die Kopierte Datei auf 777<br>----------------------------<br><br>";
            
    exec("gunzip ".$path."sqltemp.sql.gz");
            echo 
    "Entpacke die temporäre Backupdatei<br>----------------------------<br><br>";
        }

        
    $fp fopen($path."sqltemp.sql""rb");
        
    $query fread($fpfilesize($path."sqltemp.sql"));
        
    fclose($fp);
        
        
        
    $sql_query = new query($query);
        
    $sql_query->doquery();
        echo 
    "Starte Datenbanksyncronisation<br>----------------------------<br><br>";
        
        @
    unlink($path."sqltemp.sql");
        echo 
    "Lösche die Temporäre Backupdatei<br>----------------------------<br><br>";
    }

    ?> 
    Zuletzt geändert von chris010; 22.06.2005, 22:33.
    MFG CHRIS
    FlowFact AG

    Kommentar

    Lädt...
    X