Backup mehrerer MySQL DBs in ein ZIP Archiv auf all-inkl.com Servern

Da ich alle Webseiten bei all-inkl.com hoste und täglich ein MySQL Backup erzeuge, dies aber natürlich nicht manuell machen will, habe ich mir mal ein Script geschrieben welches alle Datenbanken für mich sichert und in ein großes ZIP-Archiv packt. Das ganze Script kann man dann täglich via Cronjob laufen lassen und das ZIP-Archiv versenden oder auf anderen Servern speichern oder ähnliches.

Wichtig: Damit all-inkl.com den exec() Befehl erlaubt, muss die PHP-Datei .phpx als Endung besitzen!

Folgende Schritte laufen beim Backup ab:

  1. Backup der einzelnen Datenbanken als .sql Datei
  2. Packen jeder einzelnen .sql Datei mit GZIP, das verkleinert die Textdatei enorm!
  3. Erstellen eines ZIP-Archivs und hinzufügen aller GZIP Dateien, somit habe ich nur noch eine einzige Backupdatei und spare nochmal etwas Platz.
  4. Löschen der jetzt überflüssigen GZIP Dateien
  5. Generieren eines Downloadlinks für die ZIP-Datei

Damit habe ich eine einzige Datei mit allen Datenbanken erstellt und kann diese nun beliebig weiter nutzen, entweder nur auf dem Webspace liegen lassen, herunterladen, per FTP und PHP automatisch auf einen anderen Server übertragen, per E-Mail versenden oder sonst irgendetwas sinnvolles damit tun ;).

Hinweis: PHP muss die ZIP-Erweiterung installiert haben, außerdem muss exec() erlaubt sein. Dies ist bei all-inkl.com standardmäßig der Fall, bei anderen Hostern evtl. aber nicht! Das Script ist in einigen Punkten sehr auf all-inkl.com zugeschnitten, kann aber sicherlich für andere Hoster angepasst werden.

<!--?php // Backupordener (Pfad ab Webserver Root) $backupfolder = "/mysql_backup/"; // Datenbanken die gesichert werden sollen (DB-User =&gt; DB-Passwort)
// Der DB-Name ist bei all-inkl.com gleich dem DB-User!
$dbs = array('db1' =&gt; 'pw1',
	'db2' =&gt; 'pw2',
	'...' =&gt; '...');
 
// Einzelbackup der Datenbanken als GZIP
$dateien = array();
foreach ($dbs as $db =&gt; $pw) {
	$sql_file = "dump_".$db."_".date('YmdHis').".sql";
	exec("mysqldump -u ".$db." -p".$pw." --allow-keywords --add-drop-table --complete-insert --quote-names ".$db." &gt; ".$sql_file);
	exec("gzip ".$sql_file);
	$dateien[] = $sql_file.".gz";
	echo 'created backup file: '.$sql_file.'.gz&lt;br&gt;';
}
echo '&lt;br&gt;';
 
// Alle Backups in ein ZIP Archiv packen
$masterfile = "master_".date('YmdHis').".zip";
$zip = new ZipArchive();
if ($zip-&gt;open($masterfile, ZIPARCHIVE::CREATE) !== TRUE) {
	echo "&lt;b&gt;cannot open ".$masterfile."&lt;/b&gt;";
} else {
	foreach ($dateien as $datei) {
		$zip-&gt;addFile($_SERVER['DOCUMENT_ROOT'].$backupfolder.$datei, $datei);
		echo "added ".$datei." to zip file.&lt;br&gt;";
	}
	echo '&lt;br&gt;';
	$zip-&gt;close();
}
 
// GZIP Dateien loeschen
foreach ($dateien as $datei) {
	unlink($_SERVER['DOCUMENT_ROOT'].$backupfolder.$datei);
	echo 'file deleted: '.$datei.'&lt;br&gt;';
}
 
// Downloadlink erzeugen und anzeigen
$link = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
$link = str_replace(basename(__FILE__), $masterfile, $link);
echo "&lt;br&gt;&lt;br&gt;Downloadlink: ".$masterfile."";
?-->

(Bild von Tony Austin)

3 Gedanken zu „Backup mehrerer MySQL DBs in ein ZIP Archiv auf all-inkl.com Servern

  • 11. März 2010 um 17:03
    Permalink

    Hmm also wenn du Systemzugriff hast, warum nutzt du dann nicht einfach ein simples Shellscript? :)

    Antworten
  • 11. März 2010 um 17:15
    Permalink

    Weil ich keinen Systemzugriff habe ;)
    Lediglich gzip und mysqldump sind erlaubt

    Antworten
  • 31. Mai 2012 um 19:46
    Permalink

    Danke für den Tipp. Das probiere ich doch gleich mal aus.

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Durch die weitere Nutzung der Seite stimmst du der Verwendung von Cookies zu. Weitere Informationen zum Datenschutz...

Die Cookie-Einstellungen auf dieser Website sind auf "Cookies zulassen" eingestellt, um das beste Surferlebnis zu ermöglichen. Wenn du diese Website ohne Änderung der Cookie-Einstellungen verwendest oder auf "Akzeptieren" klickst, erklärst du sich damit einverstanden.

Schließen