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
  • DGUV V3
  • DGUV 3
  • CasinoAndy Finland
  • Casinopilot24.com
  • Neueonline-Casinos.com
  • CasinoHEX.at
  • Decasinos.de
  • Privatkredit247.com
  • Online Casino Spielautomaten
  • Casinofrog.com
  • parhaatuudetkasinot.com

Hoster – Geringste Ausfallzeit

  1. webgo Ø 0 Min.
  2. Linevast Ø 3 Min.
  3. netcup Ø 3 Min.
  4. dogado Ø 6 Min.
  5. Mittwald Ø 9 Min.
  6. All-Inkl.com Ø 10 Min.
  7. manitu Ø 10 Min.
  8. bplaced Ø 11 Min.
  9. checkdomain Ø 11 Min.
  10. Host Europe Ø 14 Min.
» Mehr erfahren

Impressum | Datenschutz | Auf PHP-Einfach.de werben

© PHP-Einfach.de 2003 - 2022

Um dich beim Lernen von PHP und MySQL zu unterstützen verwenden wir Cookies. OK Weitere Infos
Privacy & Cookies Policy

Privacy Overview

This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
Notwendige
immer aktiv

Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.

Nicht notwendige

Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.