mmofacts.com

Automatisches Erstelln von Dumps von mehreren Datenbanken mit unterschiedlichen Benutzern

gepostet vor 16 Jahre, 10 Monate von DrakeL
Hi,
Hab gerade eine Möglichkeit gesucht, meine Backups der Datenbanken etwas eleganter zu machen. Datenbanksoftware ist MySQL.
In dem Zuge hab ich MySQLDumper getestet, aber der erlaubt es nicht, Datenbanken zu sichern von verschiedenen Benutzern in einem Zuge (die stabile Version kann es gar nicht, die unstabile nicht in einem Zuge).
Daher kennt Ihr eine andere Software die Backups von verschiedenen Datenbanken verschiedener User auf dem selben Server erstellen und gezippt per E-Mail zusenden kann? Am besten wäre es natürlich, wenn dies über CronJob aufrufbar ist.
gepostet vor 16 Jahre, 10 Monate von ThaDafinser
ein backup per mail Oo
das ist aber böse, wenn die mal groß ist....
gepostet vor 16 Jahre, 10 Monate von DrakeL
Die größte hat bisher 50 KB
Naja, wo sollte Sie sonst am besten hin, auf dem Server lagern? dann muss ich Sie manuell herunterladen immer, nicht dass mal die Festplatte kaputt geht mit Datenbank und allen Backups ^^.
Daher finde ich die Lösung per E-Mail bisher die beste. Und solang ein Backup unter 1 MB groß ist auch absolut kein Problem, darüber muss ich dann schauen wie ich es am besten mache.
Hab mir jetzt das neue MySQL Dumper eingerichtet. Muss ich halt 4 mal rumswitchen zu einem anderen User um alle meine 4 Datenbanken zu sichern... Unschön, aber ok für den Anfang.
Wenn ich mal etwas mehr Zeit hab, versuch ich das ganze vielleicht über CronJobs zu machen, aber da hab ich bisher keine Ahnung von ^^.
gepostet vor 16 Jahre, 10 Monate von mifritscher
Ist zwar sicheheitstechnisch nicht ganz optimal, aber wieso machst du nicht einen User, der auf alle DBs zugreifen kann, und sicherst dann damit?
Zur Sicherung kann man auch einen externen ftp-Space nehmen
gepostet vor 16 Jahre, 10 Monate von DrakeL
Original von mifritscher
Ist zwar sicheheitstechnisch nicht ganz optimal, aber wieso machst du nicht einen User, der auf alle DBs zugreifen kann, und sicherst dann damit?

Wenn ich das könnte, hätte ich mir nicht mehrere User gemacht, da ich mehrere User für unsinnig halte (naja, außer dass es bissle sicherer ist ^^).
Nur leider hab ich derzeit nur Webspace und kein Einfluss auf diese Dinge. Mein Provider legt für jede Datenbank einen eigenen Benutzer an.
Original von mifritscher

Zur Sicherung kann man auch einen externen ftp-Space nehmen
Wenn man einen hätte natürlich nur, gleiche Begründung wie oben, bisher nur Webspace Nutzer ohne weitere Internetpräsenzen
Ich bin halt etwas schockiert, dass es bei MySQL nicht schon solch elementare Funktionen drin sind (ok, bin die letzten Jahre auch ohne ausgekommen, aber da hatte ich nie was sensibles gespeichert, was zeitnah gesichert werden müsste ^^). Bei DB2 bin ich es gewohnt ein Befehl einzugeben und schon wird ein Backup gezippt erstellt.
gepostet vor 16 Jahre, 10 Monate von mcules
Einfach per shell-script mittels mysql-dump das Backup ziehen und dann via FTP auf einen anderen Server schieben.
Da kannst du das dann auch mehrmals machen wegen den einzelnen Usern.
Einmal geschrieben mußt du das dann ja nichtmehr wiederholen.
gepostet vor 16 Jahre, 10 Monate von open_dimension
Hast Du root-Zugang ?? Oder überhaupt eine Shell ??
mysqldump -ubenutzername -ppasswort db_name > dateiname...
Das 4 Mal für jede DB und dann per cron ausgeführt. Das ist das Backup...
Noch besser ist allerdings mysql-hot-copy
dev.mysql.com/doc/refman/5.1/de/mysqlhotcopy.html
Syntax im prinzip genausso.
Ok, das downloaden müssteste dann manuell machen, oder Du läßt Dir die Datei per mail an einen mail-server-account als attachment schicken, dann könnteste Du sie auch noch gleich zippen...
Aber irgendwann wird es wahrscheinlich zu viel des guten...
Normalerweise haben Provider ein Backup, also Plattencrash sollte nicht vorkommen, ohne das die das nicht zurückspielen können
gepostet vor 16 Jahre, 10 Monate von mcules
wenn du keinen Shell-Zugriff hast, kannst du ja mal schauen, ob folgendes Script funktioniert:
	$User         = 'USER';   // DB-User.

