Datenbankbackup per PHP
Um Datenverlust zu vermeiden, beispielsweise durch einen Festplattenfehler oder durch einen Angreifer, solltet ihr ein regelmäßig Backup erstellen und sicher verwahren. Oftmals, aber nicht immer, nimmt euer Webhoster ein regelmäßiges Backup vor. Auf diese Lösung sollte man sich aber nicht verlassen, da das Backup nur selten garantiert wird. Ebenfalls berechnen manche Webhoster hohe Gebühren um euch Zugriff auf das Backup zu gewähren.
Inhaltsverzeichnis
Datenbank-Backup mittels mysqldump
Mittels dem Tool mysqldump, welches bei vielen Server zur Verfügung steht, lässt sich sehr bequem ein Datenbankbackup erstellen:
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php $dbhost = 'localhost'; $dbuser = 'username'; $dbpassword = 'password'; $dbname = 'datenbankname'; $dumpfile = "backups/" . $dbname . "_" . date("Y-m-d_H-i-s") . ".sql"; echo "Start dump\n"; exec("mysqldump --user=$dbuser --password=$dbpassword --host=$dbhost $dbname > $dumpfile"); echo "-- Dump completed -- "; echo $dumpfile; |
Dieses kleine Script erstellt euch eine sql-Datei im Ordner Backups. Falls ihr die Datei gleich mittels gzip komprimieren wollt, könnt ihr folgendes Script nutzen. Dieses schreibt euch eine gzip-Komprimierten Dump eurer Datenbank in das backups-Verzeichnis.
1 2 3 4 5 6 7 8 9 10 11 |
<?php $dbhost = 'localhost'; $dbuser = 'username'; $dbpassword = 'password'; $dbname = 'datenbankname'; $dumpfile = 'backups/' . $dbname . '_' . date("Y-m-d_H-i-s") . '.sql.gz'; echo "Start dump\n"; passthru("mysqldump --user=$dbuser --password=$dbpassword --host=$dbhost $dbname | gzip -c > $dumpfile"); echo "-- Dump completed -- "; echo $dumpfile; |
Damit diese Scripts funktionieren, muss exec bzw. passthru bei euch auf dem Server aktiviert sein. Gegebenenfalls müsst ihr den Pfad zu mysqldump anpassen, beispielsweise zu /usr/bin/mysqldump. Ob und wie ihr mysqldump nutzen könnt erfahrt ihr von eurem Webhoster.
Datenbankbackup mittels PHP
Steht kein mysqldump zur Verfügung, so könnt ihr mittels mysqldump-php eine ähnliche Funktionalität erreichen. Ladet dazu zuerst den Source-Code von Version 2 oder neuer herunter und entpackt das Zip-Archiv. Ihr benötigt dann das Script /src/Ifsnop/Mysqldump/Mysqldump.php.
Zum Backup der Datenbank könnt ihr folgenden Script verwenden:
1 2 3 4 5 6 7 8 9 10 |
<?php $dbhost = 'localhost'; $dbuser = 'username'; $dbpassword = 'password'; $dbname = 'datenbankname'; $dumpfile = 'backups/' . $dbname . '_' . date("Y-m-d_H-i-s") . '.sql'; include_once('euer/pfad/zu/Mysqldump.php'); $dump = new Ifsnop\Mysqldump\Mysqldump("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpassword); $dump->start($dumpfile); |
Import eines Datenbankbackups
Das Backup der Datenbank könnt ihr am einfachsten mittels phpMyAdmin -> Importieren wieder importieren. Bei sehr großen Backups mit Millionen von Einträgen stößt phpMyAdmin an seine Grenzen. Dort ist ein Import über die Konsole zu empfehlen. Ruft dazu folgenden Befehl auf:
Windows (mit XAMPP):
1 |
d:\XAMPP\mysql\bin\mysql.exe -u root -p DATENBANKNAME < SQLDATEI.sql |
Linux:
1 |
mysql -u root -p DATENBANKNAME < SQLDATEI.sql |
Datenbankbackup per E-Mail versenden
Aktuell wird das Backup noch im backups-Ordner abgespeichert. Sollte wirklich ein entsprechender Ernstfall passieren und die Festplatte beschädigt sein, dann bringt euch ein Backup dort herzlich wenig. Deswegen solltet das Backup stets auf einem anderen Server/Rechner abgespeichert werden. Entweder ihr ladet es regelmäßig herunter und speichert es z.B. auf eurem lokalen Rechner, oder ihr lasst das oben erstelle Backup direkt per E-Mail an euch senden (solange euer Backup nicht zu groß wird):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
<?php /* * Euer Backupscript der das Backup in den Pfad $dumpfile schreibt */ function mail_att($to, $from, $subject, $message, $file) { // $to Empfänger // $from Absender ("[email protected]" oder "Name <[email protected]>") // $subject Betreff // $message Inhalt der Email // $file Pfad zur Datei die versendet werden soll $mime_boundary = "-----=" . md5(uniqid(rand(), 1)); $header = "From: ".$from."\r\n"; $header.= "MIME-Version: 1.0\r\n"; $header.= "Content-Type: multipart/mixed;\r\n"; $header.= " boundary=\"".$mime_boundary."\"\r\n"; $content = "This is a multi-part message in MIME format.\r\n\r\n"; $content.= "--".$mime_boundary."\r\n"; $content.= "Content-Type: text/plain charset=\"iso-8859-1\"\r\n"; $content.= "Content-Transfer-Encoding: 7bit\r\n\r\n"; $content.= $message."\r\n"; //Datei anhaengen $name = basename($file); $data = chunk_split(base64_encode(file_get_contents($file))); $len = filesize($file); $content.= "--".$mime_boundary."\r\n"; $content.= "Content-Disposition: attachment;\r\n"; $content.= "\tfilename=\"$name\";\r\n"; $content.= "Content-Length: .$len;\r\n"; $content.= "Content-Type: application/x-gzip; name=\"".$file."\"\r\n"; $content.= "Content-Transfer-Encoding: base64\r\n\r\n"; $content.= $data."\r\n"; return mail($to, $subject, $content, $header); } mail_att("[email protected]", "[email protected]", "Backup ".$dumbfile, "Backup wurde erfolgreich erstellt und befindet sich im Anhang", $dumbfile); |
Abschließende Empfehlungen
Ich empfehle euch täglich ein Backup zu erstellen und dies auf einen anderen Rechner zu speichern, beispielsweise indem ihr das per E-Mail an eure private Adresse sendet. Damit das Script täglich aufgerufen wird, könnt ihr beispielsweise bei eurem Hoster einen Cronjob einrichten.
Da das Backup eure komplette Datenbank beinhaltet und somit zumeist auch sensible Daten, solltet ihr für ausreichend Sicherheit sorgen. Im obigen Beispiel wird das Backup ins backups-Verzeichnis abgespeichert. Dieses Verzeichnis sollte natürlich nicht von beliebigen Personen aufrufbar sein. Idealerweise habt ihr in dem Verzeichnis eine .htaccess-Datei die den Inhalt Deny from all beinhaltet. Dadurch wird jeder Aufruf auf das Verzeichnis blockiert.
Ihr solltet regelmäßig überprüfen, dass euer Datenbankbackup auch wieder importiert werden kann. mysqldump und auch die obigen Scripte scheitern gerne bei größeren Datenbanken, da die Ausführungszeit des PHP-Scripts zu lang ist. Ihr erhaltet in dem Fall keine vollständige Sicherung eurer Datenbank, sondern nur eine Teilsicherung. Nur das regelmäßige Überprüfen dass eure Backupstrategie noch funktioniert schützt euch dagegen.
Autor: Nils Reimers