Mysql Datenbank Backup ?

Nicolas Glauser

Angesehenes Mitglied
Ich habe ein kleines Problem und zwar möchte ich von meiner Mysql datenbank ein regelmässiges Datenbank update machen, dass zum beispiel immer um 03:00 uhr die Datenbank gespeichert wird. Was kennt ihr da für scripte??
 
Denke das du dies mit PHP lösen kannst. Schau mal unter www.hotscripts.com nach. Dort solltest du eigentlich so ein Script finden können.
Hast du auf deinem Server CronJobs zur Verfügung? Wird wohl nötig sein, wenn du ein zeitlich gesteuertes Script einbauen möchtest.
 
also mit php ist dies nur machbar, wenn du die scripts irgendwie starten kannst, von alleine tun sie's nicht. entweder benutzt du diese "cronjobs" (kenn ich selber nicht, werd mich mal informieren müssen
rolleyes.gif
), oder du baust in eine gut besuchte website ein kleines script ein, welches bei jedem aufruf überprüft, ob schon 03:00 am heutigen datum gewesen ist und ob das backup noch nicht ausgeführt wurde und startet dann das script... das wär ein möglicher workaround.

hoffe das hilft.
smile.gif

gr33tz

j0sh
 
Na ja, die Lösung mit den kleinen Script funktioniert ja schon, ist aber meiner Meinung nach ein bisschen unsinnig. Mit einem Cronjob kannst du ein bestimmtes File zu einem bestimmten Zeitpunkt aufrufen lassen.
Gibt auch Anbieter, über welche man solche Cronjobs kostenlos erstellen kann. Musst also nicht auf deinen Provider angewiesen sein.
 
@ webi:

kannst du mir einen solchen cronjob anbieter nennen? danke.
smile.gif
 
Sorry Josh ;-)

Cronjobs sind eigentlich klar, sicher besser als irgendwelche vom Client ausgeführten Scripts. Lies dich ein, wenn dein Provider diese Unterstützt, nutzte sie, hatte bis vor kurzem auch keine Ahnung -> Cron ist sehr mächtig ;-)

Aber zurück zur eigentlichen Frage. Mysql backuppen. Von welcher Grössenordnung von Daten reden wir? Wenns wenige Daten sind, kann ich dir das empfehlen. Ist von ? Ich glaube hier http://www.normsland.co.uk/phpmybackup/ habs ein wenig angepasst, funktioniert wunderbar.

QUOTE <?
// mySQL - variables
$dbhost="localhost";
$dbuser="root";
$dbpass="";
$dbname[]="dbname";
//$dbname[]="usr_web24_2";

// number of backups to keep
$backups = 100;

// hours between backups
$interval = 72;

// 1 only with ZLib support, else change value to 0
$compression = 1;

// full path to phpMyBackup
$path = $_SERVER['DOCUMENT_ROOT']."/backup/";


flush();
$conn = mysql_connect($dbhost,$dbuser,$dbpass)
or die(mysql_error());
$path = $path . "dump/";
//if (!is_dir($path)) mkdir($path, 0777);

function get_def($dbname, $table) {
global $conn;
$def = "";
// $def .= "DROP TABLE IF EXISTS $table;\n";
$def .= "CREATE TABLE $table (\n";
$result = mysql_db_query($dbname, "SHOW FIELDS FROM $table",$conn);
while($row = mysql_fetch_array($result)) {
$def .= " $row[Field] $row[Type]";
if ($row["Default"] != "") $def .= " DEFAULT '$row[Default]'";
if ($row["Null"] != "YES") $def .= " NOT NULL";
if ($row[Extra] != "") $def .= " $row[Extra]";
$def .= ",\n";
}
$def = ereg_replace(",\n$","", $def);
$result = mysql_db_query($dbname, "SHOW KEYS FROM $table",$conn);
while($row = mysql_fetch_array($result)) {
$kname=$row[Key_name];
if(($kname != "PRIMARY") && ($row[Non_unique] == 0)) $kname="UNIQUE|$kname";
if(!isset($index[$kname])) $index[$kname] = array();
$index[$kname][] = $row[Column_name];
}
while(list($x, $columns) = @each($index)) {
$def .= ",\n";
if($x == "PRIMARY") $def .= " PRIMARY KEY (" . implode($columns, ", ") . ")";
else if (substr($x,0,6) == "UNIQUE") $def .= " UNIQUE ".substr($x,7)." (" . implode($columns, ", ") . ")";
else $def .= " KEY $x (" . implode($columns, ", ") . ")";
}

$def .= "\n);";
return (stripslashes($def));
}

