1
0
Fork 0
Dieser Commit ist enthalten in:
DSB 2011-06-10 22:58:43 +00:00
Commit ed50a77498
7 geänderte Dateien mit 888 neuen und 0 gelöschten Zeilen

87
config.php Normale Datei
Datei anzeigen

@ -0,0 +1,87 @@
<?php
include("functions.php");
///////////////////////////////////////////////////////////
// Backup-Script von Daniel Schlichtholz
//
// Benutzung erfolgt nat<61>rlich auf eigene Gefahr
//
// f<>r Bugfixes und Erweiterungen schaut auf mein Board:
// http://www.daniel-schlichtholz.de/board
//
// Version 0.9.2
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
// erforderliche Variablen - bitte anpassen
//////////////////////////////////////////////////////////
$dbhost = 'localhost'; // die Adresse Deines MySQL-Servers
$dbname = 'test'; // der Name der Datenbank
$dbuser = ''; // Dein Benutzername fuer MySQL
$dbpass = ''; // Dein Passwort fuer den Benutzernamen
// Wo liegt die Datei bzw. wohin soll gespeichert werden ?
// Der Pfad ist relativ zum Scriptverzeichnis.
// Das Script muss Schreibrechte in diesem Ordner haben!
// Wenn das Verzeichnis nicht existiert, wird versucht es anzulegen.
// z.B. $path="./backup/";
$path="./backup/";
// Soll die Datei gepackt werden?
// Geht nur mit ZLib support (haben die meisten Anbieter aber),
// andernfalls auf 0 setzen
// bei $compression=0 wird eine ungepackten Datei 'DD.MM.YYYY_HH_Uhr_MM.sql' erstellt
// bei $compression=1 wird eine gepackte Datei 'DD.MM.YYYY_HH_Uhr_MM.sql.gz' erstellt
$compression=1;
// Soll das fertige Dumpfile an Dich per Email verschickt werden?
// $send_mail=1 -> ja
// $send_mail=0 -> nein
// Achte aber darauf, dass Dein Postfach auch gro<72> genug f<>r Dein Dumpfile ist!
$send_mail=0;
// Wohin soll die Email geschickt werden?
$email[0]="admin@daniel-schlichtholz.de";
// Welche Absenderadresse soll drinstehen?
$email[1]="mein_board@weltweit.de";
////////////////////////////////////////////////////////////////
//
// Variablen, die nur bei Problemen ge<67>ndert werden sollten...
//
////////////////////////////////////////////////////////////////
// neue Zeile-Code (soll nur einen Zeilenumbruch im Dump bewirken)
$nl="\n";
// Der "Ende des SQL-Befehls"-Code kann ge<67>ndert werden falls in der Datenbank
// zuf<75>llig der Standardcode (CHR(1)) vorhanden sein sollte und Du Fehlermeldungen
// beim Restore bekommst.
// Es muss aber ein eindeutiger String sein, der NICHT in den Daten der DB vorkommt.
// z.B. $next_sqlcommand="hier_beginnt_wirklich_der_neue_befehl_124356";
// ein langer String bl<62>ht zwar das Dumpfile etwas auf, aber lieber ein gro<72>es funktionierendes
// Backup, als ein kleines kaputtes :-)
$next_sqlcommand=CHR(1);
// Wieviele Zeilen sollen pro Seitenaufruf gespeichert werden?
// Hier musst Du testen, was Dein Provider so mitmacht :-)
// Je h<>her die Zahl, desto schneller ist das Backup fertig, aber
// die Gefahr auf ein Timeout zu laufen steigt damit nat<61>rlich auch.
// Falls Du einen Timeout-Error erhaeltst, verringere die Zahl entsprechend.
$anzahl_zeilen=2000;
// Wieviele SQL-Befehle sollen pro Seitenaufruf in die DB geschrieben werden?
// MySQL ist beim Schreiben langsamer, als beim Lesen -
// deshalb sollte die Zahl nicht zu hoch gew<65>hlt werden.
// Falls Du einen Timeout-Error erhaeltst, verringere die Zahl entsprechend.
$anzahl_zeilen_restore=1000;
?>

138
cron_dump.php Normale Datei
Datei anzeigen

