Datenbank sichern (select * into outfile)

Hallo,

Ich weiß nicht ob das in dem Forum schon behandelt wurde, aber meine Suche hat mal nix ergeben.

Ich schreibe ein Script, was mir meine MySQL Datenbank sichert und per e-Mail zusendet. Dieses Script wird immer aufgerufen, wenn mir jemand etwas ins Gästebuch schreibt. (Also leider nicht öfter als alle 2 bis 3 Wochen^^)
Zum sichern der Tabelle habe ich folgenden Code gefunden:

//Backup erstellen
//http://www.php-mysql-tutorial.com/perform-mysql-backup-php.php
$backupFile = 'gb.sql';
$sql      = "SELECT * INTO OUTFILE '$backupFile' FROM guestbook";
mysql_query($sql) OR die(mysql_error());

In der Mail seht also der neueste Eintrag, wer ihn der verfasst hat und im Anhnag befindet sich die sicherung.

Das klappt alles soweit ganz gut. Mein einziges Problem ist, dass, wenn Sicherung erstellt habe, ich nicht weiß wo sie gespeichert ist. Sie ist in meinem gesamten Serververzeichnis nicht zu finden, also muss sie irgendwo anders sein. (MySQL Verzeichnis oder so?)

Ich würde sie aber gerne irgendwo speichern, wo ich per ftp auch zugriff drauf habe.
Das wäre dann irgendwie /users/nixtauger/???/gbbackup

Wer kann helfen?

Dann gib einfach den absoluten Pfad inkl. Dateinamen an, dann sollte die Datei auch dort zu finden sein.
Solltest dann aber aus Sicherheitsgründen den Zugriff auf das Verzeichnis/die Datei per .htaccess einschränken.

$backupFile=’/users/username/www/gbbackup/backup.sql’;
“SELECT * INTO OUTFILE ‘$backupFile’ FROM guestbook”;

Die Root ermitteln un dem Namen bzw. dem Rest vorstellen.

Die Root ermitteln geht z.B. so:

