DnL (19.04.2013), Sky.NET (19.04.2013), ThunderStorm (19.04.2013)
-
19.04.2013, 17:37 #1
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
- 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','email@test.com');
?>Geändert von Snees (19.04.2013 um 18:00 Uhr)
-
19.04.2013, 18:34 #2
- Registriert seit
- 10.06.2012
- Beiträge
- 55
Thanked 23 Times in 12 PostsAW: 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.
-
The Following 3 Users Say Thank You to xtp57 For This Useful Post:
Ähnliche Themen
-
[MySQL | PHP] Etwas aus der Datenbank ausgeben?
Von ZarneXxX im Forum PHPAntworten: 1Letzter Beitrag: 08.09.2013, 18:40 -
PHP MYSQL Datenbank Klasse statisch
Von Minecraft im Forum PHPAntworten: 1Letzter Beitrag: 11.01.2013, 09:58 -
[MySQL] Größere Datenbank importieren?
Von xTracZ im Forum HostingAntworten: 20Letzter Beitrag: 13.02.2012, 23:18 -
[Suche] Forum Script ohne MySQL Datenbank
Von uncopyable im Forum Web-ApplicationsAntworten: 3Letzter Beitrag: 18.12.2011, 17:35
Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.