@ -0,0 +1,138 @@
<?
include_once("config.php");
// Backupverzeichnis existiert noch nicht? Na gut, dann machen wir eben eins. :-)
if (!is_dir($path)) mkdir($path, 0777);
$zeilen_offset= (isset($_GET['zeilen_offset'])) ? $zeilen_offset=$_GET['zeilen_offset']:0;
if (isset($_GET['backupdatei'])) $backupdatei=$_GET['backupdatei'];
if (isset($_GET['table_offset'])) $table_offset=$_GET['table_offset'];
else
{
$dateiname=date("d\.m\.Y\_H",time())."_Uhr_".date("i",time()); // Dateiname aus Datum und Uhrzeit bilden
$endung= ($compression) ? ".sql.gz" : ".sql";
$backupdatei=$dateiname.$endung;
if (file_exists($path.$backupdatei)) unlink($path.$backupdatei);
$table_offset=0;
// Seitenerstaufruf -> Backupdatei anlegen
$cur_time=date("Y-m-d H:i");
$newfile="# Dump created on $cur_time\r\n";
$newfile.="# Remember that you must use my restorescript in order to get a working DB\r\n";
$newfile.="# because I use a special code to mark the end of a command.\r\n";
$newfile.="# This is NOT compatible with other restorescripts!\r\n";
$newfile.="# Anyway, have fun with this but use it at your own risk. :-) \r\n";
if ($compression==1)
{
$fp = gzopen ($path.$backupdatei,"wb");
gzwrite ($fp,$newfile);
gzclose ($fp);
chmod($path.$backupdatei,0777);
}
else
{
$fp = fopen ($path.$backupdatei,"wb");
fwrite ($fp,$newfile);
fclose ($fp);
chmod($path.$backupdatei,0777);
}
}
$conn = mysql_connect($dbhost,$dbuser,$dbpass) or die(mysql_error());
$tabellen = mysql_list_tables($dbname,$conn);
$num_tables = @mysql_num_rows($tabellen);
$tables=ARRAY();
if ($num_tables>0)
{
for ($i=0;$i<$num_tables;$i++)
{
$erg=mysql_fetch_row($tabellen);
$tables[$i]=$erg[0];
}
}
else die ("<br>Fehler:<br>Ich konnte keine Tabellen in der Datenbank '<b>".$dbname."</b>' finden.");
/////////////////////////////////
// Anzeige - Fortschritt
/////////////////////////////////
echo "<html>\n<title>MySql - DB-Restore</title>\n";
echo "<head>\n";
echo "<META HTTP-EQUIV=\"Pragma\" CONTENT=\"no-cache\">";
echo "</head>\n";
echo "<body>\n";
$newfile="";
if ($table_offset < $num_tables)
{
$table = $tables[$table_offset];
$aktuelle_tabelle=$table_offset;
if ($zeilen_offset==0)
{
$newfile .= get_def($dbname,$table);
}
$newfile .= get_content($dbname,$table);
}
if ($compression==1)
{
$fp = gzopen ($path.$backupdatei,"ab");
gzwrite ($fp,$newfile);
gzclose ($fp);
}
else
{
$fp = fopen ($path.$backupdatei,"ab");
fwrite ($fp,$newfile);
fclose ($fp);
}
if ($table_offset<$num_tables)
{
// Selbstaufruf starten
echo "\n\n<script =\"javascript\">self.location=\"cron_dump.php?";
echo "table_offset=$table_offset&zeilen_offset=$zeilen_offset&backupdatei=";
echo urlencode($backupdatei);
echo "\"</script>\n\n";
}
else
{
if ($send_mail==1)
{
$msg_body = "\n\r\n\rIn der Anlage findest Du die Sicherung Deiner MySQL-Datenbank.\n\r"
." Sicherung der Datenbank '".$dbname."' vom ".date("d\.m\.Y",time())
.".\n\r\n\rViele Grüsse\n\r\n\rMySQLDump\n\rhttp://www.daniel-schlichtholz.de/board";
$file = "./$path/$backupdatei";
$folder = $path;
$fname = $backupdatei;
$file_type = filetype("$file");
$file_size = filesize("$file");
$file_name = "$fname";
$subject = "Backup '".$dbname."' - ".date("d\.m\.Y",time());
$fp = fopen($file, "r");
$contents = fread($fp, $file_size);
$encoded_file = chunk_split(base64_encode($contents));
fclose($fp);
$header.= "FROM:$email[1] <$email[0]>\n";
$header.= "MIME-version: 1.0\n";
$header.= "Content-type: multipart/mixed; ";
$header.= "boundary=\"Message-Boundary\"\n";
$header.= "Content-transfer-encoding: 7BIT\n";
$header.= "X-attachments: $file_name";
$body_top = "--Message-Boundary\n";
$body_top.= "Content-type: text/plain; charset=US-ASCII\n";
$body_top.= "Content-transfer-encoding: 7BIT\n";
$body_top.= "Content-description: Mail message body\n\n";
$msg_body = $body_top . $msg_body;
$msg_body.= "\n\n--Message-Boundary\n";
$msg_body.= "Content-type: $file_type; name=\"$file_name\"\n";
$msg_body.= "Content-Transfer-Encoding: BASE64\n";
$msg_body.= "Content-disposition: attachment; filename=\"$file_name\"\n\n";
$msg_body.= "$encoded_file\n";
$msg_body.= "--Message-Boundary--\n";
mail($email[0], stripslashes($subject), $msg_body, $header);
}
}
echo "\n\n</body>\n</html>\n";
?>

