We are in the process of migrating this forum. A new space will be available soon. We are sorry for the inconvenience.

Cronjob für Datenbank-Backup?


isnichgenug
30.11.13, 05:49
Hallo noch einmal!

Mir ist aufgefallen, dass das Script nicht unbedingt "sinnvoll" die älteren Daten löscht, sondern irgendwie querbeet. Ist wem dies Phänomen auch aufgefallen?
Ich frage mich gerade, wie man daher das Script so umschreiben kann, dass es nicht sinnlos irgendwelche Backups löscht, sondern wirklich immer nur den fortlaufenden letzten 4.ten Tag. Denn ich habe das Script ja angewiesen, nur 72 Dateien zu behalten. Das sind bei dem stündlichen Backup also 3 Tage.
Wie gesagt behält das Script aber nicht immer die letzten 3 Tage.

Kann man das Script dahingehend umschreiben?
Vielen Dank!

Lg, isnichgenug

isnichgenug
31.10.13, 13:56
Huhu KS16G!
Ich danke Dir vielmals, genau das war es!
Alles läuft nun wie gewünscht und ich danke Dir sehr für Deine Hilfe!!!
Einfach wunderbar! Klasse!

@ "sqlDumper": kenne ich, funktioniert, aber ist nicht wünschenswert. Ich wusste schon, warum ich eine PhP-Lösung wünschte. ;-)

Ich bedanke mich nochmals sehr und verbleibe nun mit besten Grüßen,
isnichgenug. ^^

EDIT:
Falls wer wie ich noch die deutsche Zeitunterstützung wünscht, setzt an erster Stelle (nach ) folgendes:
Code:
setlocale (LC_ALL, 'de_DE');
und sucht diese Zeile:
Code:
$datei = "name-der-datenbank".date("Y\-m\-d\_-_H",time())."uhr".date("i",time()); // Dateiname aus Datum und Uhrzeit bilden
Einfach dann ersetzen mit:
Code:
$datei = "name-der-datenbank_". strftime("%A_%d.%m.%Y_%T",time()); // Dateiname aus deutschem Datum und Uhrzeit bilden
Fertig.

KS16G
31.10.13, 12:29
Der TE hat nur ein shared-Hosting, ob da der MYSQLDumper läuft ist fraglich.
Darum fand hier die php lösung verwendung.
Aber Danke für den Hinweis auf den Dumper

Altenholzer
31.10.13, 12:10
Also ich benutzte für Datenbank Backups immer MYSQLDumper finde ein geniales Tool,ob das was für dich ist kannst ja mal checken.

Obwohl Cronjob läuft über Perl

KS16G
31.10.13, 10:38
@isnichgenug:
Funktioniert das jetzt so für dich, oder sind noch fehler drin?

KS16G
30.10.13, 16:14
Done.

Hier der funktionierende Bereich.
system("/usr/bin/mysqldump -u$user -p$pass -h localhost $database | gzip > ".dirname(__FILE__)."$path/$datei", $fp);

if ($fp==0) echo "Backup Erfolgreich!";
else echo "Es ist ein Fehler aufgetreten!";

// und Meldung, dass fertig!
'.$meldung.
Ich muss bei mir die letzte Zeile drinenlassen, ob du sie löschen kannst, musst du ausprobieren. (Bei mir kann es eine abhängigkeit von anderen .php´s sein)

Jetzt wird ganz unten in Backup Erfolgreich! oder Fehler Aufgetreten!
angezeigt.

isnichgenug
30.10.13, 15:43
Das wäre echt genial von Dir, danke!

KS16G
30.10.13, 15:39
Schön das es funktioniert.
Ich habe das skript aus meinem projekt rauskopiert und dabei vergessen das zu korrigieren, entschuldige.
Den gesammten teil mit der Rückmeldung kanste rausnehmen, wenn du den nicht brauchst.
Ich habe dir die Datei mit der Rückmeldung gegeben, für den Fall das du das auch Händisch machen willst.
Warum allerdings die Rückmeldung nicht geht ....?? Ich schaue mal nach, kann ne änderung im php-script sein, aber wie gesagt, ich prüfe das mal.

