MySQL Backup aber wie?

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

[/quote]Quelle: http://www.little-idiot.de/mysql/mysql-121.html

Kann mir jemand den Pfad des Datenverzeichnis des Servers nennen?
Oder gibt es einfachere Wege?

Vielen Dank für eure Hilfe!

jed nach benutzername
/users/BENUTZERNAME/www/

Vielen Dank für die schnelle Antwort.

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.

Hilfe! :susp:

Vielleicht hast du nicht die Rechte, irgendetwas in ein Outfile zu selecten… ich habs noch nie probiert.

Das wäre eine Erklärung für die Fehlermeldung!

Kennt ihr vielleicht noch andere Möglichkeiten eines automatisierten Backups der Datenbank?

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&uuml;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.

gibts auch ne möglichkeit den prefix wegzulassen weil ich ja die ganze datenbank backupen möchte?

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.

hätte man als prefix einfach “” (leerer String) angegeben, hätte es doch auch klappen müssen

substr würde bei Position 0 starten und 0 anzahl zeichen auslesen, ergo => “”

oder irre ich mich da?

wie dem auch sei, erstellt dieses Script SQL Syntax, welches ich auch mit phpMyAdmin ausführen kann?

mfg Balmung

Wenn man den Teil isoliert betrachtet ja, aber es wird keine Verbindung erreicht, da Prefix ein paar mal abgefragt wird.

Die erzeugte Sicherung kann mit PHPmyadmin direkt verarbeitet werden, wie bereits geschrieben: