Über den Author / Internet / Server / MySQL Backup per PHP Script

MySQL Backup per PHP Script

~2 Min. Lesezeit

Oftmals hat man die eigenen Webseiten auf einem Hostingpaket, wo man keine root Rechte hat um die MySQL Datenbanken mit dem Befehl mysqldump zu sichern.

Dann muss man entweder den Hoster um ein Backup bitten oder greift zu anderen Möglichkeiten.
Bei folgenden Script benötigt man ein User, welcher alle Datenbanken sieht, die man Backuppen möchte:

<?php
$dbhost		= "localhost";
$dbuser 	= "username";
$dbpwd		= "password";
$dbname 	= "datenbank";
$dbbackup	= "/absoluter/pfad/zum/erstellen/vom/backup.sql";

error_reporting(0);
set_time_limit(0);

// ab hier nichts mehr ändern
$conn = mysql_connect($dbhost, $dbuser, $dbpwd) or die(mysql_error());
mysql_select_db($dbname);
$f = fopen($dbbackup, "w");

$tables = mysql_list_tables($dbname);
while ($cells = mysql_fetch_array($tables))
{
	$table = $cells[0];
	fwrite($f,"DROP TABLE `".$table."`;\n"); 
	$res = mysql_query("SHOW CREATE TABLE `".$table."`");
	if ($res)
	{
		$create = mysql_fetch_array($res);
		$create[1] .= ";";
		$line = str_replace("\n", "", $create[1]);
		fwrite($f, $line."\n");
		$data = mysql_query("SELECT * FROM `".$table."`");
		$num = mysql_num_fields($data);
		while ($row = mysql_fetch_array($data))
		{
			$line = "INSERT INTO `".$table."` VALUES(";
			for ($i=1;$i<=$num;$i++)
			{
				$line .= "'".mysql_real_escape_string($row[$i-1])."', ";
			}
			$line = substr($line,0,-2);
			fwrite($f, $line.");\n");
		}
	}
}
fclose($f);

?>

Hat man die gehighlighteten Linien angepasst, kann im Browser das PHP File aufgerufen werden und die backup.sql Datei wird erstellt, sofern der Ordner Schreibrechte hat, in dem das Backup angelegt werden sollte.

Und schon hat man ein Backup einer Datenbank per PHP realisiert.

Möchte man mehrere Datenbanken auf einen Schlag backuppen, kann dies sehr einfach gemacht werden, indem man die Sicherung in eine Funktion auslagert und mehrfach aufruft:

<?php

error_reporting(0);
set_time_limit(0);

// Hier ergänzen
db_backup("localhost", "username1", "password1", "datenbank1", "/absoluter/pfad/zum/erstellen/vom/backup1.sql") ;
db_backup("localhost", "username2", "password2", "datenbank2", "/absoluter/pfad/zum/erstellen/vom/backup2.sql");

// ab hier nichts mehr ändern
function db_backup($dbhost, $dbuser, $dbpwd, $dbname, $dbbackup)
{
	$conn = mysql_connect($dbhost, $dbuser, $dbpwd) or die(mysql_error());
	mysql_select_db($dbname);
	$f = fopen($dbbackup, "w");

	$tables = mysql_list_tables($dbname);
	while ($cells = mysql_fetch_array($tables))
	{
		$table = $cells[0];
		fwrite($f,"DROP TABLE `".$table."`;\n"); 
		$res = mysql_query("SHOW CREATE TABLE `".$table."`");
		if ($res)
		{
			$create = mysql_fetch_array($res);
			$create[1] .= ";";
			$line = str_replace("\n", "", $create[1]);
			fwrite($f, $line."\n");
			$data = mysql_query("SELECT * FROM `".$table."`");
			$num = mysql_num_fields($data);
			while ($row = mysql_fetch_array($data))
			{
				$line = "INSERT INTO `".$table."` VALUES(";
				for ($i=1;$i<=$num;$i++)
				{
					$line .= "'".mysql_real_escape_string($row[$i-1])."', ";
				}
				$line = substr($line,0,-2);
				fwrite($f, $line.");\n");
			}
		}
	}
	fclose($f);
}
?>

