Quote:
/Datenbank/Jahr/Monat/Tag/Stunde_Minute_Sekunde.sql.gz
AblaufQuote:
/testdb/2013/04/19/12_15_00.sql.gz
- es wird überprüft, ob ein Ordner mit dem Namen der Datenbank existiert, falls das nicht der Fall ist, wird der Ordner erstellt
- es wird überprüft, ob ein Ordner mit dem aktuellen Jahr existiert, falls das nicht der Fall ist, wird der Ordner erstellt
- es wird überprüft, ob ein Ordner mit dem aktuellen Monat existiert, falls das nicht der Fall ist, wird der Ordner erstellt
- es wird überprüft, ob ein Ordner mit dem aktuellen Tag existiert, falls das nicht der Fall ist, wird der Ordner erstellt
für jede Datenbank wird
- ein Backup erstellt
- das Backup mit gzip komprimiert
- überprüft ob die Datei vorhanden ist
- falls das nicht der Fall ist, eine Error-Mail versendet
Die Klasse (sicherung.class.php)
PHP Code:
<?php
/*
* Autor: Snees @ http://coding-net.de
* Datum: 19.04.2013
*/
class Sicherung{
private $host; //MySQL-Host
private $benutzer; //MySQL-Benutzername
private $passwort; //MySQL-Passwort
private $datenbankArray = array(); //MySQL-Datenbank-Array
private $pfad; //Pfad zu dem Sicherungsordner auf dem Server
private $email; //Absender und Empfänger für die Error-Mails
private $jahr; //das aktuelle Jahr
private $monat; //der aktuelle Monat
private $tag; //der aktuelle Tag
private $zeit; //Kombination aus Jahr, Monat und Tag, wird für den Dateinamen benötigt
private $dateiname; //Dateiname der MySQL-Sicherung
//Konstruktor
public function __construct($mysqlArray,$datenbankArray,$serverPfad,$email){
//Variablen die Werte aus dem Konstruktor zuweisen
$this->host = $mysqlArray['host'];
$this->benutzer = $mysqlArray['benutzer'];
$this->passwort = $mysqlArray['passwort'];
$this->datenbankArray = $datenbankArray;
$this->pfad = $serverPfad;
$this->email = $email;
//Das aktuelle Datum festlegen
$this->jahr = date('Y');
$this->monat = date('m');
$this->tag = date('d');
$this->zeit = date('H').'_'.date('i').'_'.date('s');
//den Dateinamen zusammensetzen
$this->dateiname = $this->jahr . '/' . $this->monat . '/' . $this->tag . '/' . $this->zeit. '.sql';
$this->erstelleOrdner();
}
public function __destruct(){
}
//diese Funktion erstellt die entsprechenden Ordner, falls diese noch nicht existieren
//und vergibt die Rechte
private function erstelleOrdner(){
$count = count($this->datenbankArray);
for($i = 0 ; $i < $count ; ++$i){
//überprüfe den Ordner für die Datenbank
if(!is_dir($this->datenbankArray[$i])){
mkdir($this->datenbankArray[$i]);
chmod($this->datenbankArray[$i],0777);
}
//überprüfe den Ordner für das aktuelle Jahr
if(!is_dir($this->datenbankArray[$i] . '/' . $this->jahr)){
mkdir($this->datenbankArray[$i] . '/' . $this->jahr);
chmod($this->datenbankArray[$i] . '/' . $this->jahr,0777);
}
//überprüfe den Ordner für den aktuellen Monat
if(!is_dir($this->datenbankArray[$i] . '/' . $this->jahr . '/' . $this->monat)){
mkdir($this->datenbankArray[$i] . '/' . $this->jahr . '/' . $this->monat);
chmod($this->datenbankArray[$i] . '/' . $this->jahr . '/' . $this->monat,0777);
}
//überprüfe den Ordner für den aktuellen Tag
if(!is_dir($this->datenbankArray[$i] . '/' . $this->jahr . '/' . $this->monat . '/' . $this->tag)){
mkdir($this->datenbankArray[$i] . '/' . $this->jahr . '/' . $this->monat . '/' . $this->tag);
chmod($this->datenbankArray[$i] . '/' . $this->jahr . '/' . $this->monat . '/' . $this->tag,0777);
}
$this->erstelleDump($this->datenbankArray[$i]);
}
}
//diese Funktion erstellt einen Dump der angegebenen Datenbank
private function erstelleDump($datenbank){
exec('mysqldump --user=' . $this->benutzer . ' --password=' . $this->passwort . ' --host=' . $this->host . ' ' . $datenbank . ' > ' . $this->pfad . '/' . $datenbank . '/' . $this->dateiname);
$this->komprimiereDump($datenbank);
}
//diese Funktion komprimiert den Dump der angegebenen Datenbank
private function komprimiereDump($datenbank){
exec('gzip ' . $this->pfad . '/' . $datenbank . '/' . $this->dateiname);
$this->pruefeDump($datenbank);
}
//diese Funktion prüft, ob der komprimierte Dump vorhanden ist
private function pruefeDump($datenbank){
if(!file_exists($datenbank . '/' . $this->dateiname . '.gz')){
//sollte das nicht der Fall sein, wird eine Error-Mail versendet
$this->sendeErrorMail($datenbank);
}
}
//diese Funktion versendet eine Error-Mail, falls der komprimierte Dump der angegebenen Datenbank nicht vorhanden ist
private function sendeErrorMail($datenbank){
$header = 'From: '. $this->email . "\r\n" . 'Reply-To: ' . $this->email . "\r\n" . 'X-Mailer: PHP/' . phpversion();
mail($this->email,'Sicherung fehlgeschlagen','Die Sicherung ist fehlgeschlagen,'."\n\n".'Zeit: '.str_replace('_', ':', $this->zeit) . "\n\n Datenbank: " . $datenbank,$header);
}
}
?>
PHP Code:
<?php
include('sicherung.class.php');
$mysqlArray = array(
'host' => 'localhost', //MySQL-Host
'benutzer' => 'user', //MySQL-Benutzer
'passwort' => 'password' //MySQL-Passwort
);
$datenbankArray = array('datenbank1','datenbank2','datenbank3');
$sicherung = new Sicherung($mysqlArray,$datenbankArray,'/var/www/sicherung','');
?>