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.
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
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.
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.
Ich habe es schon in meinen Bookmarks :-)
Das war keine Kritik, sondern nur eine Anmerkung.
Weiter so!
bye
Michael
Vielen Dank für das Skript.
Funktioniert tadellos! :)
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.
Irgendwie aus dem Artikel geflogen.
Sollte so sein: $f = fopen($dbbackup, „w“);
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
… 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?