CronJob: backup

Bash, Shell, PHP, Python, Perl, CGI
primedomain
Posts: 23
Joined: 2002-08-04 21:36

CronJob: backup

Post by primedomain »

Hallo allerseits,

es geht um folgendes: momentan sichere ich meine Datenbank (ein phpBB Forum :-D ) mit folgendem CronJoB:

Code: Select all

0 13 * * * mysqldump -hlocalhost -uUSER -pPASSWORD DATABASENAME > backup/backup1.sql
Das gleiche Spielchen läuft als eigener cronjob ein paar Stunden später nochmal ab, um eine zweite Sicherung zu haben.
- Was ich nun gerne machen würde, ist nur noch einen Cronjob zu machen, der dann aber alle 6 Stunden ablaufen soll, wobei die jeweils letzte Backup-Datei nicht überschrieben werden soll, sondern es sollen automatisch weitere backup Dateien backup2.sql etc angelegt werden. Kann man das überhaupt "direkt" machen, oder eher per Script und der cronjob startet dann das Script?

- Wie muß ich den mysqldump anpassen, daß ich eine gzip-Datei erhalte?
- Und wie kann ich mit die (gzip)Backupdatei (zusätzlich) per mail schicken lassen?

Danke im voraus

EDIT: es geht um einen Exclusiv-Server
Last edited by primedomain on 2002-08-11 19:23, edited 1 time in total.
floschi
Userprojekt
Userprojekt
Posts: 3247
Joined: 2002-07-18 08:13
Location: München

Re: CronJob: backup

Post by floschi »

Hi !

Ich hätt die Frage im Linuxforum gestellt, da schaut man eher rein...

Spontan würd' ich mal zu einer Skriptlösung tendieren, da tar m.W. nicht zählen kann. (back01,back02,back03,usw.);)

Wenn du zwischen 2 Dateien abwechseln willst -> Skript.

Ciao

Olfi
thomi
Posts: 136
Joined: 2002-06-04 22:33
Location: Waldenbuch

Re: CronJob: backup

Post by thomi »

primedomain wrote:- Was ich nun gerne machen würde, ist nur noch einen Cronjob zu machen, der dann aber alle 6 Stunden ablaufen soll, wobei die jeweils letzte Backup-Datei nicht überschrieben werden soll, sondern es sollen automatisch weitere backup Dateien backup2.sql etc angelegt werden. Kann man das überhaupt "direkt" machen, oder eher per Script und der cronjob startet dann das Script?
Letzteres. Das Skript sieht so aus:

Code: Select all

#! /bin/sh 
NAME=/root/backup/db-$1-`date +%Y%m%d%h%M`.dmp  
mysqldump -f -c --add-drop-table -uroot $1 | gzip -9c >${NAME}.gz
Abspeichern als dump.sh, Rechte mit chmod 755 dump.sh setzen und dann Aufruf mit dump.sh shop, um beispielsweise die Datenbank shop zu sichern. Die Ausgabedatei heißt dann /root/backup/db-shop-200208042157.dmp.gz. Pfade und Namen kann man im Skript einfach anpassen. Hinten kommt zuerst das Datum, dann die Uhrzeit. Bei Bedarf auch den mysqldump-Aufruf mit Usernamen, Passwort und Host anpassen.
- Wie muß ich den mysqldump anpassen, daß ich eine gzip-Datei erhalte?
Siehe oben, ist schon dabei.
- Und wie kann ich mit die (gzip)Backupdatei (zusätzlich) per mail schicken lassen?
Zum Beispiel so:

Code: Select all

uuencode db-shop-200208042157.dmp.gz db-shop-200208042157.dmp.gz | mail admin@domain.tld
Zuletzt noch eine Frage von mir: Warum hast du ins Offtopic-Forum gepostet und nicht ins "Skriptsprachen, Datenbanken und Co", wo dies zweifellos reinpaßt? :wink:
primedomain
Posts: 23
Joined: 2002-08-04 21:36

Re: CronJob: backup

Post by primedomain »

Vielen Dank für Eure Antworten!
thomi wrote:

Code: Select all