function get_content($dbname, $table) {
global $conn;
$content="";
$result = mysql_db_query($dbname, "SELECT * FROM $table",$conn);
while($row = mysql_fetch_row($result)) {
$insert = "INSERT INTO $table VALUES (";
for($j=0; $j<mysql_num_fields($result);$j++) {
if(!isset($row[$j])) $insert .= "NULL,";
else if($row[$j] != "") $insert .= "'".addslashes($row[$j])."',";
else $insert .= "'',";
}
$insert = ereg_replace(",$","",$insert);
$insert .= ");\n";
$content .= $insert;
}
return $content;
}

if ($compression==1) $filetype = "sql.gz";
else $filetype = "sql";

//if (filemtime($path . "0.$filetype") < time() - $interval * 3600 && !eregi("/restore\.",$PHP_SELF)) {



$cur_time=date("Y-m-d H:i");
$newfile="# Dump created with 'phpMyBackup v.$version' on $cur_time\r\n";
while (list(,$val) = each($dbname)) {

//alte backups renamen
for ($i = $backups-1; $i > 0; $i--) {
$j = $i-1;
$oldname = $path.$val. $j . ".$filetype";
$newname = $path.$val. $i . ".$filetype";
@rename($oldname,$newname);
}

//backuppen
$tables = mysql_list_tables($val,$conn);
$num_tables = @mysql_num_rows($tables);
$i = 0;
while($i < $num_tables) {
$table = mysql_tablename($tables, $i);

$newfile .= "\n# ----------------------------------------------------------\n#\n";
$newfile .= "# structur for table '$table'\n#\n";
$newfile .= get_def($val,$table);
$newfile .= "\n\n";
$newfile .= "#\n# data for table '$table'\n#\n";
$newfile .= get_content($val,$table);
$newfile .= "\n\n";
$i++;
}

if ($compression==1) {
$fp = gzopen($path.$val."0.$filetype","w9");
// $fp = tmpfile();
gzwrite ($fp,$newfile);
gzclose ($fp);
echo '<h3>Dem Backup ischt geschrieben in <br>'.$path.$val."0".$filetype.'</h3>';
} else {
$fp = fopen ($path.$val."0.$filetype","w");
fwrite ($fp,$newfile);
fclose ($fp);
}
}
?>
 
Jetzt meine Gegenfrage, oder erweiterte Frage von mir aus.

Kann ich direkt auf dem Server die Mysql Dateien (wo sind die btw, konnte sie nicht mehr finden) einfach saugen, sie auf einen anderen Server hochladen, und gut? Das wäre logischerweise viel schneller, als alles z.B. mit diesem Script zu backuppen, und dann alle Queries am andern Ort wieder in die Datenbank zu schreiben?

Funktioniert das theoretisch? Und wo speichern die Apachen ihre Mysql Binaries so idR?

thx alain
 
Hallo

Die db Dateien direkt von einem Server zum anderen funktioniert nur dann sicher, wenn auf beiden Servern dieselbe mysql Version läuft. Ich empfehle dir immer den weg über den Dump zu gehen. Die SQL Scripts lassen sich ja ausgezeichent komprimieren und von einem Server zum anderen schieben.

Tipp: rsync, dann werden jeweils nur die Änderungen seit dem letzten Sync kopiert. Nur sollte dann das Script nicht komprimiert vorliegen. (Der Transfer selbst ist dann natürlich komprimiert und verschlüsselt.)

Ahh die Position im Filesystem: normalerweise /var/lib/mysql/ und dann der DB Name...

Gruss
Roger
 