$Password = 'PASSWD'; // DB-Password
$DatabaseName = 'DB'; // DB-Name
$File = '/home/www/web1/html/DB.sql'; // the complete path

echo 'starting...
';
$Results = shell_exec( "mysqldump --allow-keywords --opt -u$User -p$Password $DatabaseName > $File");
echo 'finished
';
?>
gepostet vor 16 Jahre, 10 Monate von DrakeL
Hab weder Root-Zugang noch eine Shell :-(
Hab zumindest mal eine E-Mail an meinen Provider geschickt, ob da was angeboten wird wegen automatischem Backup. Vielleicht hab ich ja Glück ^^.
Aber für mich gehen nur PHP Lösungen. Als Notlösung ist MySQL Dumper ja vorerst in Ordnung. Werde mich dann höchstens ransetzen und was eigenes machen.
Zusatz:
Warning: shell_exec() has been disabled for security reasons in /www/htdocs/.../backup.php on line 8
Nein, das geht mit PHP nicht
gepostet vor 16 Jahre, 10 Monate von mcules
Schade, kannst dir aber mal diesen Thread anschauen, da wird dein Problem ebenfalls behandelt:

Ich" target="_blank">http://board.protecus.de/t9581.htm
Ich hoffe, mir nimmt das jetzt keiner böse, da das ein anderes Forum ist.
gepostet vor 16 Jahre, 10 Monate von open_dimension
CGI oder Perl könnte man auch noch versuchen ???
Die können auch shell-Befehle ausführen, hast Du ein CGI-bin-Verszeichnis ??
Aber wenn Dein Provider daran gedacht hat, wird er Dir das sicher auch nicht erlauben ...
PHPMyAdmin, wäre noch als Werkzeug erwähnenswert, aber meines Wissens geht dabei nur ein Backup einzelner Tabellen nicht die Ganze DB...
gepostet vor 16 Jahre, 10 Monate von mcules
Mit phpMyAdmin kannst du sogar mehrere Datenbanken auf einen Schlag sichern, importieren ist jedoch auf 2MB beschränkt sonst gibt es einen Timeout.
gepostet vor 16 Jahre, 10 Monate von open_dimension
Importieren bei der neueren Version auf 8MB...
Ok, dann wäre phpMyAdin ja Ok...
Aber grundsätzlich nochmal gefragt, haste Cron-Befehle bei Deinem Provider, dann wäre dieser weg sicher der einfachste...
Wenn er das man zulässt.
gepostet vor 16 Jahre, 10 Monate von mcules
Wegen CronJobs kann ich cron-job.org nur empfehlen.
Ist eine einfache Sache für alle, die keine eigenen Crons anlegen können.
gepostet vor 16 Jahre, 10 Monate von DrakeL
Mehrere Datenbanken sichern geht mit PHPMyAdmin und mit MySQLDumper, aber nicht von verschiedenen Usern, das ist ja das Problem beider Programme
CGI Verzeichnis habe ich, aber ich gehe auch stark davon aus, dass ich hier keine Shell Befehle ausführen darf. Ich denke mal all-inkl ist so schlau, dass Sie beides sperren ^^.
@mcules: Das Forum hier ist gut, aber nicht perfekt und allwissend, von daher gehe ich davon aus, dass viele mehrere Foren mit einbeziehen wenn Sie was suchen, daher nein, ich bin dir auf jeden Fall nicht böse, werde mir den Thread nachher mal durchlesen
gepostet vor 16 Jahre, 10 Monate von open_dimension
#!/bin/sh ODER #!/bin/bash
mysqldump -ubenutzername -ppasswort db_name > dateiname...
speichern und ab in cgi-bin...
ein versuch ist es Wert.
oder die perl version
#!/usr/bin/perl
exec("mysqldump -ubenutzername -ppasswort db_name > dateiname");
gepostet vor 16 Jahre, 10 Monate von HSINC
wenn ich davon ausgehe das es sich um den space bei dir bei all-inkl handelt, da gibt es eine sehr einfache lösung
das script von mcules und unter xxx.phpx speichern
und schon hat man solche funktionen wie shell_exec oder exec
das ganze ding halt noch um mail erweitern etc wie man eben will. an (externen) cron anbinden, fertig
gepostet vor 16 Jahre, 10 Monate von DrakeL
jep, genau dort bin ich. Hab deinen Rat befolgt, das Script von mcules genommen und es funktioniert *freu* ^^.
Hoffe diese Möglichkeit bleibt auch weiterhin bestehen, nicht dass all-inkl dies auch mal verbietet.
Hab mir das Script dann auch bissle erweitert, vor allem eine Prüfung rein, ob in den letzten 12 Stunden nicht schon ein Backup erstellt wurde (bevor jemand die URL raus findet und Server zuspamt):
   $databases = array();


/*
* Schauen, ob es nicht schon ein aktuelles Backup gibt
*/
$dir = opendir('Backup');
while($element = readdir($dir))
{
if($element == '..' or $element == '.')
{
continue;
}

if(time() - $element < 43200)
{
die('Backup ist aktuell');
}
}

/*
* Alle Datenbanken definieren
*/
$databases[] = array('backup' => 'Homepage',
'username' => 'xxx',
'password' => 'xxx',
'database' => 'xxx');

$databases[] = array('backup' => 'Projektforum',
'username' => 'xxx',
'password' => 'xxx',
'database' => 'xxx');

$databases[] = array('backup' => 'Bugtracker',
'username' => 'xxx',
'password' => 'xxx',
'database' => 'xxx');

$databases[] = array('backup' => 'Jennifer',
'username' => 'xxx',
'password' => 'xxx',
'database' => 'xxx');
/*
* Verzeichnis erstellen mit dem aktuellen Timestamp
*/
$directory = 'Backup/' . time();
mkdir($directory);
chmod($directory, 0777);

/*
* Datenbanken durchgehen und Backups erstellen
*/
foreach($databases as $database)
{
$path = $directory . '/' . $database['backup'] . '.sql';
shell_exec('mysqldump --allow-keywords --opt -u' . $database['username'] . ' -p' . $database['password'] . ' ' . $database['database'] . ' > ' . $path);

print 'Backup ' . $database['backup'] . ' wurde erstellt
';
}
?>
Aber Danke an alle für die Antworten und die Hilfe
PS: CronJob hab ich jetzt auch, bei cronjob.de gibts ja recht schöne Angebote, nicht nur Cronjobs, gefällt mir .
Hab das Backup alle 4 Stunden eingestellt, hoffe das wird keine großen Serverlasten verursachen.
gepostet vor 16 Jahre, 10 Monate von mifritscher
Bin ich blind oder wieso geht shell_exec in diesem Script?
gepostet vor 16 Jahre, 10 Monate von mcules
Weil es jetzt im CGI-Verzeichnis ausgeführt wird, das andere Rechte besitzt
gepostet vor 16 Jahre, 10 Monate von DrakeL
wieso sollte es nicht gehen? Bzw. was wundert dich daran?
gepostet vor 16 Jahre, 10 Monate von mifritscher
autsch, das tut weh^^
Will nicht wissen was in der cgi-Version noch alles geht, die scheinen sie ja anscheinend komplett vergessen zu haben...
DrakeL, weil die Config der modul-Version von php das nicht erlaubte.
gepostet vor 16 Jahre, 10 Monate von Drezil
Original von mifritscher
Bin ich blind oder wieso geht shell_exec in diesem Script?

wenn ich das
von HSINC

das script von mcules und unter xxx.phpx speichern
und schon hat man solche funktionen wie shell_exec oder exec
richtig interpretire, dann würde eine phpx-datei anders (auch mit anderen rechten) abgearbeitet, als ne "normale" php-datei.
gepostet vor 16 Jahre, 10 Monate von DrakeL
das eine ist normal, das andre als CGI.
all-inkl hat mir sogar vorgeschlagen, dass ich es per Shell Aufruf mit CGI PHP mache. Von daher ist das sogar gewollt, dass es geht. (E-Mail vom Support heut morgen bekommen).
Von einem Arbeitskollegen hab ich noch eine andere Möglichkeit bekommen, falls CGI PHP mal nicht mehr geht mit Shell Aufrufen (diese geht dann auch mit normalen PHP):
$dbhost = "localhost";

$dbuser = "user";
$dbpwd = "pass";
$dbname = "datenbank";
$conn = @mysql_connect($dbhost, $dbuser, $dbpwd);
if (!$conn) {
die(mysql_error());
}
mysql_select_db($dbname);
$f = fopen("/absoluter/pfad/zur/localhost.sql", "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);
Hab diese aber noch nicht getestet. In der Zwischenzeit wurde mein Account bei cronjob.de gesperrt wegen falschen Adressdaten (klar, ich geb doch keiner unbekannten Seite meine Vollständige Adresse -.-).
Gibt es noch andere Seiten dieser Art? Hab zwar den Betreiber kontaktiert und mich entschuldigt und dass ich meine korrekten Daten eingeben würde, wenn er mich lässt, aber glaub nicht, dass er da zustimmt ^^.
gepostet vor 16 Jahre, 10 Monate von mcules
Schicke mir mal per PN deine E-Mail Adresse mit der du dich bei ihm registriert hast, kenne den und kann mal nachfragen für dich.
gepostet vor 16 Jahre, 10 Monate von DrakeL
[email protected] <-- meine Spam Adresse für Anmeldungen
Wird zwar abgerufen, aber nicht immer zeitnah durchgeschaut.
Hab Ihn auch schon kontaktiert und Ihm erklärt, dass ich damit nicht Ihn hintergehen wollte, sondern lediglich mich vor unseriösen Seiten schützen will, da ich seine Seite noch nicht kannte.
Außerdem hab ich mich entschuldigt und Ihn gebeten mich wieder freizuschalten und die Chance zu geben meine Daten zu berichtigen, leider noch keine Antwort...
(Ich frag mich eigentlich sowieso, wofür eine Webseite die Anschrift der Leute verlangt, wenn doch die E-Mail Adresse gültig ist kann man darüber doch Kontakt aufnehmen...)
gepostet vor 16 Jahre, 10 Monate von mcules
Naja, du könntest ja theoretisch eine Sicherheitslücke auf einer anderen Seite gefunden haben und diese via Cron regelmäßig aufrufen. Um sich davor zu schützen, wird die komplette Adresse verlangt. Dann kann man, im Schadensfalle, sagen wer es war.
Die Seite ist auf jeden Fall Vertrauenswürdig, kenne den Betreiber schon seit 2003 und kann bis heute nur positives über ihn berichten.
gepostet vor 16 Jahre, 10 Monate von None
Bei mySQL kannst du ein backup auch erstellen indem du die Dateien im Datenverzeichnis schlichtweg kopierst
Beim Zurueckspielen der Dateien hast du das Backup eingespielt.
So machen wir das im Enterprise-Umfeld mit Sicherung aufm Bandlaufwerk.
gepostet vor 16 Jahre, 10 Monate von DrakeL
Da ich das vorher nicht wusste, gehe ich da lieber immer auf Nummer sicher. Hab schon mal Werbepost von Web.de bekommen, sowas nervt. ^^
Aber wenn er Vertrauenswürdig ist, hab keine keinerlei Probleme meine Anschrift zu korrigieren (wenn er mich lässt und mir verzeihen kann ).
gepostet vor 16 Jahre, 10 Monate von DrakeL
@Samson:
Ich kenne diese Vorgehensweise nur mit schlechten Erfahrungen. Jedoch habe ich sowas nur bei DB2 probiert. Sobald man irgendwelche Verzeichnispfade oder sonstige Konfigurationen ändert ist das Backup unbrauchbar.
Des weiteren habe ich Webspace und keinen Zugriff auf diese Dateien direkt.
Unter einem Backup verstehe ich, dass ich die Daten ohne Probleme und besonderen Einstellungen jederzeit wieder herstellen kann. Das einfache Kopieren der Dateien mag schnell sein, aber ist alles andere als ein Backup im eigentlichen Sinne.
Alle meine Datenbanken zusammen haben ungezippt als .sql Datei derzeit 500KB, ich glaube nicht dass ich hier auf Schnelligkeit achten muss.
gepostet vor 16 Jahre, 10 Monate von None
Original von DrakeL
Das einfache Kopieren der Dateien mag schnell sein, aber ist alles andere als ein Backup im eigentlichen Sinne.

Ich will mich nicht mit dir ueber Sinn oder Unsinn von Backupstrategien streiten, sondern wollte nur zeigen das es bei mySQL (bei oracle funktioniert das uebrigens auch nicht ) einen anderen Weg gibt. In mySQL kannst du auch nichts ueber die config einstellen, das diesen Weg ungangbar macht. Habe es auf dem LinuxTag von nem mySQL Entwickler gezeigt bekommen: die machen genau das Backup auf ihren Servern
gepostet vor 16 Jahre, 10 Monate von DrakeL
Ich will auch nicht darüber diskutieren, weil ich nicht genug Ahnung darüber hab um tiefgreifend mit dir zu diskutieren.
Wie gesagt kenne ich die Vorgehensweise aus Versuchen nur bei DB2, und da geht es auf jeden Fall nicht. Wenn es unter MySQL ohne Probleme geht ist es ja eine gute Strategie, dagegen werde ich dann nichts mehr sagen.
Ändert dann aber trotzdem nichts an der Tatsache, dass man als Webspace-Nutzer nicht an die Dateien rankommt, also ist die Diskussion eh für die Katz. ^^

Auf diese Diskussion antworten