uuencode db-shop-200208042157.dmp.gz db-shop-200208042157.dmp.gz | mail admin@domain.tld
gehört das da doppelt rein? (sorry, habe da einfach keine Ahnung)? Falls ich das richtig verstehe, schickt das eine bestimmte backup Datei? Kann man das auch so machen, daß automatisch die unterschiedlichen Backups zusätzlich per mail verschickt werden?
Zuletzt noch eine Frage von mir: Warum hast du ins Offtopic-Forum gepostet und nicht ins "Skriptsprachen, Datenbanken und Co", wo dies zweifellos reinpaßt? :wink:
Tja, erstes Posting und gleich mal dezent das falsche Forum erwischt :P Sorry, hab's einfach nicht gesehen... :roll:
floschi
Userprojekt
Userprojekt
Posts: 3247
Joined: 2002-07-18 08:13
Location: München

Re: CronJob: backup

Post by floschi »

primedomain wrote:Tja, erstes Posting und gleich mal dezent das falsche Forum erwischt :P Sorry, hab's einfach nicht gesehen... :roll:
No problem 8)
thomi
Posts: 136
Joined: 2002-06-04 22:33
Location: Waldenbuch

Re: CronJob: backup

Post by thomi »

primedomain wrote:

Code: Select all

uuencode db-shop-200208042157.dmp.gz db-shop-200208042157.dmp.gz | mail admin@domain.tld
gehört das da doppelt rein? (sorry, habe da einfach keine Ahnung)?
Ja, das eine ist die Datei, die verschickt wird, das zweite der Dateiname, der im Anhang der Mail erscheint (muss nicht zwangsläufig derselbe sein).
Falls ich das richtig verstehe, schickt das eine bestimmte backup Datei? Kann man das auch so machen, daß automatisch die unterschiedlichen Backups zusätzlich per mail verschickt werden?
Klar, dann sieht das Skript so aus:

Code: Select all

#! /bin/sh 
FILE=db-$1-`date +%Y%m%d%H%M`.dmp  
NAME=/root/backup/${FILE}  
mysqldump -f -c --add-drop-table -uroot $1 | gzip -9c >${NAME}.gz
uuencode ${FILE}.gz ${FILE}.gz | mail admin@domain.tld
Jetzt erstellt das Skript die Backup-Datei und verschickt sie anschließend gleicht per E-Mail.
primedomain
Posts: 23
Joined: 2002-08-04 21:36

Re: CronJob: backup

Post by primedomain »

Merci, ich kann das grad nicht ausprobieren, aber bei der Anleitung kann ja eigentlich nichts mehr schiefgehen :)
Rein interessehalber, was bedeutet eigentlich:

Code: Select all

$1 ... -9c 
Gruß
thomi
Posts: 136
Joined: 2002-06-04 22:33
Location: Waldenbuch

Re: CronJob: backup

Post by thomi »

primedomain wrote:Merci, ich kann das grad nicht ausprobieren, aber bei der Anleitung kann ja eigentlich nichts mehr schiefgehen :)
Rein interessehalber, was bedeutet eigentlich:

Code: Select all

mysqldump -f -c --add-drop-table -uroot $1 | gzip -9c >${NAME}.gz
$1 ist der erste Parameter des Skriptes, der dem Datenbankname entspricht. Wenn du also das Skript mit dump.sh shop aufrufst, steht in $1 shop drin. Das wird dann mit dem | auf gzip gepipe't. Der Parameter -9 steht für die beste Kompression, -c bewirkt, dass gzip das gepackte Zeugs auf stdout (die Standard-Ausgabe) ausgibt, was mittles > in eine Datei umgeleitet wird.
sartre
Posts: 327
Joined: 2002-05-12 18:02
Location: Duisburg

Re: CronJob: backup

Post by sartre »

ganz einfach geht das auch mit
http://sourceforge.net/projects/reoback/

vielleicht hilft dir das weiter


Gruß
primedomain
Posts: 23
Joined: 2002-08-04 21:36

Re: CronJob: backup

Post by primedomain »

Code: Select all

#! /bin/sh 
FILE=db-$1-`date +%Y%m%d%H%M`.dmp  
NAME=/root/backup/`date +%Y%m%d`/${FILE}  
mysqldump -f -c --add-drop-table -uroot $1 | gzip -9c >${NAME}.gz
uuencode ${FILE}.gz ${FILE}.gz | mail admin@domain.tld
Kurze Frage noch: kann man das so machen? Die Backup-Dateien sollen nicht alle in ein Verzeichnis /backup gehen, sondern es sollen tagesabhängige Verzeichnisse erstellt werden.
Wenn die Backup auch noch an eine zweite email Adresse gehen soll, kann man die einfach mit einem Komma dranhängen?

