1. #1
    Avatar von Snees
    Registriert seit
    18.11.2011
    Beiträge
    1.001
    Thanked 592 Times in 319 Posts

    Standard MySQL Datenbank Backup erstellen

    Mit dieser einfachen Klasse ist es möglich Backups mehrerer Datenbanken zu erstellen. Die Backups werden in Ordnern gespeichert, Beispiel:

    /Datenbank/Jahr/Monat/Tag/Stunde_Minute_Sekunde.sql.gz
    /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','email@test.com');
    ?>
    LG, Snees.
    Geändert von Snees (19.04.2013 um 18:00 Uhr)

  2. #2

    Registriert seit
    10.06.2012
    Beiträge
    55
    Thanked 23 Times in 12 Posts

    Standard AW: MySQL Datenbank Backup erstellen

    Ich finde es gut, dass du es versucht hast. Allerdings finde ich deine Klasse mehr als schlecht:

    1. Man sollte niemals mit der Methode exec Arbeiten wenn es anders funktioniert, dadurch entstehen oft große Sicherheitslücken. (mal abgesehen das aus diesem Grund fast immer exec deaktiviert ist)
    2. Nicht auf jedem Server ist gzip installiert, kann mit "if(!extension_loaded("zlib"))" geprüft werden und dann auch ohne exec gelöst werden.
    3. Für das MySQL Backup braucht man auch kein exec, dazu kann ebenfalls eine Methode verwendet werden.

    Machs nochmal, aber dann anständig.

  3. The Following 3 Users Say Thank You to xtp57 For This Useful Post:

    DnL (19.04.2013), Sky.NET (19.04.2013), ThunderStorm (19.04.2013)

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 08.09.2013, 18:40
  2. PHP MYSQL Datenbank Klasse statisch
    Von Minecraft im Forum PHP
    Antworten: 1
    Letzter Beitrag: 11.01.2013, 09:58
  3. [MySQL] Größere Datenbank importieren?
    Von xTracZ im Forum Hosting
    Antworten: 20
    Letzter Beitrag: 13.02.2012, 23:18
  4. [Suche] Forum Script ohne MySQL Datenbank
    Von uncopyable im Forum Web-Applications
    Antworten: 3
    Letzter Beitrag: 18.12.2011, 17:35
Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.