PHP-Einfach.de
  • PHP Tutorial
  • MySQL Tutorial
  • Für Fortgeschrittene
  • Webhosting
  • Forum

Datenbankbackup per PHP

10. Februar 2020
  1. Home
  2. »
  3. Für Fortgeschrittene
  4. »
  5. PHP Sicherheit
  6. »
  7. Daten sicher speichern
  8. »
  9. 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

  • 1 Datenbank-Backup mittels mysqldump
  • 2 Datenbankbackup mittels PHP
  • 3 Import eines Datenbankbackups
  • 4 Datenbankbackup per E-Mail versenden
  • 5 Abschließende Empfehlungen

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
Zurück: Daten sicher speichern
Weiter: Wieso man MD5/SHA1 nicht für das Speichern von Passwörtern verwenden sollte

Für Fortgeschrittene

  • Objektorientierte Programmierung
  • PHP Sicherheit
    • Authentifizierung in PHP
    • Code Injection
    • Cross-Site-Request-Forgery (CSRF)
    • Cross-Site-Scripting (XSS) in PHP
    • Daten sicher speichern
      • Datenbankbackup per PHP
      • Wieso man MD5/SHA1 nicht für das Speichern von Passwörtern verwenden sollte
      • Passwörter sicher speichern
    • Daten validieren
    • Penetrationtesting für PHP
    • SQL-Injections
  • Script-Beispiele
  • Codeschnipsel
  • Stellenmarkt
Mit freundlicher Unterstützung von:
  • Punkt191 Werbeagentur

Hoster – Geringste Ausfallzeit

  1. netcup Ø 0 Min.
  2. webgo Ø 0 Min.
  3. Linevast Ø 3 Min.
  4. All-Inkl.com Ø 3 Min.
  5. checkdomain Ø 4 Min.
  6. dogado Ø 6 Min.
  7. Strato Ø 8 Min.
  8. manitu Ø 10 Min.
  9. 1&1 Ø 10 Min.
  10. DomainFactory Ø 14 Min.
» Mehr erfahren

Impressum | Datenschutz | Auf PHP-Einfach.de werben

© PHP-Einfach.de 2003 - 2025

Cookie-Zustimmung verwalten
Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wenn du diesen Technologien zustimmst, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn du deine Zustimmung nicht erteilst oder zurückziehst, können bestimmte Merkmale und Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Anbieter verwalten Lese mehr über diese Zwecke
Einstellungen ansehen
{title} {title} {title}