Dieser Commit ist enthalten in:
Commit
696bf6b403
7 geänderte Dateien mit 888 neuen und 0 gelöschten Zeilen
87
config.php
Normale Datei
87
config.php
Normale Datei
|
@ -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
138
cron_dump.php
Normale Datei
|
@ -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
206
dump.php
Normale Datei
|
@ -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\"> </td>\n";
|
||||
echo "<td width=\"".((100-$fortschritt)*3)."\"> </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ück zum Kontrollzentrum</a>";
|
||||
}
|
||||
echo "\n\n</body>\n</html>\n";
|
||||
|
||||
?>
|
146
functions.php
Normale Datei
146
functions.php
Normale Datei
|
@ -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
159
index.php
Normale Datei
|
@ -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ä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> </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\"> </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\"> </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
37
readme.txt
Normale Datei
|
@ -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
115
restore.php
Normale Datei
|
@ -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ätze erfolgreich eingetragen.";
|
||||
echo "<br>Momentan wird die Tabelle '<b>".$actual_table."</b>' mit Daten gefü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ück zum Kontrollzentrum</a>";
|
||||
}
|
||||
}
|
||||
else echo "Ich konnte die Datei '".$path.$filename."' nicht öffnen.";
|
||||
echo "\n</body>\n</html>\n";
|
||||
|
||||
?>
|
Laden …
In neuem Issue referenzieren