Geschrieben von phattek am 25.05.2005, 20:45

Da es in letzter Zeit oft im Forum oft Nachfragen nach Backupscripts für MySQL-Datenbanken gestellt wurden habe ich mir mal die Mühe gemacht eins zu programmieren.
Das ganze ist in die Funktion get_dump verpakt. Als Parameter muss eine Datenbank angegeben sein (bei Lima meist DB*********). Außerdem muss eine Verbindung zum MySQL-Server bestehen (mysql.lima-city.de). Die Funktion gibt dann einen gültigen SQL-Query zurück, mit dem man des Backup wieder aufspielen kann. Wenn man damit Binärdaten sichern will muss man das Script unter Umständen noch erweitern, da ich es nur mit Text bzw. Zahlen getestet habe.
Dieses Script sollte man aber nur äußerst selten verwenden, da es sehr viel Traffic verursacht (abhängig von der Datenbankgröße).


<?php
/* Funktion wird definiert */
function get_dump($dbname) {
/* Diese Arrays werden später zum ersetzten bestimmter Zeichen benötigt */
$search = array("\x00", "\x0a", "\x0d", "\x1a");
$replace = array('\0', '\n', '\r', '\Z');

/* Header des SQL Dump - das steht in der Ausgabe ganz oben */
/* Die ganze Ausgebe wird in der Variable $sql_dump gespeichert */
$sql_dump = "# SQL Dump\n";
$sql_dump .= "# Script: http://{$GLOBALS["SERVER_NAME"]}{$GLOBALS["PHP_SELF"]}\n"; // Scriptadresse wird angegeben
$sql_dump .= "#\n";
$sql_dump .= "# Erstellungszeit: ".date("d.m.Y")." um ".date("H:i")."\n"; // Erstellungszeit wird angegeben
$sql_dump .= "# PHP-Version ".phpversion()."\n"; // PHP-Version wird angegeben
$sql_dump .= "#\n";
$sql_dump .= "# Datenbank: `{$dbname}`\n"; //Datenbankname wird angegeben
$sql_dump .= "#\n";
$sql_dump .= "\n";
$sql_dump .= "#-- -------------------------------------------------\n";

/* Tabellen ermitteln */
/* Hier werden alle Tabellen der Datenbank ausgelesen und gleichzeitig überprüft, ob Eine Verbindung zum MySQL-Server besteht */
if (!$result = @mysql_list_tables($dbname)) return "Keine Verbindung zu MySQL-Server oder falscher Datenbankname.";
/* Die einzelnen Tabellen der Datenbank werden in ein Array ($tables) geschrieben */
for($i=0;$i<mysql_num_rows($result);$i++){
$tables[] = mysql_tablename($result,$i);
}

/* Tabellenstruktur und Daten ausgeben */
foreach ($tables as $table) {
/* "Überschrift" für die Tabellenstrukturen */
$sql_dump .= "\n";
$sql_dump .= "#\n";
$sql_dump .= "# Tabellenstruktur für `{$table}`\n";
$sql_dump .= "#\n";
$sql_dump .= "\n";
/* Der 'CREATE TABLE'-Query wird per My-SQL-Anfrage ermittelt */
$result = mysql_query("SHOW CREATE TABLE {$dbname}.{$table};");
$fields = mysql_fetch_array($result);
/* ... und ausgegeben */
$sql_dump .= $fields[1]." ";
/* Jetzt wird noch der aktuelle Auto-Increment-Wert ermittelt */
$result = mysql_query("SHOW TABLE STATUS FROM {$dbname} LIKE '{$table}'");
$fields = mysql_fetch_array($result);
$sql_dump .= "AUTO_INCREMENT=".$fields[9].";\n";
/* Die Daten werden in Form von 'INSERT INTO'-Querys ausgegeben */
/* 'Überschrift' */
$sql_dump .= "\n";
$sql_dump .= "#\n";
$sql_dump .= "# Daten für `{$table}`\n";
$sql_dump .= "#\n";
$sql_dump .= "\n";
/* Aus der aktuellen Tabelle werden erst einmal alle Daten ausgelesen */
$result = mysql_query("SELECT * FROM `{$table}`;");
while ($row = mysql_fetch_row($result)) {
/* Der INSERT-Query wird begonnen */
$sql_dump .= "INSERT INTO `{$table}` VALUES (";
/* Die einzelnen Werte (Values) werden ermittelt und je nach Typ mit '' oder ohne im Array $values abgelegt. */
$values = array();
for ($i=0;$i<count($row);$i++) {
$type = mysql_field_type($result,$i);
if ($type == 'tinyint' || $type == 'smallint' || $type == 'mediumint' || $type == 'int' || $type == 'bigint' || $type == 'timestamp') $values[] = str_replace($search,$replace,addslashes($row[$i]));
else $values[] = "'".str_replace($search,$replace,addslashes($row[$i]))."'";
}
/* alle Werte werden durch ', ' getrent in den Query geschrieben */
$sql_dump .= implode(", ",$values);
$sql_dump .= ");\n";
}
}
/* noch ein paar Leerzeilen */
$sql_dump .= "\n";
$sql_dump .= "#\n";
$sql_dump .= "# Ende des Dumps\n";
$sql_dump .= "#";
return $sql_dump;
}
?>

Diese Funktion kann man jetzt zum Beispiel in einer Datei (dbbackup.php) speichern und dann includen und ausführen.


<?php
/* Daten zur Verbindung mit dem MySQL-Server */
$DB_HOST = "mysql.lima-city.de";
$DB_USER = "USER12345";
$DB_PASS = "geheim";
$DB_NAME = "DB324156";

/* oben beschriebene Funktion includen */
include("dbbackup.php");
echo "<textarea cols=\"110\" rows=\"30\" wrap=\"off\">";
/* Verbindung zu MySQL-Server */
mysql_connect($DB_HOST,$DB_USER,$DB_PASS);
/* Ausgabe des SQL Dumps */
echo htmlentities(get_dump($DB_NAME));
/* Verbindung mit MyAQL-Server trennen */
mysql_close();
echo "</textarea>";
?>

Auf diese Weise kann man sich zum Beispiel alle 7 Tage per Cronjob (http://cronjob.de) eine Sicherung seiner Datenbank zuschicken. Das ist allerdings nur möglich, wenn es sich um kleine Datenbanken handelt.

Bewertung Anzahl
4
50,0 %
1 Bewertungen
3
50,0 %
1 Bewertungen