206
dump.php Normale Datei
Datei anzeigen

@ -0,0 +1,206 @@
<?
include_once("config.php");
// Backupverzeichnis existiert noch nicht? Na gut, dann machen wir eben eins. :-)
if (!is_dir($path)) mkdir($path, 0777);
$zeilen_offset= (isset($_GET['zeilen_offset'])) ? $zeilen_offset=$_GET['zeilen_offset']:0;
if (isset($_GET['backupdatei'])) $backupdatei=$_GET['backupdatei'];
if (isset($_GET['table_offset'])) $table_offset=$_GET['table_offset'];
else
{
$dateiname=date("d\.m\.Y\_H",time())."_Uhr_".date("i",time()); // Dateiname aus Datum und Uhrzeit bilden
$endung= ($compression) ? ".sql.gz" : ".sql";
$backupdatei=$dateiname.$endung;
if (file_exists($path.$backupdatei)) unlink($path.$backupdatei);
$table_offset=0;
// Seitenerstaufruf -> Backupdatei anlegen
$cur_time=date("Y-m-d H:i");
$newfile="# Dump created on $cur_time\r\n";
$newfile.="# Remember that you must use my restorescript in order to get a working DB\r\n";
$newfile.="# because I use a special code to mark the end of a command.\r\n";
$newfile.="# This is NOT compatible with other restorescripts!\r\n";
$newfile.="# Anyway, have fun with this but use it at your own risk. :-) \r\n";
if ($compression==1)
{
$fp = gzopen ($path.$backupdatei,"wb");
gzwrite ($fp,$newfile);
gzclose ($fp);
chmod($path.$backupdatei,0777);
}
else
{
$fp = fopen ($path.$backupdatei,"wb");
fwrite ($fp,$newfile);
fclose ($fp);
chmod($path.$backupdatei,0777);
}
}
$conn = mysql_connect($dbhost,$dbuser,$dbpass) or die(mysql_error());
$tabellen = mysql_list_tables($dbname,$conn);
$num_tables = @mysql_num_rows($tabellen);
$tables=ARRAY();
if ($num_tables>0)
{
for ($i=0;$i<$num_tables;$i++)
{
$erg=mysql_fetch_row($tabellen);
$tables[$i]=$erg[0];
}
}
else die ("<br>Fehler:<br>Ich konnte keine Tabellen in der Datenbank '<b>".$dbname."</b>' finden.");
/////////////////////////////////
// Anzeige - Fortschritt
/////////////////////////////////
echo "<html>\n<title>MySql - DB-Restore</title>\n";
echo "<head>\n";
echo "<META HTTP-EQUIV=\"Pragma\" CONTENT=\"no-cache\">";
echo "</head>\n";
echo "<body>\n";
echo "<h1>Datenbank-Backup:</h1>\n";
echo "GZip-Kompression ist: <b>";
if ($compression==1) echo "an</b>"; else echo "aus</b>";
$sql="SELECT COUNT(*) AS anzahl FROM ".$tables[$table_offset];
$res=mysql_query($sql);
if ($res)
{
$row=mysql_fetch_object($res);
$gesamt=intval($row->anzahl);
if ($gesamt>0)
{
$fortschritt=round(((100*$zeilen_offset)/$gesamt),0);
if ($anzahl_zeilen>=$gesamt) $fortschritt=100;
}
else $fortschritt=100;
echo "<br>Speichere Tabelle <b>".($table_offset+1)."</b> von <b>".sizeof($tables)."</b>";
echo "<br>aktuelle Tabelle: <b>".($tables[$table_offset])."</b><br>";
echo "<br>Fortschritt Tabelle:<br>\n";
echo "<table border=\"0\" width=\"380\">\n<tr>\n";
echo "<td width=\"".($fortschritt*3)."\" bgcolor=\"blue\">&nbsp;</td>\n";
echo "<td width=\"".((100-$fortschritt)*3)."\">&nbsp;</td>\n";
echo "<td width=\"80\" align=\"right\">".($fortschritt)." %</td>\n";
if ($anzahl_zeilen+$zeilen_offset>=$gesamt)
{
$eintrag=$zeilen_offset+1;
$zeilen_gesamt=$gesamt;
if ($zeilen_gesamt==0) $eintrag=0;
}
else
{
$zeilen_gesamt=$zeilen_offset+$anzahl_zeilen;
$eintrag=$zeilen_offset+1;
}
echo "</tr>\n<tr>\n";
echo "<td colspan=\"3\">Eintrag <b>".number_format($eintrag,0,",",".")."</b> bis <b>";
echo number_format(($zeilen_gesamt),0,",",".")."</b> von <b>";
echo number_format($gesamt,0,",",".")."</b></td>\n";
echo "</tr>\n\n</table>\n\n";
$tabellen_gesamt=sizeof($tables);
$noch_zu_speichern=$tabellen_gesamt-$table_offset;
$prozent= ($tabellen_gesamt>0) ? round(((100*$noch_zu_speichern)/$tabellen_gesamt),0) : 100;
if ($noch_zu_speichern==0) $prozent=100;
echo "<br>Fortschritt gesamt:";
echo "\n\n<table border=\"0\" width=\"550\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n";
echo "<td width=\"".(5*(100-$prozent))."\" bgcolor=\"blue\"></td>\n";
echo "<td width=\"".($prozent*5)."\" align=\"center\"></td>\n";
echo "<td width=\"50\">".(100-$prozent)." %</td>\n";
echo "</tr>\n</table>\n";
flush();
}
//////////////////////////////////////
// Ende Anzeige
//////////////////////////////////////
$newfile="";
if ($table_offset < $num_tables)
{
$table = $tables[$table_offset];
$aktuelle_tabelle=$table_offset;
if ($zeilen_offset==0)
{
$newfile .= get_def($dbname,$table);
}
$newfile .= get_content($dbname,$table);
}
if ($compression==1)
{
$fp = gzopen ($path.$backupdatei,"ab");
gzwrite ($fp,$newfile);
gzclose ($fp);
}
else
{
$fp = fopen ($path.$backupdatei,"ab");
fwrite ($fp,$newfile);
fclose ($fp);
}
flush();
if ($table_offset<=$tabellen_gesamt)
{
// Selbstaufruf starten
echo "\n\n<script =\"javascript\">self.location=\"dump.php?";
echo "table_offset=$table_offset&zeilen_offset=$zeilen_offset&backupdatei=";
echo urlencode($backupdatei);
echo "\"</script>\n\n";
}
else
{
echo "<br><br>Alles fertig!";
echo "<br>Die Backupdatei wurde erfolgreich erstellt.";
echo "<br><br><a href=\"".$path.$backupdatei."\">Hier</a> kannst Du sie nun herunterladen.";
if ($send_mail==1)
{
$msg_body = "\n\r\n\rIn der Anlage findest Du die Sicherung Deiner MySQL-Datenbank.\n\r"
." Sicherung der Datenbank '".$dbname."' vom ".date("d\.m\.Y",time())
.".\n\r\n\rViele Grüsse\n\r\n\rMySQLDump\n\rhttp://www.daniel-schlichtholz.de/board";
$file = "./$path/$backupdatei";
$folder = $path;
$fname = $backupdatei;
$file_type = filetype("$file");
$file_size = filesize("$file");
$file_name = "$fname";
$subject = "Backup '".$dbname."' - ".date("d\.m\.Y",time());
$fp = fopen($file, "r");
$contents = fread($fp, $file_size);
$encoded_file = chunk_split(base64_encode($contents));
fclose($fp);
$header.= "FROM:$email[1] <$email[0]>\n";
$header.= "MIME-version: 1.0\n";
$header.= "Content-type: multipart/mixed; ";
$header.= "boundary=\"Message-Boundary\"\n";
$header.= "Content-transfer-encoding: 7BIT\n";
$header.= "X-attachments: $file_name";
$body_top = "--Message-Boundary\n";
$body_top.= "Content-type: text/plain; charset=US-ASCII\n";
$body_top.= "Content-transfer-encoding: 7BIT\n";
$body_top.= "Content-description: Mail message body\n\n";
$msg_body = $body_top . $msg_body;
$msg_body.= "\n\n--Message-Boundary\n";
$msg_body.= "Content-type: $file_type; name=\"$file_name\"\n";
$msg_body.= "Content-Transfer-Encoding: BASE64\n";
$msg_body.= "Content-disposition: attachment; filename=\"$file_name\"\n\n";
$msg_body.= "$encoded_file\n";
$msg_body.= "--Message-Boundary--\n";
if (mail($email[0], stripslashes($subject), $msg_body, $header))
echo "<br>Das Dumpfile wurde erfolgreich per Email verschickt.";
else echo "<br><font color=\"red\">Leider ist beim Verschicken der Email ein Fehler aufgetreten.!</font>";
}
echo "<br><br><br><a href=\"index.php\">Hier geht es zur&uuml;ck zum Kontrollzentrum</a>";
}
echo "\n\n</body>\n</html>\n";
?>