$PATH_thisScript = str_replace(’//’,’/’, str_replace(’\’,’/’, (php_sapi_name()==‘cgi’||php_sapi_name()==‘isapi’ ||php_sapi_name()==‘cgi-fcgi’)&&($_SERVER[‘ORIG_PATH_TRANSLATED’]?$_SERVER[‘ORIG_PATH_TRANSLATED’]:$_SERVER[‘PATH_TRANSLATED’])? ($_SERVER[‘ORIG_PATH_TRANSLATED’]?$_SERVER[‘ORIG_PATH_TRANSLATED’]:$_SERVER[‘PATH_TRANSLATED’]):($_SERVER[‘ORIG_SCRIPT_FILENAME’]?$_SERVER[‘ORIG_SCRIPT_FILENAME’]:$_SERVER[‘SCRIPT_FILENAME’])));

$root_path=dirname($PATH_thisScript);

Wenn das Script nicht in der Root liegen sollte pro Stufe ein weiteres dirname vorhängen z.B.

$root_path=dirname(dirname($PATH_thisScript));

Dann kann man $root_path.’/verzeichnis/dateiname’ einfach anhängen und man hat für alle anderen Fälle auch schon mal den Pfad.

Danke euch, das sollte funktionieren!
Habe sogar das Verzeichnis mit htaccess geschützt, obwohl in der DB doch nix geheimes steht. Das Gästebuch darf doch jeder sehen!

Jetzt habe ich noch ein Problem:
MySql überschreibt die Datei nicht, wenn sie bereits existiert. Zumindest nicht, wenn ich das folgendermaßen mache.

$sql = "SELECT * INTO OUTFILE '$backupFile' FROM guestbook"; mysql_query($sql) OR die(mysql_error());
Es kommt File ‘backup.sql’ already exists

Gibt es vllt. ne SQL anweisung, die die Datei überschreibt, auch wenn sie schon existiert?
Ansonsten müsste ich irgendne Abfrage vorher einbauen, die die Datei löscht, wenn sie existiert.
Oder ich baue in den Dateinamen noch irgendwie Das Datum ein. Aber dann habe ich halt irgendwann ziemliche viele backup Dateien in dem Ordner.

Was würdest ihr machen?

@unlink($backupFile); davor setzen, dann wird eine vorhandene mit gleichem Namen vorher gekillt.

ah, das mit dem unlink hat getan.

Grade eben erlebte ich allerdings die Große überraschung. Auf dem server auf meinem pc hat das ja alles ganz wunderbar funktioniert, nur wenn ich den code hochlade erhalte ich einen Fehler.

[code] $sql = “INSERT INTO guestbook (datum, name, mail, url, text)
VALUES (NOW(), '”.$_POST[‘name’]."’, ‘".$_POST[‘mail’]."’, ‘".$_POST[‘url’]."’, ‘".$_POST[‘text’]."’)";

mysql_query($sql) OR die(mysql_error());
$backupFile = '/users/username/www/admin/save/gbbackup/backup.sql';
@unlink($backupFile);
$sql      = "SELECT * INTO OUTFILE '$backupFile' FROM guestbook";
mysql_query($sql) OR die(mysql_error());[/code]

Wenn mir jetzt jemand schreibt, wird das zwar noch in die Datenbank eingetragen, aber der zweite query funktioniert nicht. Er liefert mir folgendes:
Access denied for user ‘nixtauger’@‘localhost’ (using password: YES)

Mir scheint ich habe nicht die Rechte um diese aktion durchzuführen.
Und nu?

Hallo nixtauger,

das gleiche habe ich auch schon versucht (viewtopic.php?f=10&t=2411), habe jedoch keine Möglichkeit eines automatisierten MySQL-Backups gefunden.

Entwerder regelmäßig über PHPmyadmin oder mysqldumper (für größere Datenbanken)
-> mysqldumper.de/

LG
Maxxx

Hey Maxxx,

Auf mysqldumper bin ich auch schon gestoßen, aber bei bplaced sind Befehle wie exec oder system deaktiviert, also wie soll das damit funktionieren?

In der allergrößten Not, muss ich halt alle Daten ganz normal aus der Datenbank auslesen und mit php in eine Datei schreiben, die dann der systax einer .sql Datei entspricht.
Aber wie das genau geht weiß ich auch noch net, das wäre halt umständlich…

LG

Ich hatte den mal installiert, der funktioniert problemlos nur halt nicht die automatisierten Backups.
Mach’s lieber über PHPmyadmin, einfach „exportiern“, dafür ein Script zu schreiben ist ziemlich aufwendig.

Außerdem sind seitdem ich dabei bin noch keine Daten hier verloren gegangen, das soll jetzt nicht heißen, dass Backups wichtig sind, aber doch nicht unbedingt nach jedem Gästebucheintrag.
:p :wink:

Naja ich wollte das halt programmieren. War eher ne herausforderung für mich, als ne Zwecksache.
Mal schauen, ob ich mir das geb so nen Script zu schreiben, aber soo schwer wird’s net sein.

Aber zu dem anderen Punkt:
Hier ist doch mal der komplette server5 (oder irgendeinder) verschwunden oder? Sind da keine Daten verloren geganen?

Naja wenn ich ne Lösung finden sollte, meld ich mich nochmal.

Lg

Es war Server 6.
Die Festplatten wurden von der Polizei beschlagnahmt und gesichtet und später wieder zurück gegeben, es sind also alle Daten wieder da. :p

Okey ich habe mich jetzt doch noch dran gemacht ein Script zu schreiben.
Die Ausgabe soll jener entsprechen, die phpmyadmin macht, wenn man eine Datenbank exportiert.

[code]include(“dbconnect.php”);

/* Backup erstellen */
$table = ‘guestbook’; //Name der zusichernden Tabelle
$backupFile = ‘gbbackup.sql’; //Pfad, wo soll Datei gespeichert werden?

$sql = “SELECT * FROM $table”;
$result = mysql_query($sql);
$fields = mysql_num_fields($result);
$rows = mysql_num_rows($result);

//oberer Teil
$string = 'SET SQL_MODE=“NO_AUTO_VALUE_ON_ZERO”;


– Datenbank: ???



– Tabellenstruktur für Tabelle '.$table.'

CREATE TABLE IF NOT EXISTS '.$table." (\n";

for ($i=0; $i < $fields; $i++) {
$name = mysql_field_name($result, $i);
$type = mysql_field_type($result, $i);
$len = mysql_field_len($result, $i);
$flags = mysql_field_flags($result, $i);
$string .= " $name $type($len) $flags";
$string .= ($i+1 == $fields)?"\n":",\n";
}

$string .= ') ENGINE=MyISAM DEFAULT CHARSET=latin1 ;


– Daten für Tabelle guestbook

INSERT INTO '.$table." (";
for ($i=0; $i < $fields; $i++) {
$name = mysql_field_name($result, $i);
$string .= “$name”;
$string .= ($i+1 == $fields)?"":", ";
}
$string .= “) VALUES’;\n”;

//unterer Teil
$j = 1;
while($row = mysql_fetch_assoc($result)){
$string .= ‘(’;
for($i=0;$i<$fields;$i++){
$spalte = mysql_field_name($result, $i);
$row[$spalte] = str_replace("\r", “\r”, $row[$spalte]);
$row[$spalte] = str_replace("\n", “\n”, $row[$spalte]);
$string .= “’$row[$spalte]’”;
$string .= ($i+1 == $fields)?"":", “;
}
$string .= ($j == $rows)?”);\n":"),\n";
$j++;
}
//In die Datei schreiben
$fp = fopen($backupFile,“w”);
fwrite($fp, $string);
fclose($fp);[/code]
Der INSERT Teil funktioniert wunderbar!
Nur mit dem Create Teil hab ich schwirigkeiten.
In phpmyadmin sieht das so aus:

