MySQL Datenbank Backup erstellen

04/19/2013 17:40 Snees#1
Mit dieser einfachen Klasse ist es möglich Backups mehrerer Datenbanken zu erstellen. Die Backups werden in Ordnern gespeichert, Beispiel:

Quote:
/Datenbank/Jahr/Monat/Tag/Stunde_Minute_Sekunde.sql.gz
Quote:
/testdb/2013/04/19/12_15_00.sql.gz
Ablauf
  • 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 $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);
    }
}
?>
Aufruf der Klasse:
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','[Only registered and activated users can see links. Click Here To Register...]');
?>
LG, Snees.
04/23/2013 11:13 マルコ#2
Traurig, dass exec genau immer dann verboten ist, wenn man selbst auch keinen Zugriff auf die das Terminal hat.
Wobei ich exec auf meinen eigenen Servern ja auch schon disable...
Weil dann empfehle ich eher einen 2. Server mit MariaDB, der als Slave agiert. Oder ein Backup mit Tartarus des MySQL DB Directories.

Du solltest dir lieber eine Lösung überlegen, die rein auf SQL (am besten standardisiertem SQL) basiert. Evtl mit PDO und Auswahl, was für eine DB Software genutzt wird.