Selbstverständlich sollte das Verzeichnis mit den Backups immer gegenüber HTTP Zugriffen geschützt sein, da anderenfalls diese schnell abhanden kommen. Anderenfalls einfach wieder schnell löschen, bevor es Jemand findet.
Selbstverständlich sollte aber auch diese Datei nicht all zu offen herumliegen, da beim aufrufen ein Backup erstellt wird und daher Systemressourcen belastet und dies Backup dann heruntergeladen werden kann.

About Stefan

avatar

Ein männlicher IT Nerd, durchstöbert das Web nach speziellen Gadgets, unentbehrlicher Software und Alles was man im IT Sektor nicht verpassen darf.

Immer hilfsbereit wenn Probleme zu lösen sind oder das Unmögliche umgesetzt werden sollte.

Weitere interessante Artikel

PHP Trojaner suchen und finden

~0 Min. LesezeitPHP Trojaner sind seit längerem sehr beliebt. Mit dem Einsatz von immer mehr …

Microsofts Mail-Sperre aufheben

~1 Min. LesezeitMicrosoft bannt im Moment einige IP Bereiche, weil von vereinzelten IP Adressen Spam …

10 Kommentare

  1. avatar

    very nice!
    ich hab‘ vor einiger zeit ein aehnliches backup-skript gefunden welches auch noch verzeichnisse mit sichern kann und durch ein paar anpassungen (siehe kommentare) auch utf8 beherrscht .. und das ganze dann per email verschickt …
    http://www.ngcoders.com/php/php-automatic-file-and-database-backup-script

    gruesse
    guenther

  2. avatar

    Ein Problem bei Hostern ist manchmal, dass die Laufzeit von php-Scripten nicht endlos ist. Sie werden nach einiger Zeit ‚abgeschossen‘. Ich habe sehr gute Erfahrungen mit MySqlDumper gemacht
    http://www.mysqldumper.de/
    Das Tool kann unterbrochene Backups wieder aufsetzen.

  3. avatar

    Gibt diverse Tool um Backups zu machen, nur brauchen die ein wenig mehr Platz. Oft kann man sehr einfach die Laufzeit der Scripte verlängern, in dem man nach einer gewissen Zeit die Daten einer anderen PHP Datei übergibt und diese weiterarbeiten lässt. Ich wollte nur zeigen wie es geht, da gerade Jemand ein kleines Skript brauchte wo den Job sauber erledigt.

  4. avatar

    Ich habe es schon in meinen Bookmarks 🙂
    Das war keine Kritik, sondern nur eine Anmerkung.
    Weiter so!
    bye
    Michael

  5. avatar

    Vielen Dank für das Skript.
    Funktioniert tadellos! 🙂

  6. avatar

    Hallo

    Habe die Version verwendet um mehret Datenbanken zu sichern. Leider kommt beim Aufrufen der Datei immer diese Fehlermeldung

    Parse error: syntax error, unexpected ‚,‘, expecting ‚)‘ in /home/psetld/public_html/backup/sql_backup.php on line 18

    Die Linie 18 ist bei mir $f = fopen(, „w“);

    Hoffe du hast ne Idee wo das Problem liegt.

  7. avatar

    Irgendwie aus dem Artikel geflogen.
    Sollte so sein: $f = fopen($dbbackup, „w“);

  8. avatar

    Hallo

    Das is ja ein geniales Tool! Habe es ein wenig verändert und für mich gut brauchen können.

    Ich habe aber noch einen Verbesserungsvorschlag: Auf Linie 21 würde ich statt fwrite($f,“DROP TABLE `“.$table.“`;\n“); fwrite($f,“DROP TABLE IF EXISTS `“.$table.“`;\n“); verwenden, dann kann man es auch verwenden, wenn gewisse Tabellen bereits (bsp. aus versehen) gelöscht wurden.

    Vielen Dank für das tolle Tool!
    Janjo

  9. avatar

    … danke hat geklappt. Und wenn wir das File gleich noch gzippen würden? Das .sql-File kann ja manchmal sehr gross werden. Wie würde das gehen?

Schreibe einen Kommentar

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

eMail-Benachrichtigung bei weiteren Kommentaren.
Auch möglich: Abo ohne Kommentar.