Zwei simple Backup-Skripte für deine MySQL-Datenbanken

Ich war kürzlich am Überlegen, wie ich meine regelmäßigen MySQL-Backups besser automatisieren kann. Bisher habe ich es so gehandhabt, dass ich über Adminer meine Sicherungen manuell erstellt habe. Allerdings geht mir das mittlerweile auf den Keks. Jedes Mal muss ich mich erst anmelden, dann auf Export klicken und den Dump herunterladen. Das ist auf Dauer nervig — vor allem, wenn du mehrere Datenbanken hast. Daher dachte ich mir, mit einigen PHP-Skripten sollte das doch auch mit einem Klick funktionieren. Gesagt getan. Meine Anforderungen sind recht bescheiden.

MySQL-Dump mit Adminer exportieren
MySQL-Dump mit Adminer exportieren

Sicherung einer MySQL-Datenbank via PHP-Skript

Das erste Skript fordert nur eine Datenbank-Sicherung an und stellt mir den Dump als Download bereit. Nach dem Herunterladen soll das Backup aus Sicherheitsgründen vom Webserver verschwinden. Dabei spielt es keine Rolle, ob der Download erfolgreich war oder fehlgeschlagen ist.

<?php
/**
* MySQL Backup Script - Single Database
* Copyright (c) 2015 GFX-Stylez.blog
* Creative Commons Attribution, Share-Alike.
*
*/
	$date = date('ymd');
	// Zugangsdaten
	$sql_user = "USERNAME";
	$sql_pwd = "PASSWORD";
	$sql_file = $sql_user . "-" . $date . ".sql";
	// MySQL-Dumps erzeugen und komprimieren
	exec("mysqldump -u $sql_user -p'$sql_pwd' --allow-keywords --add-drop-table --complete-insert --quote-names $sql_user > $sql_file");
	exec("gzip $sql_file");
	$file = $sql_file . ".gz";
	// Archiv zum Download bereitstellen
	header('Content-type: application/x-tar');
	header('Content-Disposition: inline; filename="' . $file . '"');
	header('Content-Transfer-Encoding: binary');
	header('Accept-Ranges: bytes');
	header('Content-Length: '.filesize($file));
	ob_clean();
	flush();
	ignore_user_abort(true);
	if (readfile($file)){
		unlink($file);
	}
?>

Mehrere MySQL-Datenbanken mit einem Skript sichern

Das zweite Skript erzeugt von all meinen MySQL-Datenbanken jeweils eine Sicherung. Diese werden anschließend in ein gemeinsames Archiv gepackt und mir als Download angeboten. Für den Download gelten dieselben Regeln wie beim ersten Skript. Zusätzlich möchte ich die Dumps noch auf dem Webserver in einem Ordner, welcher nur via FTP zugänglich ist, vorhalten.

<?php
/**
* MySQL Backup Script - Multi Database
* Copyright (c) 2015 GFX-Stylez.blog
* Creative Commons Attribution, Share-Alike.
*
*/
	$date = date('ymd');
	// Zugangsdaten
	$sql1_user = "USERNAME1";
	$sql1_pwd = "PASSWORD1";
	$sql1_file = $sql1_user . "-" . $date . ".sql";
	$sql2_user = "USERNAME2";
	$sql2_pwd = "PASSWORD2";
	$sql2_file = $sql2_user . "-" . $date . ".sql";
	// Ordner erstellen und Pfade festlegen
	mkdir("/www/htdocs/.../$date", 0755);
	$path = "/www/htdocs/.../$date";
	$sql1_path = "$path/$sql1_file";
	$sql2_path = "$path/$sql2_file";
	// MySQL-Dumps erzeugen und komprimieren
	exec("mysqldump -u $sql1_user -p'$sql1_pwd' --allow-keywords --add-drop-table --complete-insert --quote-names $sql1_user > $sql1_path");
	exec("gzip $sql2_path");
	exec("mysqldump -u $sql2_user -p'$sql2_pwd' --allow-keywords --add-drop-table --complete-insert --quote-names $sql2_user > $sql2_path");
	exec("gzip $sql2_path");
	// Dumps packen
	$file = 'mysql-'.$date.'.tar.gz';
	$phar = new PharData($file);
	$phar->buildFromDirectory($path);
	// Archiv zum Download bereitstellen
	header('Content-type: application/x-tar');
	header('Content-Disposition: inline; filename="' . $file . '"');
	header('Content-Transfer-Encoding: binary');
	header('Accept-Ranges: bytes');
	header('Content-Length: '.filesize($file));
	ob_clean();
	flush();
	ignore_user_abort(true);
	if (readfile($file)){
		unlink($file);
	}
?>

Kurze Schlussbemerkung und Haftungshinweis

Ich stelle beide Skripte hier zur freien Verfügung. Ich übernehme allerdings keinerlei Haftung für eventuelle Schäden. Du bist also allein für den Einsatz verantwortlich. Falls du Verbesserungsvorschläge hast, kannst du mir diese gern per Mail oder Kommentar mitteilen. Die Lösung ist auf meine Bedürfnisse und meinen Webserver zurechtgeschnitten, daher können Änderungen für deine Infrastruktur oder Anforderungen notwendig sein.

Du kannst den Prozess natürlich noch weiter automatisieren, indem du die Skripte als Cronjob laufen lässt. Dann bietet es sich aber an, anstelle dem Download, den Empfang per Mail vorzuziehen. Für mich reicht es halb automatisch. Ich hab auch wenig Lust ständig das Postfach mit Datenbank-Backups vollzuhaben. Jeder, wie er eben mag.


Avatar von reraiseace
Autor: Markus Werner (reraiseace) Twitterreraiseace, Google+reraiseace, Twittercb_werner
Ich bin Redaktionsvolontär bei der COMPUTER BILD in Hamburg, Fernstudent am Deutschen Journalistenkolleg und schreibe auf re{raise}ace privat über Webdesign und Programmierung. Seit 2015 schrieb ich auch regelmäßig für andere Medien.

0 Kommentare – Schreib mir deine Meinung!

Fülle bitte die nachstehenden Felder aus. Angaben mit einem Sternchen sind Pflichtangaben. Deine E-Mail-Adresse wird nicht veröffentlicht.