Leitgedanken/backup/backup_db.php
2022-11-21 09:47:28 +01:00

586 lines
19 KiB
PHP

<?php
# Fuer debugging
error_reporting(E_ALL);
ini_set('display_errors', 1);
#echo __LINE__."<br>";
ignore_user_abort(true); // DAMIT DAS SCRIPT AUF KEINEN TIMEOUT LÄUFT
@set_time_limit(0);
@ini_set("memory_limit","256M");
// Script Konfiguration
require("../config/datenbankanbindung.php"); // f&uuml;gt die Datenbankanbindung ein: Sys:\php\includes\kurs\datenbankanbindung.php
$frist = 20; //Anzahl der Tage der Speicherzeit
// Konfiguration Ende
dbconnect();
$path = "dump/";
// -----------------------------------------------------
// Don't change the lines below:
if (!is_dir($path)) { mkdir($path, 0777); }
echo "<b>Datenbank Dump</b><br><br><br>";
echo "Servername: '".$db_host."'<br>";
echo "Betriebssystem: ".php_uname()."<br>";
echo "MySQL-Version: ".mysql_get_server_info()."<br>";
echo "PHP - Version: ".phpversion()."<br><br>";
echo "<table border=\"1\" width=\"60%\">";
echo "<tr>
<td>DB Name</td>
<td>Anzahl Tabellen</td>
<td>Größe</td></tr>";
echo "<tr><td>$db_name</td>";
$database = $db_name;
$zaehler = 0;
$file_name = $path.date("Y-m-d_H-i")."_".$database.".sql";
$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 .= "# Backupscript: Alexander Schwarz\r\n";
$text .= "# \r\n";
$text .= "###########################################################################\r\n";
$text .= "# Zeichencodierung der Datei: latin1\r\n";
$text .= "# (ggf. umstellen beim Import, falls die Umlaute falsch dargestellt werden)\r\n";
$text .= "###########################################################################\r\n";
$text .= "# \r\n";
$text .= "# --------------------------------------------------------\r\n\r\n";
$fd = fopen($file_name,"a+");
fwrite($fd, $text);
fclose($fd);
$header = "# Constraints disablen\r\n";
$header .= "SET FOREIGN_KEY_CHECKS=0;\r\n";
$header .= "SET AUTOCOMMIT=0;\r\n";
$header .= "START TRANSACTION;\r\n";
$header .= "\r\n\r\n";
$fd = fopen($file_name,"a+");
fwrite($fd, $header);
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++;
}
}
echo "<td align=\"right\">".$zaehler."</td>";
// Start Ausgabe und Berechnung
for ($y = 0; $y < $c; $y++) {
$tabelle = $tbl_array[$y];
// Struktur der Tabelle einlesen
// unset($def,$index);
$def='';
$index=array();
$def .= "DROP TABLE IF EXISTS `$tabelle`;\r\n";
#$def .= "CREATE TABLE $tabelle (\r\n";
// echo"$tabelle<br>";
$result3 = @mysql_db_query($database, "SHOW CREATE TABLE $tabelle");
while ($row = @mysql_fetch_array($result3)) {
$create_query = $row[1];
#####################################
# Entfernung der Constraints:
#####################################
# IF: Überprüfung ob im Create Table Statement ein constraint vorkommt.
# erste Zeile wo Constraint vorkommt merken --> $i
# Komma entfernen, da in der letzten Zeile des Creates statements kein komma stehen darf. Das Komma würde bei der Constraint Zeile fehlen, diese wird aber gelöscht, daher muss das Komma schon eine Zeile vorher weg
# Schleife 2 starten, wo ersten constraint beginnt $j=$i und die Zeilen mit Constraints auslassen
# Zeilen aus $i und $j mit implode zusammensetzen.
/*
if (preg_match('@CONSTRAINT|FOREIGN[\s]+KEY@', $create_query)) {
$sql_lines = explode(chr(10), $create_query);
$sql_count = count($sql_lines);
// lets find first line with constraints
for ($i = 0; $i < $sql_count; $i++) {
if (preg_match('@^[\s]*(CONSTRAINT|FOREIGN[\s]+KEY)@', $sql_lines[$i])) {
break;
}
}
// Komma entfernen bei der letzten Zeile
$sql_lines[$i - 1] = preg_replace('@,$@', '', $sql_lines[$i - 1]);
for ($j = $i; $j < $sql_count; $j++) {
if (preg_match('@CONSTRAINT|FOREIGN[\s]+KEY@', $sql_lines[$j])) {
if (!$first) {
$sql_constraints .= chr(10);
}
if (strpos($sql_lines[$j], 'CONSTRAINT') === FALSE) {
$str_tmp = preg_replace('/(FOREIGN[\s]+KEY)/', 'ADD \1', $sql_lines[$j]);
$sql_constraints_query .= $str_tmp;
$sql_constraints .= $str_tmp;
} else {
$str_tmp = preg_replace('/(CONSTRAINT)/', 'ADD \1', $sql_lines[$j]);
$sql_constraints_query .= $str_tmp;
$sql_constraints .= $str_tmp;
}
$first = FALSE;
} else {
break;
}
}
$ii = $i-1;
$create_query = implode(chr(10), array_slice($sql_lines, 0, $i)) . chr(10) . implode($crlf, array_slice($sql_lines, $j, $sql_count - 1));
}
*/
$def .= $create_query;
}
#####################################
# Entfernung der Constraints Ende
#####################################
$def .= "; \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);
// unset($data);
$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))
{
$flags = mysql_field_flags($result, $k); //auslesen ob die aktuelle Tabelle binarys hat, $k ist die aktuelle Zeile. ZB 8 ==> PWD
$search = array("\x00", "\x0a", "\x0d", "\x1a"); //\x08\\x09, not required
$replace = array('\0', '\n', '\r', '\Z');
if (stristr($flags, 'BINARY')){
if($zeile[$k] != '') //wenn Zeile kein Wert hat soll er auch den HEX-Anfangswert 0x nicht reinschreiben
{
$data .= "0x".str_replace($search, $replace, addslashes(ltrim(bin2hex(rtrim($zeile[$k]))))).""; //Leerzeichen am Anfang und Ende entfernen. Am 22.04.2005 hinzugef&uuml;gt
}else{
$data .= "'".str_replace($search, $replace, addslashes(ltrim(rtrim($zeile[$k]))))."'"; //Leerzeichen am Anfang und Ende entfernen. Am 22.04.2005 hinzugef&uuml;gt
}
}else{
$data .= "'".str_replace($search, $replace, addslashes(ltrim(rtrim($zeile[$k]))))."'"; //Leerzeichen am Anfang und Ende entfernen. Am 22.04.2005 hinzugef&uuml;gt
}
} else {
$flags = mysql_field_flags($result, $k);
if (stristr($flags, 'BINARY')){
if($zeile[$k] != '') //wenn Zeile kein Wert hat soll er auch den HEX-Anfangswert 0x nicht reinschreiben
{
$data .= "0x".str_replace($search, $replace, addslashes(ltrim(bin2hex(rtrim($zeile[$k]))))).","; //Leerzeichen am Anfang und Ende entfernen. Am 22.04.2005 hinzugef&uuml;gt
}else{
$data .= "'".str_replace($search, $replace, addslashes(ltrim(rtrim($zeile[$k]))))."',"; //Leerzeichen am Anfang und Ende entfernen. Am 22.04.2005 hinzugef&uuml;gt
}
}else{
$data .= "'".str_replace($search, $replace, addslashes(ltrim(rtrim($zeile[$k]))))."',"; //Leerzeichen am Anfang und Ende entfernen. Am 22.04.2005 hinzugef&uuml;gt
}
}
}
$data .= ");\r\n";
}
$data .= "\r\n";
} else {
$ergebnis[] = "Keine Tabelle &uuml;bergeben";
}
$fd = fopen($file_name,"a+");
fwrite($fd, $data);
fclose($fd);
} // Ende for
$footer = "# Constraints enablen\r\n";
$footer .= "SET FOREIGN_KEY_CHECKS=1;\r\n";
$footer .= "COMMIT;\r\n";
echo __LINE__."<br>";
$fd = fopen($file_name,"a+");
fwrite($fd, $footer);
fclose($fd);
//-------------------------------------------------------------------
// Constraints hinzuf&uuml;gen
//-------------------------------------------------------------------
/*
// tabllen durchlaufen und bei gefundenen Constraints ADD machen
for ($i = 0; $i < @mysql_num_rows($result2); $i++)
{
$tabelle1 = @mysql_tablename($result2,$i);
if ($tabelle1 != "") {
$tbl_array[$c] = @mysql_tablename($result2,$i);
$c++;
$zaehler++;
}
$query = "SHOW CREATE TABLE $tabelle1";
$create_query = mysql_query($query)
or die ("Cannot execute query");
while ($row = mysql_fetch_array($create_query)){
//echo "$row[1]<p>";
$b = strpos ($row[1], "CONSTRAINT");
//echo "position".$b;
if ($b != NULL){
$c = strlen($row[1]);
// echo "<br>c =".$c;
$d = $c - $b; //länge des reststrings
$e = substr($row[1], $b, $c);
// echo "<br> ergebnis:".$e;
$z = strpos ($e, ") TYPE");
if ($z == NULL){
$z = strpos ($e, ") ENGINE");
}
// echo "<br>position".$z;
$x = strlen($e);
$y = substr($e, 0, $z - 1);
//echo "<br>".$y;
$y = str_replace (array("CONSTRAINT"), array("ADD CONSTRAINT"), $y);
$data='';
$data .= "";
$data .= "--\r\n";
$data .= "-- Constraints der Tabelle `$tabelle1`\r\n";
$data .= "--\r\n";
$y=" ".$y;
$ali = str_replace (array(","), array(",\r"), $y);
$data .= "ALTER TABLE `$tabelle1`\r\n";
$data .= "$ali;\r\n\n";
$fd = fopen($file_name,"a+");
fwrite($fd, $data);
fclose($fd);
}
}
}
*/
$groesse = filesize($file_name) / 1024;
#############################
## Datei packen
#############################
#clearstatcache();
$filename = $file_name.".gz";
$zp = gzopen($filename, "w9");
$filecontent = file($file_name);
for ($i=0;$i<count($filecontent);$i++) {
gzwrite($zp,$filecontent[$i]);
}
gzclose($zp);
#############################
## Datei packen Ende
#############################
echo __LINE__."<br>";
echo $file_name."<br>";
echo $filename."<br>";
echo "<td align=\"right\">".number_format($groesse,2)." KB</td></tr>";
echo "</table><br>";
echo "Das DB - Backup wurde erfolgreich durchgef&uuml;hrt.<p>";
//--KONFIGURATION FTP SICHERUNG--------------------------------------------
require("../config/ftpanbindung.php"); // f&uuml;gt die Datenbankanbindung ein
// $Verzeichnis = "/SYS/php/includes/kurs/backup/";
// $Verzeichnis = "C:/Program Files/xampp/htdocs/leitgedanken/backup/dump/save";
$Verzeichnis = "./html/leitgedanken/backup/dump/save";
$destination_file = basename($filename);
//-------------------------------------------------------------------------
$VerbindungsID = ftp_connect($FTPServer);
$LoginErgebnis = ftp_login($VerbindungsID, $FTPUser, $FTPPasswort);
if($VerbindungsID && $LoginErgebnis)
{
echo "Verbunden mit FTP-Server '$FTPServer' als Benutzer '$FTPUser'<p>";
// Upload der Datei
//$upload = ftp_put($VerbindungsID, "$filename", "$filename", FTP_BINARY);
$upload1 = @ftp_chdir($VerbindungsID, $Verzeichnis);
echo"ftp_put($VerbindungsID, '$destination_file', '$filename', FTP_BINARY);<br>";
$upload =ftp_put($VerbindungsID, "$destination_file", "$filename", FTP_BINARY);
// Upload-Status &uuml;berpr&uuml;fen
if (!$upload) {
echo "Ftp upload war fehlerhaft!<br>";
} else {
echo "Datei $destination_file auf $FTPServer als $destination_file geschrieben<br>";
}
$Dateiliste=ftp_nlist($VerbindungsID, '');
sort($Dateiliste);
echo "Anzahl Dateiliste: ".count($Dateiliste)."<br>";
for($i=0; $i<count($Dateiliste); $i++)
{
$Dateigroesse=ftp_size($VerbindungsID, $Dateiliste[$i]);
echo"<tr>";
if($Dateigroesse=="-1")
{
// Ordner sollen nicht gelöscht werden!
}
else
{
$Dateien++;
$Verzeichnisgroesse+=$Dateigroesse;
$dateizeit = ftp_mdtm($VerbindungsID, $Dateiliste[$i]);
$zeit = 60*60*24*$frist;
if(time() - $dateizeit > $zeit)
{
//echo $Dateiliste[$i];
//echo "Dateien, die älter sind als $frist Tag(e) wurden gelöscht";
if(ftp_delete($VerbindungsID, $Dateiliste[$i]))
{
echo"$Dateiliste[$i] gelöscht!<br>";
}else{
echo"$Dateiliste[$i] konnte nicht gelöscht werden!<br>";
}
}else{
echo "$Dateiliste[$i] nicht innerhalb der Löschfrist von $frist Tag(e)<br>";
}
}
echo"</tr>";
}
}
else
{
echo"Es konnte keine Verbindung mit dem FTP-Server hergestellt werden.";
}
$Verzeichnis2 = "/segment.ali/";
$destination_file = basename($filename);
//-------------------------------------------------------------------------
$VerbindungsID = ftp_connect($FTPServer2);
$LoginErgebnis = ftp_login($VerbindungsID, $FTPUser2, $FTPPasswort2);
if($VerbindungsID && $LoginErgebnis)
{
echo "Verbunden mit FTP-Server '$FTPServer2' als Benutzer '$FTPUser2'<p>";
// Upload der Datei
//$upload = ftp_put($VerbindungsID, "$filename", "$filename", FTP_BINARY);
$upload1 = @ftp_chdir($VerbindungsID, $Verzeichnis2);
$upload =ftp_put($VerbindungsID, "$destination_file", "$filename", FTP_BINARY);
// Upload-Status &uuml;berpr&uuml;fen
if (!$upload) {
echo "Ftp upload war fehlerhaft!<br>";
} else {
echo "Datei $destination_file auf $FTPServer als $destination_file geschrieben<br>";
}
$Dateiliste=ftp_nlist($VerbindungsID, '');
sort($Dateiliste);
echo "Anzahl Dateiliste: ".count($Dateiliste)."<br>";
for($i=0; $i<count($Dateiliste); $i++)
{
$Dateigroesse=ftp_size($VerbindungsID, $Dateiliste[$i]);
echo"<tr>";
if($Dateigroesse=="-1")
{
// Ordner sollen nicht gelöscht werden!
}
else
{
$Dateien++;
$Verzeichnisgroesse+=$Dateigroesse;
$dateizeit = ftp_mdtm($VerbindungsID, $Dateiliste[$i]);
$zeit = 60*60*24*$frist;
if(time() - $dateizeit > $zeit)
{
//echo $Dateiliste[$i];
//echo "Dateien, die älter sind als $frist Tag(e) wurden gelöscht";
if(ftp_delete($VerbindungsID, $Dateiliste[$i]))
{
echo"$Dateiliste[$i] gelöscht!<br>";
}else{
#echo"$Dateiliste[$i] konnte nicht gelöscht werden!<br>";
}
}else{
echo "$Dateiliste[$i] nicht innerhalb der Löschfrist von $frist Tag(e)<br>";
}
}
echo"</tr>";
}
}
else
{
echo"Es konnte keine Verbindung mit dem FTP-Server hergestellt werden.";
}
$Verzeichnis3 = "/Leitgedanken/backup/";
$destination_file = basename($filename);
//-------------------------------------------------------------------------
$VerbindungsID = ftp_connect($FTPServer3);
$LoginErgebnis = ftp_login($VerbindungsID, $FTPUser3, $FTPPasswort3);
if($VerbindungsID && $LoginErgebnis)
{
echo "Verbunden mit FTP-Server '$FTPServer3' als Benutzer '$FTPUser3'<p>";
// Upload der Datei
//$upload = ftp_put($VerbindungsID, "$filename", "$filename", FTP_BINARY);
$upload1 = @ftp_chdir($VerbindungsID, $Verzeichnis3);
$upload =ftp_put($VerbindungsID, "$destination_file", "$filename", FTP_BINARY);
// Upload-Status &uuml;berpr&uuml;fen
if (!$upload) {
echo "Ftp upload war fehlerhaft!<br>";
} else {
echo "Datei $destination_file auf $FTPServer als $destination_file geschrieben<br>";
}
$Dateiliste=ftp_nlist($VerbindungsID, '');
sort($Dateiliste);
echo "Anzahl Dateiliste: ".count($Dateiliste)."<br>";
for($i=0; $i<count($Dateiliste); $i++)
{
$Dateigroesse=ftp_size($VerbindungsID, $Dateiliste[$i]);
echo"<tr>";
if($Dateigroesse=="-1")
{
// Ordner sollen nicht gelöscht werden!
}
else
{
$Dateien++;
$Verzeichnisgroesse+=$Dateigroesse;
$dateizeit = ftp_mdtm($VerbindungsID, $Dateiliste[$i]);
$zeit = 60*60*24*$frist;
if(time() - $dateizeit > $zeit)
{
//echo $Dateiliste[$i];
//echo "Dateien, die älter sind als $frist Tag(e) wurden gelöscht";
if(ftp_delete($VerbindungsID, $Dateiliste[$i]))
{
echo"$Dateiliste[$i] gelöscht!<br>";
}else{
#echo"$Dateiliste[$i] konnte nicht gelöscht werden!<br>";
}
}else{
echo "$Dateiliste[$i] nicht innerhalb der Löschfrist von $frist Tag(e)<br>";
}
}
echo"</tr>";
}
}
else
{
echo"Es konnte keine Verbindung mit dem FTP-Server hergestellt werden.";
}
//Temporärdatei löschen *.sql
if(@unlink($file_name)){
NULL;
}else{
echo "Die Temorärdatei $file_name konnte nicht gelöscht werden!<br>";
}
//Temporärdatei löschen *.sql.gz
if(@unlink($filename)){
NULL;
}else{
echo "Die Temorärdatei $filename konnte nicht gelöscht werden!<br>";
}
// Schließen des FTP-Streams
ftp_quit($VerbindungsID);
echo "<p>FTP-Verbindung beendet";
//---------------------------------------------------------
?>