Ich habe vor von meiner Datenbank regelmäßig automatisch ein Update machen zu lassen.
Nun habe ich ein PHP-Script geschrieben, was später per Cronjob (cron-job.org) täglich ausgeführt werden soll und ein Backup erstellen soll.
Da die meisten Funktionen, mit denen man ein Backup durchführen könnte hier gesperrt sind, habe ich nach langem googeln folgenden SQL-Befehl gefunden:
Auf meinem lokalen Server (XAMPP) habe ich für $backupFile einen absoluten Pfad angegeben, dass geht hier aber nicht!?
[quote]Für das Auffinden der Dateien auf dem Server Host gelten folgende Regeln:
* Absolute Pfadnamen können angegeben werden
* Bei relativen Pfadnamen gilt als Referenz das Datenverzeichnis des SQL Dämons
* Bei der Angabe von ./daten.txt wird vom Datenverzeichnis des Servers gelesen, bei der Angabe daten.txt allein wird aus dem Datenbankverzeichnis der aktuellen Datenbank gelesen
Das habe ich auch schon ausprobiert, funktionierte aber gestern nicht, wenn ich es heute versuche bekomme ich eine Fehlermeldung:
Mein Script:
$backupFile = './users/icqpics/www/temp/backup/backupfiles'.$table[$run].'.sql';
$sql = "SELECT * INTO OUTFILE '".$backupFile."' FIELDS TERMINATED BY ';' LINES TERMINATED BY '%' FROM ".$table;
$row = mysql_query($sql) OR die(mysql_error());
An den Zugangsdaten kann nichts falsch sein, da ich sie in einer externen PHP-Datei liegen habe und diese nicht verändert habe.
Na klar gibt es eine Möglichkeit für die komplette DB Sicherung:
<?php
$user=''; // hier den User eintragen
$pw=''; // das Passwort
// Die Verbindungsdaten
$mysql_host='';
$mysql_user='';
$mysql_passwort='';
$mysql_database='';
$mysql_prefix=''; // Achtung Prefix muss sein
$backupdir='data'; // Das Verzeichnis in dem gesichert werden soll
$loginname=isset($_SERVER['PHP_AUTH_USER']) ? $_SERVER['PHP_AUTH_USER']:'';
$passwort=isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW']:'';
if ($loginname<>$user && $passwort<>$pw )
{
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Bitte anmelden"');
echo '<center>Ihr Login ist fehlgeschlagen !</center>';
exit;
}
require_once('lib/PiDatabase.php');
$dbm = New PiDatabase;
$dbm->Connect($mysql_host,$mysql_user,$mysql_passwort,$mysql_database,$mysql_prefix);
$dbm->compress=true; // Zeile entfernen wenn nicht gz komprimiert werden soll
$fname = date('y_d_m_H_i_s').'.sql';
$fname = date('y_d_m_H_i_s');
if ($dbm->compress) $fname .= '.sql.gz';
else $fname .= '.sql';
$result=$dbm->Backup($backupdir,$fname);
if (!$result === false) $meldung="Backup wurde durchgeführt.Dateiname: $result";
else $meldung='Fehler bei der Backuperstellung';
echo $meldung;
?>
Die Datenbankklasse kann komprimiert oder nicht komprimiertes Backup machen.
Rückgabewert ist der Dateiname.
Funktioniert mit dem Login NICHT auf CGI PHP , aber hier.
Die Datenbankklasse ist ein Teil meiner Projekte - näheres (czarnowski.bplaced.net/) und kann dort dem Päckchen entnommen werden.
Das Format ist PHPMyadmin kompatibel kann somit direkt damit verarbeitet werden.
Wenn du alles was in der DB steht sichern willst ohne Rücksicht auf eine bestimmte Anwendung die im Normalfall zur Trennung von Tabellen anderer Anwendungen dienlich ist, dann musst du in der Pidatabase.php diese Funktion ändern:
Von:
//Holt alle Tabellennamen der Datenbank und gibt sie als Array aus
function Tables() {
$r = @mysql_list_tables($this->dbname, $this->db);
$out = array();
while ($row = @mysql_fetch_row($r))
if (substr($row[0], 0, strlen($this->dbprefix)) == $this->dbprefix) {
$out[] = $row[0];
}
$this->Free($r);
return $out;
}
auf
//Holt alle Tabellennamen der Datenbank und gibt sie als Array aus
function Tables() {
$r = @mysql_list_tables($this->dbname, $this->db);
$out = array();
while ($row = @mysql_fetch_row($r))
$out[] = $row[0];
$this->Free($r);
return $out;
}
Dann kannst (und musst) du für den Zweck als Prefix beliebiges Zeug einsetzen würde nicht berücksichtigt werden.
Mit anderen Worten es wird alles geholt was vorhanden ist.
Du wirst bei mehreren Anwendungen nur das Thema haben die Daten wieder zu trennen, wenn ein Restore fällig werden sollte, deswegen keine gute Idee.
Übrigens die Datenbankklasse kann auch ein Restore durchführen.
Und du musst auch sehen das alles innerhalb der max_execution_time von 12 Sekunden ablaufen muss.
Bei großen DB’s ist es sinnvoller das Script mehrfach einzusetzen.