146
functions.php Normale Datei
Datei anzeigen

@ -0,0 +1,146 @@
<?php
// Liest die Eigenschaften der Tabelle aus der DB und baut die CREATE-Anweisung zusammen
function get_def($dbname, $table)
{
global $conn,$nl,$next_sqlcommand;
$def = "";
$def .= "DROP TABLE IF EXISTS $table;".$next_sqlcommand.$nl;
$def .= "CREATE TABLE $table (".$nl;
$result = mysql_db_query($dbname, "SHOW FIELDS FROM $table",$conn);
while($row = mysql_fetch_array($result))
{
$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 .= ",".$nl;
}
$def = ereg_replace(",\n$","", $def);
$result = mysql_db_query($dbname, "SHOW KEYS FROM $table",$conn);
while($row = mysql_fetch_array($result))
{
$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 .= ",";
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 .= ");".$next_sqlcommand.$nl;
return (stripslashes($def));
}
// Liest die Daten aus der DB aus und baut die INSERT-Anweisung zusammen
function get_content($dbname, $table)
{
global $conn,$anzahl_zeilen,$table_offset,$zeilen_offset,$nl,$next_sqlcommand;
$content="";
$query="SELECT * FROM $table LIMIT $zeilen_offset,".($anzahl_zeilen+1);
$result = mysql_db_query($dbname,$query,$conn);
$ergebnisse=mysql_num_rows($result);
if ($ergebnisse>$anzahl_zeilen)
{
$zeilen_offset=$zeilen_offset+$anzahl_zeilen;
$ergebnisse--;
}
else
{
$table_offset++;
$zeilen_offset=0;
}
for ($x=0;$x<$ergebnisse;$x++)
{
$row=mysql_fetch_row($result);
{
$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 .= "'".addslashes($row[$j])."',";
else $insert .= "'',";
}
$insert = ereg_replace(",$","",$insert);
$insert .= ");";
$content .= $insert.$next_sqlcommand.$nl;
}
}
return $content;
}
// Prüft ob es sich um eine Kommentarzeile handelt
function is_sqlvalue($t)
{
// Uebergeht Kommentarzeilen im Dump
if ( (strlen($t)>0) && (substr($t,0,1)!="#") ) return $t;
else return "";
}
// extrahiert auf einfache Art den Tabellennamen aus dem "Create"-Befehl
function get_tablename($t)
{
global $table_ready;
$t=trim(str_replace("CREATE TABLE","",$t));
$w=explode(" ",$t);
$table_ready++;
return $w[0];
}
// Liest zeilenweise aus dem Dump und setzt den MySQl-Befehl
// bis zum Vorkommen des Codes [chr(1)] zusammen
function get_sqlbefehl()
{
global $f,$gz,$end,$actual_table,$next_sqlcommand;
$ret=false;
$befehl="";
$befehl_gefunden=false;
WHILE ( ($befehl_gefunden==false) && (!($end)) )
{
$zeile= ($gz) ? gzgets($f,40960) : fgets($f,40960);
if ($zeile)
{
// Prima, wir haben Text in unserer Zeile.
// Dann wollen wir den Befehl mal zusammensetzen. :-)
// Zuerst mal schauen, ob es sich nicht um eine Kommentarzeile handelt
// Aber nur am Anfang eines Befehls - sonst besteht die Gefahr, dass
// Zeilen in Datensaetzen geloescht werden.
if ($befehl=="") $zeile=is_sqlvalue($zeile);
// Dann schauen wir mal nach dem Ende-Code...
$pos=strpos($zeile,$next_sqlcommand);
if (!$pos===false)
{
// Ende des Befehls gefunden - Rueckgabe ohne Semikolon und Ende-Code
$befehl.=substr($zeile,0,($pos-1));
$befehl_gefunden=true;
$ret=$befehl;
}
// Befehl ist noch nicht fertig: Zeile zum Befehl hinzufuegen
else $befehl.=$zeile;
// Pruefen, ob die naechste Tabelle angelegt wird (nur fuer Infoanzeige)
if (strtolower(substr($zeile,0,13))=="create table ") $actual_table=get_tablename($zeile);
}
else
{
// Ups, kein Rueckgabewert in der Zeile?
// Ja sind wir denn schon fertig? - Das ueberpruefen wir mal mit eof()...
if ( ($gz) && (gzeof($f)) ) $end=true;
if ( (!$gz) && (feof($f)) ) $end=true;
$ret="end of file";
}
}
return $ret;
}
?>