sartre: werde ich mir mal anschauen, danke!
thomi
Posts: 136
Joined: 2002-06-04 22:33
Location: Waldenbuch

Re: CronJob: backup

Post by thomi »

primedomain wrote:

Code: Select all

#! /bin/sh 
FILE=db-$1-`date +%Y%m%d%H%M`.dmp  
NAME=/root/backup/`date +%Y%m%d`/${FILE}  
mysqldump -f -c --add-drop-table -uroot $1 | gzip -9c >${NAME}.gz
uuencode ${FILE}.gz ${FILE}.gz | mail admin@domain.tld
Kurze Frage noch: kann man das so machen? Die Backup-Dateien sollen nicht alle in ein Verzeichnis /backup gehen, sondern es sollen tagesabhängige Verzeichnisse erstellt werden.
Fast, so muss es dann aussehen:

Code: Select all

#! /bin/sh
FILE=db-$1-`date +%Y%m%d%H%M`.dmp
DIR=/root/backup/`date +%Y%m%d`/
mkdir ${DIR}
mysqldump -f -c --add-drop-table -uroot $1 | gzip -9c >${DIR}${FILE}.gz
uuencode ${DIR}${FILE}.gz ${FILE}.gz | mail admin@domain.tld
Das Skript erstellt jetzt das Verzeichnis selber (erzeugt beim zweiten Aufruf eine Fehlermeldung, die aber ignoriert werden kann).
Wenn die Backup auch noch an eine zweite email Adresse gehen soll, kann man die einfach mit einem Komma dranhängen?
Statt Komma mit Leerzeichen getrennt dahinter schreiben also

Code: Select all

uuencode ${DIR}${FILE}.gz ${FILE}.gz | mail admin@domain.tld mail2@domain.tld mail3@domain.tld etc.
primedomain
Posts: 23
Joined: 2002-08-04 21:36

Re: CronJob: backup

Post by primedomain »

thomi wrote:Fast
:lol:

Code: Select all

mysqldump -f -c --add-drop-table -uroot $1 | gzip -9c >${DIR}${FILE}.gz
ich nehme an, das erste -c hat die gleiche Bedeutung wie das hintere? Was mich etwas irritiert ist dieses -f -c nach dem mysqldump. Sollte ich das auch bei einem derzeitigen mysqldump einfügen oder hängt das mit dem Script zusammen? Müßte es also so heißen?

Code: Select all

0 13 * * * mysqldump -f -c -hlocalhost -uUSER -pPASSWORD DATABASENAME > backup/backup1.sql
(das mit --add-drop-table ist mir klar).
primedomain
Posts: 23
Joined: 2002-08-04 21:36

Re: CronJob: backup

Post by primedomain »

ich habe es jetzt mal ausprobiert:

Code: Select all

#! /bin/sh 
FILE=db-$1-`date +%Y%m%d%H%M`.sql 
DIR=/homepages/14/xxxxx/htdocs/backup/test/`date +%Y%m%d`/ 
mkdir ${DIR} 
mysqldump -f -c -hlocalhost -uUSER -pPASSWORD $1 --add-drop-table --tables phpbb_auth_access [hier kommen noch die anderen tables] | gzip -9c >${DIR}${FILE}.gz 
uuencode ${DIR}${FILE}.gz ${FILE}.gz | mail mail@domain.com
Funktioniert auch soweit, allerdings habe ich folgendes Problem:
Wenn ich die Datei extrahiert habe und mit einem Editor anschaue, scheint zunächst alles normal zu sein:
# MySQL dump 8.16
#
# Host: localhost Database: dbxxx
#--------------------------------------------------------
# Server version 3.23.47

#
# Table structure for table 'phpbb_auth_access'
#