isnichgenug
30.10.13, 15:19
Ja es funktioniert. ^^
Aber habe da noch einmal eine Frage.
Wenn das Script beendet ist, steht immer noch geschrieben:
"Backup wird ausgeführt..."
Sollte aber dann nicht "Backup erfolgreich!" stehen?

Mich irritiert im Script auch dieses:
Code:
if ($fp==0) $meldung = "Backup erfolgreich!"; else $meldung = "Es ist ein Fehler aufgetreten!";

// und Meldung, dass fertig!
'.$meldung.
Ist denn der letzte Absatz mit "meldung" so richtig?

Sind nur Kleinigkeiten, das Script als solches funktioniert prima. Danke hierfür.
Wenn aber jemand noch Lust hat mit mir diese Kleinigkeiten zu bereinigen, fände ich das total nett!
Dankeschön für alles soweit!!!!!!!

EDIT
Zeile 88: "localhost" habe ich übrigens ausgetauscht, da dies falsch ist. (script funktionierte sonst nicht)
Habs mit der Variabel(?) $host und entsprecher Zeile am Anfang des scripts bereinigt.

KS16G
30.10.13, 14:58
Ich habe obiges skript selber am laufen, zwar auf nem dedi. aber es lief auch schon auf V-Servern.

Ob das natürlich auch auf nem shared-hosting läuft kann ich nicht sagen, hängt ja von der konfig des hostings ab.
Allerdings ist "system" ein gebräuchlicher aufruf eben für solche zwecke wie mysql-backup via PHP.

@panda: Obiges skript wird nicht durch ein time-out beendet werden, eben weil es durch "system" aufgerufen wird. Du hast also absolut recht.

J-B
30.10.13, 14:53
Wenn es funktioniert, dann ist doch alles bestens

isnichgenug
30.10.13, 14:51
Naja wie gesagt, ich kenne mich in Sachen "Cronjob" absolut nicht aus.
Hat sonst wer noch einen guten Ratschlag für eine automatisierte Datenbank-Sicherung?

J-B
30.10.13, 14:46
ovh erlaubt "system" in php? Nicht schlecht

isnichgenug
30.10.13, 14:38
Danke KS16G, genau das was ich gesucht habe, mit Autodelete & Co!

Um Euch zu erklären, warum PHP:
Ich greife via Manager als auch MoM auf mein Shared Hosting (Basic) zu.
Daher verlangt MoM eine php Seite zum Ausführen des Cronjobs.
Denke ich jedenfalls, denn ich kenne mich damit nicht wirklich aus.

Falls aber wer einen besseren Vorschlag hat, immer heraus damit!

panda
30.10.13, 14:30
Zitat Zitat von J-B
Zuverlässig ist es aber nicht per PHP Script ein Backup zu machen. Je nachdem wie groß deine Datenbank ist, kann dein Script auf ein Timeout enden.
Wäre aber bei obigem PHP Script eigentlich egal, da -man möge mich korrigieren - der system Aufruf bei einem Timeout nicht abgebrochen wird (bzw. es PHP-seitig gar nicht erst zu einem Timeout kommt). Etwas anderes wäre es, wenn PHP die Daten selber lesen und schreiben würde.

Abgesehen davon erschliesst sich mir aber auch nicht, warum man hierfür extra via PHP gehen sollte, aber jeder wie er mag.

J-B
30.10.13, 14:19
Zuverlässig ist es aber nicht per PHP Script ein Backup zu machen. Je nachdem wie groß deine Datenbank ist, kann dein Script auf ein Timeout enden.

KS16G
30.10.13, 14:02
$user = 'db-benutzer'; // Name
$pass = 'db-passwort'; // Passwort
$database = 'db-name'; // zu sichernde Datenbank
$unixpfad="../backup"; //Pfad zum Backup-speicher
$path = '/data/'; // Backup Ordner
$number_of_files = '48'; // mehr als x Dateien löschen (Autodelete)


// checke Backupordnergrösse
function dirsize($dir){
$dirsize=0;
$handle=opendir ($dir);
while (false !== ($file = readdir ($handle))) {
$dirsize+=filesize($dir.$file);
}
closedir($handle);
return $dirsize;
}


// Starte Output
echo '


MySQL Backup



MySQL Backup


Konfiguration:

Sicherung Datenbank: '. $database .'

Auto-Löschen aktiviert: +'.$number_of_files.' Dateien