CREATE TABLE IF NOT EXISTS `guestbook` ( `id` int(100) NOT NULL auto_increment, `datum` datetime NOT NULL, `name` varchar(70) NOT NULL, `mail` varchar(70) default NULL, `url` varchar(100) default NULL, `text` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;
bei mir so:CREATE TABLE IF NOT EXISTS `guestbook` ( `id` int(100) not_null primary_key auto_increment, `datum` datetime(19) not_null binary, `name` string(70) not_null, `mail` string(70) , `url` string(100) , `text` blob(65535) not_null blob ) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;
einiges kann ich durch str_replace ersetzen (zum beispiel das not_null zu NOT NULL wird).
Aber wieso werden die feldtypen falsch angezeigt?
Und wie bekomme ich den primary key raus, bzw. wie ist die systax dafür?

Oder hat jemand ne bessere idee, als diese Befehle?
$name = mysql_field_name($result, $i);
$type = mysql_field_type($result, $i);
$len = mysql_field_len($result, $i);
$flags = mysql_field_flags($result, $i);

Die Create - SQL einer Mysql Tabelle holt man sich üblicherweise mit einer einzigen Anweisung:

SHOW CREATE TABLE tabellen_name

Ausserdem gibt es hier an anderer Stelle ein Posting wie man ein vollständiges Backup machen kann.

Hm… ich hab aber nix gefunden. Zumindest nix, was man in einem Script ausführen kann.
Aber danke, das hat mir sehr geholfen.

Noch ne kleine frage, die du mir sicher beantworten kannst.
mit mysql_select_db wähl ich ja eine Datenbank aus.
Kann ich irgendwie rauskriegen, wie die heißt?

Beispiel:
mysql_select_db(“test”);
Jetzt will ich irgendwie ‘test’ bekommen.

LG

[quote]Hm… ich hab aber nix gefunden. Zumindest nix, was man in einem Script ausführen kann.
Aber danke, das hat mir sehr geholfen.[/quote] :astonished:
-> viewtopic.php?f=10&t=2411

LG
Maxxx

viewtopic.php?f=10&t=2411

[quote]Kann ich irgendwie rauskriegen, wie die heißt?
[/quote]

Versuch es mal mit

SHOW PROCESSLIST

in der Spalte db steht dann die DB, es werden mehrere Zeilen zurück gegeben, die db Spalte muss ungleich null sein.

Also um das ganz hier nochmal abzuschließen:
Ich bin zwar auf den Link gegangen, den Maxxx mir geschrieben hat, aber habe net den ganzen post gelesen. :hail:
Habe jetzt mein eigenes Script geschrieben, dafür ewig viel Zeit verbraucht, obwohl es gar net nötig gewesen wäre. Dafür hab ich vllt. was gelernt g
Zum Script:
http://nixtauger.bplaced.net/scripts.php

ich hatte mal ein Script geschrieben, welches mir eine oder mehrere Datenbanken in XML exportiert.
Mit sämtlichen angaben inkl. spaltentyp etc, und die Daten base64 kodiert, damits mit XML keine probleme gibt.
Genutzt wurde dazu XML DOMDocument, welches bei bplaced glaub ich sogar nutzbar ist.

Wenn jemand interesse hat, lad ich’s hoch, allerdings gibts halt noch keine Import Funktion, die müsstet ihr schon selber basteln :stuck_out_tongue:
Ist nur eine Datei.

mfg Balmung

Mitlerweile würde ich wahrscheinlich eh jedem der mich fragt das hier empfehlen.
http://tutorial.riehle-web.com/scripts/#mysql
Aber jetzt habe ich ja mein eigenes geschrieben, und da benutz ich natürlich auch mein eigenes^^
LG