159
index.php Normale Datei
Datei anzeigen

@ -0,0 +1,159 @@
<?php
///////////////////////////////////////////////////////////
// Backup-Script von Daniel Schlichtholz
//
// Benutzung erfolgt natürlich auf eigene Gefahr
//
// für Bugfixes und Erweiterungen schaut auf mein Board:
// http://www.daniel-schlichtholz.de/board
//
// Version 0.9.2
//////////////////////////////////////////////////////////
include("config.php");
echo "<html>\n<head>\n<META HTTP-EQUIV=\"Pragma\" CONTENT=\"no-cache\">\n";
echo "<title>MySql-DB-Dump/Restore</title>\n";
echo "<style type='text/css'>\n";
echo "<!--
p.meldung { font-size: 12pt;color:#0000FF;font-weight:normal;text-align: left;}
p.fehler { font-size: 16pt;color:#FF0000;font-weight:bold;text-align: left;}
p.warnung { font-size: 14pt;color:#FF9E00;font-weight:normal;text-align: left;}
//-->
</style>\n";
echo "</head>\n";
echo "<body>\n";
echo "<b><u>Konfiguration:</u></b><br>";
echo "GZip-Komprimierung ist ";
if (!$compression) echo "<b>nicht</b> ";
echo "aktiviert.<br>";
echo "Die Backupdatei wird im Ordner '<b>".$path."</b>' abgelegt.<br>";
echo "Gesichert wird die Datenbank: '<b>".$dbhost."/".$dbname."</b>'.<br>";
echo "Nach dem Backup wird ";
if (!$send_mail) echo "k";
echo "eine Email mit dem Dumpfile ";
if ($send_mail) echo "an '<b>".$email[0]."</b>' ";
echo "verschickt.<br>";
echo "<br>Um die Konfiguration zu ver&auml;ndern, musst Du die Datei 'config.php' bearbeiten.<br><br>";
//--------------------------------------------------------
//*** Abfrage ob Neues Dump ***
//--------------------------------------------------------
if (isset($_POST["dump"]))
{
include("dump.php");
exit;
}
//--------------------------------------------------------
//*** Abfrage ob Restore ***
//--------------------------------------------------------
if (isset($_POST["restore"]))
{
if (isset($_POST["file"]))
{
PRINT "<p class='warnung'>Soll die Datenbank '<b>".$dbname;
echo "</b>' mit den Inhalten der Datei '<b>".$file."</b>' wiederhergestellt werden?</p>\n";
PRINT "<form method='post' action='restore.php'>\n";
PRINT "<input type='hidden' name='filename' value='$file'>\n";
PRINT "<input type='submit' value='Ja'>, ich bin sicher.\n";
PRINT "<input type='button' value='Nein' onclick=\"self.location.href='index.php'\"> lieber nicht.\n";
PRINT "</form>\n";
echo "</body>\n</html>";
exit;
}
ELSE
PRINT "<p class='fehler'>Bitte zuerst eine Datei auswählen!</p>\n";
}
//--------------------------------------------------------
//*** Abfrage ob Delete ***
//--------------------------------------------------------
if (isset($_POST["delete"]))
{
if (isset($_POST["file"]))
{
$file=$_POST["file"];
if (@unlink($path.$file))
PRINT "<p class='meldung'>Die Datei $file wurde erfolgreich gelöscht.</p>";
else
PRINT "<p class='fehler'>Löschen der Datei $file GESCHEITERT!</p>";
}
ELSE
PRINT "<p class='fehler'>Bitte zuerst eine Datei auswählen!</p>\n";
}
//--------------------------------------------------------
//*** Ausgabe der Dateien ***
//--------------------------------------------------------
// Backupverzeichnis existiert noch nicht? Na gut, dann machen wir eben eins. :-) PUS
if (!is_dir($path)) mkdir($path, 0777);
$dh = opendir($path);
while (false !== ($filename = readdir($dh)))
{
if ($filename != "." && $filename != "..") $files[] = $filename;
}
echo "<table border='1' rules='rows'>\n";
echo "<tr>\n";
echo "<td>&nbsp;</td>\n";
echo "<td><b>Dateiname</td>\n";
echo "<td align=\"right\" colspan=\"2\"><b>Dateigröße</b></td>\n";
echo "</tr>\n";
@rsort($files);
echo "<form method='post' action='".$PHP_SELF."'>\n";
for ($i=0; $i<sizeof($files); $i++)
{
// Dateigröße
$size = filesize("$path/$files[$i]");
// Gesamtgröße aller Backupfiles
$gesamt = $gesamt + $size;
// freier Speicherplatz
$space = diskfreespace("../");
// Hier werden die Dateinamen ausgegeben
echo "<tr>\n";
echo "<td align=\"right\"><input name='file' type='radio' value='$files[$i]'></td>\n";
echo "<td><a href='$path$files[$i]'>$files[$i]</a></td>\n";
echo "<td align=\"right\" colspan=\"2\">".round($size/1024)." kByte</td>\n\t</tr>\n";
}
if (!is_array($files)) echo "<tr><td colspan=\"4\" bgcolor=\"#CCCCCC\">Keine Datei gefunden.</td></tr>\n";
//--------------------------------------------------------
//*** Ausgabe der Gesamtgröße aller Backupfiles ***
//--------------------------------------------------------
echo "<tr>\n";
echo "<td align='left' colspan='2'><b>Gesamtgröße:</b></td>\n";
echo "<td align=\"right\" colspan=\"2\"><b>".round($gesamt/1024)." kByte</b></td>\n";
echo "</tr>\n";
//echo "</table>\n";
//--------------------------------------------------------
//*** Ausgabe des freien Speicher auf dem Rechner ***
//--------------------------------------------------------
//echo "<table border='1'>\n";
echo "<tr>\n";
echo "<td bgcolor='#00FF00' colspan='3'>Freier Speicher auf Server: </td>";
echo "<td bgcolor='#00FF00' align=\"right\"><b>".round(($space/(1024*1024*1024)),2)."</b> GByte</td>\n";
echo "</tr>\n";
echo "<tr>\n";
echo "<td colspan=\"2\">Wähle eine Datei zur Wiederherstellung oder zum Löschen aus:</td>\n";
echo "<td align=\"center\"><input name='restore' type='submit' value='Restore'></td>\n";
echo "<td align=\"center\"><input name='delete' type='submit' value='Delete'></td>\n";
echo "</tr>\n";
echo "<tr>\n<td colspan=\"4\">&nbsp;</td>\n</tr>";
echo "<tr>\n<td colspan=\"2\">Oder beginne ein neues Backup:</td>\n";
echo "<td colspan=\"2\" align='center'>";
echo "<input name='dump' type='submit' value='Neues Backup starten'></td>\n";
echo "</tr>\n";
echo "</form>\n";
echo "<tr>\n<td colspan=\"4\">&nbsp;</td>\n</tr>\n";
echo "</table>\n";
echo "<br><a href=\"http://www.daniel-schlichtholz.de/board\" target=\"_blank\">";
echo "Zum Hilfeboard</a>";
?>

37
readme.txt Normale Datei
Datei anzeigen

@ -0,0 +1,37 @@
MySQlDump von Daniel Schlichtholz
Version 0.9.2
http://www.daniel-schlichtholz.de/board
Willkommen und viel Spaß bei der Benutzung von MySqlDump mit PHP.
Die Benutzung erfolgt auf eigene Gefahr.
Ich kann nicht für Datenverluste verantwortlich gemacht werden.
Was hat sich in dieser Version geändert:
----------------------------------------
Die Datei "index.php" ist als neue Schaltzentrale hinzugekommen.
Von hier aus kann man jetzt alle Aktionen auslösen.
Hier habe ich die Erweiterung von Elax und pus234 eingebaut - Vielen Dank.
Erweiterung von Joachim Leicht eingebaut (http://nic.eu.ki) - Vielen Dank.
Das Dumpfile kann nun als Email verschickt werden.
Es ist die Datei "cron_dump.php" hinzugekommen.
Diese Datei eignet sich als Aufrufziel eines Cronjobs, da sie auf
Ausgaben völlig verzichtet. Sie orientiert sich aber an den Einstellungen
in der config.php.
Ich habe alle Funktionen in die Datei "functions.php" ausgelagert.
Das macht die anderen Dateien übersichtlicher und vereinfacht eine
Erweiterung durch andere Programmierer.
In "config.php" kann man nun den "neuer_sql-Befehl-Code" selbst einstellen.
(Es kann auch ein längerer String sein.)
Bugfix:
bei register_globals=off vergaß "dump.php" den Namen der Backupdatei - gefixt
Viel Spaß mit dem Script.
DSB (Daniel Schlichtholz)

115
restore.php Normale Datei
Datei anzeigen

@ -0,0 +1,115 @@
<?php
include("config.php");
$end=false; // Ende des Files erreicht?
$actual_table= (!empty($_GET['actual_table'])) ? $_GET['actual_table'] : "unbekannt";
$offset= (!empty($_GET['offset'])) ? $_GET['offset'] : 0;
$aufruf= (!empty($_GET['aufruf'])) ? $_GET['aufruf'] : 0;
$table_ready= (!empty($_GET['table_ready'])) ? $_GET['table_ready'] : 0;
if (isset($_POST["filename"])) $filename=$_POST["filename"];
if (isset($_GET["filename"])) $filename=$_GET["filename"];
$gz=$compression;
echo "<html>\n<title>MySql - DB-Restore</title>\n";
echo "<head>\n<META HTTP-EQUIV=\"Pragma\" CONTENT=\"no-cache\">\n";
echo "</head>\n";
echo "<body>\n\n";
// Datei oeffnen
$f = ($gz) ? gzopen($path.$filename,"r") : fopen($path.$filename,"r");
if ($f)
{
// Wenn GZ-Komprimierung aus ist, koennen wir mit Hilfe der Filegroesse
// ausrechnen, wieviel Prozent der Datei fertig sind.
// Bei GZ=1 geht es nicht, weil sich der Offset auf die ungepackte Groesse
// bezieht und somit nicht ins Verhältnis zur Dateigroesse gestellt werden kann.
if ($gz==0) $filegroesse=filesize($path.$filename);
$sql_command=array();
// Dateizeiger an die richtige Stelle setzen
($gz) ? gzseek($f,$offset) : fseek($f,$offset);
// Jetzt basteln wir uns mal unsere Befehle zusammen...
$a=0;
WHILE ( ($a<$anzahl_zeilen_restore) && (!$end) )
{
$befehl="";
// Einen MySQL-Befehl holen. Solange, bis wir wirklich etwas sinnvolles haben...
WHILE ( ($befehl=="") && (!$end) ) { $befehl=get_sqlbefehl();}
if ($befehl=="end of file")
{
// Am Ende der Datei angekommen - Schleife verlassen
$end=true;
break;
}
else
{
$sql_command[$a]=$befehl;
$a++;
}
}
// Offset merken, um beim naechsten Seitenaufruf an die richtige Stelle zu springen
$offset= ($gz) ? gztell($f) : ftell($f);
if ($gz) gzclose($f); else fclose($f);
// Und jetzt koennen wir unsere MySQL-Befehle an die Datenbank schicken
$link = mysql_connect($dbhost, $dbuser, $dbpass) or die("Keine Verbindung zur Datenbank möglich!");
mysql_select_db($dbname) or die("<br>Fehler:<br>Auswahl der Datenbank '<b>".$dbname."</b>' fehlgeschlagen!\n");
for ($i=0;$i<sizeof($sql_command);$i++)
{
if ($sql_command[$i]!="end of file")
{
$res=mysql_query($sql_command[$i],$link);
// Bei MySQL-Fehlern sofort abbrechen und Info ausgeben
$meldung=mysql_error($link);
if ($meldung!="")
{
echo "Fehler: ".$meldung."<br>";
echo "Fehler beim Eintrag des Befehls:<br>".$sql_command[$i];
die();
}
}
}
if (!$end)
{
// Noch nicht fertig? - Dann Anzeige der Infos und Selbstaufruf durch Javascript
$aufruf=$aufruf+1;
if (!$gz) $prozent=($offset*100)/$filegroesse;
echo "<h3>Wiederherstellung</h3>";
echo "der Datenbank '<b>".$dbname."</b>' auf '<b>".$dbhost."</b>'.<br>";
echo "<br><b>";
if ($table_ready>0) echo $table_ready-1; else echo "0";
echo "</b> Tabellen wurden komplett wiederhergestellt.";
echo "<br>Bisher wurden <b>";
echo number_format(($aufruf*$anzahl_zeilen_restore)-$table_ready,0,",",".")."</b> Datens&auml;tze erfolgreich eingetragen.";
echo "<br>Momentan wird die Tabelle '<b>".$actual_table."</b>' mit Daten gef&uuml;llt.<br>";
if (!$gz) echo "<br><b>".number_format(sprintf("%.4f",$prozent),4,",",".")." %</b> der Datei eingetragen.";
echo "<script =\"javascript\">self.location=\"$PHP_SELF?offset=";
echo $offset."&aufruf=".$aufruf."&actual_table=".$actual_table;
echo "&table_ready=".$table_ready."&filename=".urlencode($filename);
echo "\"</script>";
}
else
{
// Uff, geschafft! Jetzt darf die Leitung wieder abkuehlen. :-)
echo "<h3>Wiederherstellung</h3>";
echo "der Datenbank '<b>".$dbname."</b>' auf '<b>".$dbhost."</b>'.<br>";
echo "<br><b>Herzlichen Glückwunsch.</b>";
echo "<br><br>Die Datenbank wurde komplett wiederhergestellt.";
echo "<br>Alle Daten aus der Backupdatei wurden erfolgreich in die Datenbank eingetragen.<br>";
echo "<br>Alles fertig. :-)";
echo "<br><a href=\"index.php\">Hier geht es zur&uuml;ck zum Kontrollzentrum</a>";
}
}
else echo "Ich konnte die Datei '".$path.$filename."' nicht öffnen.";
echo "\n</body>\n</html>\n";
?>