GZip-Komprimierung: aktiv

Backups gesamt: '.round(dirsize("$unixpfad$path")/(1024*1024),2).' MB



Backup wird ausgeführt...

|




Files im Directory:';


// Backupverzeichnis erstellen, falls noch nicht existient!
if (!is_dir($unixpfad.$path)) mkdir($path, 0777);
$dh = opendir($unixpfad.$path);
while (false !== ($filename = readdir($dh)))
{
if ($filename != "." && $filename != "..") $files_unlink[] = $filename;
echo"
$filename
";

}

@rsort($files_unlink);

if (sizeof($files_unlink) >= $number_of_files)
{
for($n=sizeof($files_unlink)-1; $n>=$number_of_files; $n--)
{
unlink($unixpfad.$path.$files_unlink[$n]);
}
}

// Backup erstellen

$datei = "name-der-datenbank".date("Y\-m\-d\_-_H",time())."uhr".date("i",time()); // Dateiname aus Datum und Uhrzeit bilden
$datei .= ".gz";
if (file_exists($datei)) unlink($datei);

$path = str_replace(".", "", $path);

system("/usr/bin/mysqldump -u$user -p$pass -h localhost $database | gzip > ".dirname(__FILE__)."$path/$datei", $fp);
if ($fp==0) $meldung = "Backup erfolgreich!"; else $meldung = "Es ist ein Fehler aufgetreten!";

// und Meldung, dass fertig!
'.$meldung.




';

?>
Kein Problem.
Dann könntest du obige zeilen nehmen, packst die in eine .php (den namen kannst du dir aussuchen), passt die werte/parameter an und rufst diese datei per cronjob auf.

isnichgenug
30.10.13, 13:49
Huhu und danke für Deine Antwort. Leider hilft das nur zur Hälfte weiter. Ich suche eine PHP-Lösung und habe meinen Themenstart entsprechend angepasst.
Entschuldige dass ich mich etwas unklar ausgedrückt hatte.
Danke.

Lg...

KS16G
30.10.13, 13:43
Da findeste ein script, welches dir je nach cronjob-einstellung backups macht.
Allerdings löscht das skript nach anzahl der vorzuhaltenden Backups, nicht nach alter (zeit).

Evtl. hilft dir das ja weiter

isnichgenug
30.10.13, 12:14
Hallöchen!

Ich habe ein für mich sehr großes Problem, für das ich bereits mehrere Stunden vergeudet und letztendlich wieder alles an Versuchen gelöscht habe und jetzt auf Hilfe von Euch hoffe.
Es geht eigentlich um etwas sehr simples: Datenbankbackup per Cronjob als PHP Datei.
Also ich weiß wie man via MoM einen solchen einrichtet und wie man mit php umgeht.
Das wars auch schon.
Ja ich weiß, es gibt viele Scripts, aber keines aus dem Internet will richtig bei mir funktionieren.
Das von OVH angegebene Beispielscript funktioniert zwar, aber generiert ein leeres Backup.
KRISE!

Dazu kommt dann noch, dass ich eine stündliche Ausführung wünsche, die auch via MoM klappt, aber ich nicht weiß, wie ich Backups "jünger als 10 Minuten" löschen kann, damit ich als Test sehen kann, dass das Script auch wirklich die Dateien dann löscht.
Da gibt es ja was mit "mtime", was aber auch nicht so recht bei mir will.

Also bei mir gibt es nun ein großes Durcheinander und ich weiß absolut nicht, was ich nun als Script schreiben soll.
Ich kann zwar php, aber größtenteils nur Halbwissen und im copy&paste Verfahren.

Könnte mir jemand von Euch helfen und mir sagen was ich zu tun habe für folgendes?
- Backup-Datei, stündlich, mit Datum und Zeit (wichtig!)
- Backup NUR als gzip
- Dateien jünger als 10 Minuten, sollen automatisch bei Ausführung des Scripts gelöscht werden (zum testen ob es auch wirklich löscht!)
- ggfs. CHMOD Angaben, damit die Öffentlichkeit nicht die Backups "sieht", aber MoM noch darauf zugreifen kann.

Mag mir wer helfen?
Ich wäre wirklich sehr sehr dankbar für eine Unterstützung!!!

Lg, isnichgenug