DROP TABLE IF EXISTS phpbb_auth_access;
CREATE TABLE phpbb_auth_access (
group_id mediumint(8) NOT NULL default '0',
forum_id smallint(5) unsigned NOT NULL default '0',
auth_view tinyint(1) NOT NULL default '0',
auth_read tinyint(1) NOT NULL default '0',
Gegen Ende der Backup Datei tauchen dann aber so Dinge auf wie:
INSERT INTO phpbb_posts_text VALUES (239,'a11557424c','Hier kommt die Antwort!','hallo zusammen!rnrngroßes Sorry);
INSERTReo');
INSETeilnehmern unich all alle s .se ahatte icletter; is Forum
INSEn NY nmmernummerren nich kann m;
INSETO phht ist! und Wie schä auf jedieseilliger alse bist.u das rngr nörh kommrviel zrzählt(207,blem,s zwsgradRT INTfh uesangendr, Gemoch scSERT INTO ptter; ead jiT INTOu irber so ellen, istützunä phpbTfh er axt e
äh? Ist das die gzip Komprimierung, die was durcheinander bringt?
Dann kommen auch noch so Dinge wie:
CREATE TABLE twsnwi1;e 'absag.matmi (
mnvW_66s4155nfc4m"tcrmnvWJ?:.Wismatmi 5eus4bfcl3W197f,n77r366i4m"tcrmnvWJ?:.Wismatmi 5eus4bfc93357m"t4812112,0,n66s359i;
CREATE TABLE twsnwi1;e 'absag.matmi (
äh? Würde mich freuen, wenn mir da jemand weiterhelfen könnte.
majortermi
Userprojekt
Userprojekt
Posts: 916
Joined: 2002-06-17 16:09

Re: CronJob: backup

Post by majortermi »

primedomain wrote:Gegen Ende der Backup Datei tauchen dann aber so Dinge auf wie:
INSERT INTO phpbb_posts_text VALUES (239,'a11557424c','Hier kommt die Antwort!','hallo zusammen!rnrngroßes Sorry);
INSERTReo');
INSETeilnehmern unich all alle s .se ahatte icletter; is Forum
INSEn NY nmmernummerren nich kann m;
INSETO phht ist! und Wie schä auf jedieseilliger alse bist.u das rngr nörh kommrviel zrzählt(207,blem,s zwsgradRT INTfh uesangendr, Gemoch scSERT INTO ptter; ead jiT INTOu irber so ellen, istützunä phpbTfh er axt e
äh? Ist das die gzip Komprimierung, die was durcheinander bringt?
Dann kommen auch noch so Dinge wie:
CREATE TABLE twsnwi1;e 'absag.matmi (
mnvW_66s4155nfc4m"tcrmnvWJ?:.Wismatmi 5eus4bfcl3W197f,n77r366i4m"tcrmnvWJ?:.Wismatmi 5eus4bfc93357m"t4812112,0,n66s359i;
CREATE TABLE twsnwi1;e 'absag.matmi (
äh? Würde mich freuen, wenn mir da jemand weiterhelfen könnte.
Hm, an der Komprimierung kann das eigentlich nicht liegen, ich vermute eher, dass in der Datei Zeichen sind, mit denen dein Editor nicht zurecht kommt (ich kenne das von Joe).
Probier mal aus, ob das genau so aussieht, wenn du dir mit "tail" nur das Ende anzeigen lässt.
Erst nachlesen, dann nachdenken, dann nachfragen... :)
Warum man sich an diese Reihenfolge halten sollte...
primedomain
Posts: 23
Joined: 2002-08-04 21:36

Re: CronJob: backup

Post by primedomain »

MajorTermi wrote:(ich kenne das von Joe).
Probier mal aus, ob das genau so aussieht, wenn du dir mit "tail" nur das Ende anzeigen lässt.
Hab's jetzt mal in WordPad, NotePad, EditPlus angeschaut, überall das gleiche. Leider verstehe ich nicht, was Du mit "tail" meinst...
floschi
Userprojekt
Userprojekt
Posts: 3247
Joined: 2002-07-18 08:13
Location: München

Re: CronJob: backup

Post by floschi »

primedomain wrote:Leider verstehe ich nicht, was Du mit "tail" meinst...

Code: Select all

man tail
sollte helfen :)
primedomain
Posts: 23
Joined: 2002-08-04 21:36

Re: CronJob: backup

Post by primedomain »

Tja, das ist jetzt ein klassischer Fall von Newbie. :-D Wo wie was soll ich mit diesem Code machen? :roll:

Danke!
floschi
Userprojekt
Userprojekt
Posts: 3247
Joined: 2002-07-18 08:13
Location: München

Re: CronJob: backup

Post by floschi »

Ahso.

Wenn du man tail auf der Konsole eingibst, dann rufst du die Manpages zum Befehl tail auf. Darin steht die genaue Anleitung, was du damit machen kannst...

Ciao

Olfi
thomi
Posts: 136
Joined: 2002-06-04 22:33
Location: Waldenbuch

Re: CronJob: backup

Post by thomi »

primedomain wrote:
thomi wrote:Fast
:lol:

Code: Select all

mysqldump -f -c --add-drop-table -uroot $1 | gzip -9c >${DIR}${FILE}.gz
ich nehme an, das erste -c hat die gleiche Bedeutung wie das hintere? Was mich etwas irritiert ist dieses -f -c nach dem mysqldump. Sollte ich das auch bei einem derzeitigen mysqldump einfügen oder hängt das mit dem Script zusammen?
Nein, die Parameter von gzip und mysqldump haben nix miteinander zu tun. Von gzip hatte ich sie ja schon erklärt, von mysqldump bedeutet das -f, dass auch bei Fehler weitergemacht wird, das -c, dass komplette Insert-Statements benutzt werden. Ob das für deinen Dump notwendig ist, mußt du selbst entscheiden. :wink:
primedomain
Posts: 23
Joined: 2002-08-04 21:36

Re: CronJob: backup

Post by primedomain »

Ich habe jetzt noch mal etwas rumgetestet.

Code: Select all

#! /bin/sh 
FILE=db-$1-`date +%Y%m%d%H%M`.sql 
DIR=/homepages/14/xxxxx/htdocs/backup/test/`date +%Y%m%d`/ 
mkdir ${DIR} 
mysqldump -hlocalhost -uUSER -pPASSWORD $1 --add-drop-table --tables phpbb_auth_access [hier kommen noch die anderen tables] | gzip -9c >${DIR}${FILE}.gz 
uuencode ${DIR}${FILE}.gz ${FILE}.gz | mail mail@domain.com
- Die gzip Backup-Dateien auf dem Server sind korrekt. D.h. wenn ich sie manuell per ftp downloade und dekomprimiere, enthalten sie kein "Durcheinander" (sie oben) und sind völlig korrekt.
- Die per Email verschickten gzip-attachments sind dagegen "unbrauchbar". Das verückte ist, daß wenn ich das Script mehrmals hintereinander laufen lasse, das erste attachment korrekt ist, das zweite aber schon nicht mehr. Beim dritten besteht ein Drittel der dekomprimierten Datei aus Müll, bei der vierten noch mehr etc. Die Datei-Größe bei allen attachments ist aber gleich groß.

Hat jemand eine Idee, was da schiefläuft? :(
thomi
Posts: 136
Joined: 2002-06-04 22:33
Location: Waldenbuch

Re: CronJob: backup

Post by thomi »

Hm, bist du dir sicher, dass da tatsächlich Müll drin steht und nicht dein Editor Fehler macht? Wenn ich mit obigen Skript ein Backup ziehe und die Datei danach mittels diff mit der Variante, die auf dem Server liegt, vergleiche, so gibt es keine Unterschiede.
primedomain
Posts: 23
Joined: 2002-08-04 21:36

Re: CronJob: backup

Post by primedomain »

Der Editor dürfte glaube ich nicht das Problem sein. Mir ist noch folgendes aufgefallen:
- die Backup-Dateien auf dem Server haben immer exakt die gleiche Größe (ok).
- die gzip-Datein per email aber haben manchmal dieselbe Größe, manchmal aber auch unterschiedliche (meistens 2-3 kb Unterschied)
- das gleiche gilt für die dekomprimierten Datei.
- manche gzips lassen sich anstandslos öffnen und dekomrimieren, die meisten nicht. Jedenfalls immer die Datei, die als erstes in den automatisch erstellten Ordner gespeichert wird, auch per mail immer korrekt.
- Immer wenn ich eine Datei dekomprimiere, die sich dann als korrupt herausstellt, krieg ich in powerarchiver die Fehlermeldung "There is CRC error on file....". Andererseits tritt der Fehler bei keiner einzigen gzip backup Datei, die ich manuell per ftp übertrage und dekomprimiere.
- wenn ich gzip ganz weglasse, kommt immer alles wunderbar an (aber die Datei ist logischerweise riesig :lol: )
- ich habe gzip mal runtergesetzt auf 1; selbes Problem.

Macht das alles noch irgendwie Sinn? Mich würde ja nicht wundern, wenn es mein Dekomprimierungsprogramm irgendwie verbockt, aber warum sind dann die Dateien unterschiedlich groß und warum kann ich dann die per ftp übertragenen Datein ohne Probleme dekomprimieren? :cry: Ich checks nicht so ganz, aber vielleicht übersehe ich noch irgendwas gaaaaaaaanz offensichtliches... :)
thomi
Posts: 136
Joined: 2002-06-04 22:33
Location: Waldenbuch

Re: CronJob: backup

Post by thomi »

Hm, probier mal, statt gzip bzip2 zu benutzen, also den gzip-Aufruf so ersetzen:

Code: Select all

bzip2 -c >${DIR}${FILE}.gz
Außerdem kannst du mal Base64-Kodierung probieren, also uuencode mit der Option -m aufrufen.

Noch ne Idee: Rufst du das Skript möglicherweise mehrmals per Sekunde auf? Denn die Dateien werden ja nur durch Stunde und Minute unterschieden. :wink:
primedomain
Posts: 23
Joined: 2002-08-04 21:36

Re: CronJob: backup

Post by primedomain »

Danke für Deine Antwort.
Mit der uuencode -m kommt ein langer Zahlen-und-Buchstabenwust direkt als Email (also nicht als attachment):
begin-base64 644 db-dbxxxxxxx-200208102143.sql.gz
H4sIAO5sVT0CA6xd3ZLbNrK+Pn4KblJ1NE7RY/zyJ8lm14mdxLux4/U42ZNT....
Wenn ich bzip2 verwende, weigert sich powerarchiver, die Datei zu dekomprimieren: "It doesn't appear to be a valid archive". Bah!

Das mit mit dem mehrmaligen Aufrufen innerhalb einer Minute habe ich mir auch gedacht 8) . Der Fehler tritt aber auch dann auf, wenn mehere Minuten zwischen dem Start des Skripts liegt.

Und was machen wir jetzt? Powerarchiver oder Server wegschmeißen? :twisted:

Falls Du nicht schon endlos genervt bist von diesem Gemurkse hier :) , darf ich da gleich noch eine Frage anhängen? Ist es möglich, daß in der Betreff-Zeile und im Body der email drinsteht "Backup-Sicherung des Blahblah Forums: Sicherung vom date +%Y%m%d%H%M"? :-D
thomi
Posts: 136
Joined: 2002-06-04 22:33
Location: Waldenbuch

Re: CronJob: backup

Post by thomi »

primedomain wrote:Mit der uuencode -m kommt ein langer Zahlen-und-Buchstabenwust direkt als Email (also nicht als attachment):
begin-base64 644 db-dbxxxxxxx-200208102143.sql.gz
H4sIAO5sVT0CA6xd3ZLbNrK+Pn4KblJ1NE7RY/zyJ8lm14mdxLux4/U42ZNT....
Naja, es ist schon ein Attachment, aber dein Mailreader kommt damit nicht klar.
Wenn ich bzip2 verwende, weigert sich powerarchiver, die Datei zu dekomprimieren: "It doesn't appear to be a valid archive". Bah!
Hm, laut Homepage kann PowerArchiver bzip.
Und was machen wir jetzt? Powerarchiver oder Server wegschmeißen? :twisted:
Nö. Weiter probieren. :wink: Du kannst das Skript ja mal ein bischen modifizieren, so dass kein mysqldump mehr gemacht wird, sondern nur noch Dateien per E-Mail verschickt werden. Also nur noch die uuencode-Zeile. Dann verschicke einen alten Dump, der garantiert korrekt ist. Am besten mehrmals. Tritt dann das Problem mit gzip auch auf?
Ist es möglich, daß in der Betreff-Zeile und im Body der email drinsteht "Backup-Sicherung des Blahblah Forums: Sicherung vom date +%Y%m%d%H%M"?
Klar, mit dem Parameter -s hinter mail, also

Code: Select all

mail -s "Backup-Sicherung des Blahblah Forums: Sicherung vom `date +%Y%m%d%H%M`" mail@domain.com