Mal eine Anfängerfrage: Was ist die beste Strategie, grosse Datenbanken zu dumpen? Mit dem phpmyadmin-Export stösst man sehr schnell an seine Grenzen...
 
Mit mysqldump in der Shell.

Mit dem Webfrontends hat man ja immer das Problem, dass Sie wegen zu hoher Ausführungszeit stoppen. Und gestückelt rausholen oder einfügen.....kanns ja nicht sein. Alternativ könnte man natürlich auch die maximale Scriptausführungszeit erhöhen. Sollte irgendwo im php.ini zu finden sein.

QUOTE sirius:~/backup# grep -in 30 /etc/php4/apache/php.ini
137:max_execution_time = 30 ; Maximum execution time of each script, in seconds


oder eben mit mysqldump:


CODE mysqldump -u dbuser --password=passwd --add-drop-table --result-file=/backup/sql/sirius_all_db.sql -A

Damit wird der gesamte DB Inhalt in das sirius_all_db.sql geschrieben. Braucht aber einen ssh Zugang. Ob das bei Standartwebhoster dabei ist, weiss ich auch nicht.

Und wenn ich schon dabei bin, unsere Backupstrategie zu "verraten":


CODE rsync -e "ssh " -avzp /backup/sql/sirius_all_db.sql rsync@anderer.host.com:/backup/sql/

Damit das Script auf einem anderen Host sichern. Und klar, das ganze muss vom cron gerufen werden.

btw: merkt man, dass ich gerade an der Backupdokumentation arbeite ??
cool.gif


Gruss
Roger
 
Hehe, hab an dich gedacht, als ich das gefragt habe ;-)

Das es das gibt hab ich sehr stark vermutet. Jetzt weiss ich sogar wie es geht ;-))

Danke.
 
my way:

CODE
<?php
$dbhost = '';
$dbuser = '';
$dbpass = '';
$dbname = '';


$savepath = $DOCUMENT_ROOT . "/backup";
$filename = "$savepath/timestamp_oder_watt_weiss_ich.sql";
passthru("mysqldump --opt -h$dbhost -u$dbuser -p$dbpass $dbname >$filename");
?>

 
Hallo zusammen
Bei mir ist die sql datei leer wenn ich c-e Lösung nehme... Braucht der Hoster etwas spezielles?

Herzlichen Dank
 
Hallo

Evt hat der Webserver Benutzer auch nicht die Rechte, mysqldump auszuführen. Fragen die zur Lösung helfen könnten:
-Gibts eine Fehlermeldung ?
-User- und Passwortangaben stimmen ?

Gruss
Roger
 
Nein es gibt keine Fehlermeldung
Und Passwort und User stimmen...

Da sind es sehr wahrscheinlich die Rechte :-(
 
grosse datenbanken dumpen geht auch so:

#!/bin/bash

zcat /home/www/DEINACCOUNT/restore/forum.sql | mysql --force -u DEINACCOUNT
-pPASSWORT DBNAME
echo "Content-Type: text/plain"
echo ""
echo "erledigt."

super provider mache es auch gratis,
geizistgeilhoster verlangen 20 bis 30.- dafür.
 
Unter der voraussetzung das ein zugriff per Telnet / SSH besteht würde ich ein Backup über cron laufen lassen und dürfte mit einem script a la Cybermax auch funktionieren. Bitte fragt mich nicht nach dem Code
sad.gif
bin kein programierer habe nur etwas Sybase Sql erfahrung. Es dürfte sich aber auch mit MySql machen lassen.
So wie das posting von Cybermax aussieht ist dies bereits ein Script das per cronjob aufgerufen werden kann.
 
@cybermax: Ich glaube nicht, dass dies ein Backup macht. Das ist doch ein Restore.....

QUOTE zcat /home/www/DEINACCOUNT/restore/forum.sql | mysql --force -u DEINACCOUNT
-pPASSWORT DBNAME

Aus meiner Sicht wird da das forum.sql (welches vom Namen her eigentlich nicht gezippt ist) in die mysql Datenbank "geschoben".
 
Zurück
Oben