Hallo Leute, Greiere meine MySQL Backups immer mit den unten angeführten Script. Klappt auch tadellos. Nun möchte ich dieses aber lieber im Zip Format ausführen. Wüsste da jemand eine Lösung für mich? #!/bin/bash getDay=$(date "+%d") getMonth=$(date "+%m") getYear=$(date "+%Y") getHour=$(date "+%H") getMinute=$(date "+%M") getSecond=$(date "+%S") getPassword='123456' getUser='root' Folder='/media/usb0/GenerellesBackup/' Filename='Backup_' Filename=$Filename$getDay'_'$getMonth'_'$getYear'__'$getHour'_'$getMinut e'_'$getSecond'.gz' if [ -d $Folder ]; then echo "Ordner fürs Backup gefunden: $Folder" echo "Erstelle Backup in: $Folder$Filename" sudo /usr/local/mysql4/bin/mysqldump -u$getUser -p$getPassword --all-databases | gzip > $Folder$Filename fi
Den befehl zip statt gzip verwenden Evtl musst du jedoch noch das entsprechende zip package installieren
Nicht ganz so einfach. Das normale Zip kann nur Dateien komprimieren. Das Zip-Archiv enthält den Dateinamen. Entweder zuerst mysqldump in einen temporäre Datei. Oder mit einer der Zip-Libraries ein Programm schreiben, das einen Stream komprimierten kann.
> Nun möchte ich dieses aber lieber im Zip Format ausführen.
Welches Zip genau?
(Du verwendest ja schon ein zip...)
1 | #!/bin/env bash
|
2 | TIMESTAMP=$(date "+%Y-%m-%dT%H-%M-%S") |
3 | getPassword='123456' |
4 | getUser='root' |
5 | PATHFILENM="/media/usb0/GenerellesBackup/Backup_${TIMESTAMP}.gz" |
6 | |
7 | mkdir --path "$(dirname ""${PATHFILENM}"")" |
8 | |
9 | echo "Erstelle Backup in: ${PATHFILENM}" |
10 | sudo \ |
11 | /usr/local/mysql4/bin/mysqldump \
|
12 | -u"${getUser}" -p"${getPassword}" \ |
13 | --all-databases \ |
14 | | gzip > "${PATHFILENM}" |
*gzip vs. zip* gzip ist einfach ein Dateikompressor : er liest einen Datestrom und schreibt ihn neu komprimiert aus. Entspr. kann es auch zwischen stdin und stdout einfach zwischengeschaltet werden (piping). Unter angabe von Dateinamen, kann der Datenstrom von einer Datei gelesen resp.in eine Datei geschreiben werden (der urspr. Dateinamen ist jedenfalls weg). zip ist ein DateiENarchivierer : er fügt mehrere Dateien/Verzeichnisse in eine neue Archivdatei, welche auch für jede enthaltene Datei/Verzeichnis den ursprünglichen Namen/Attribute/usw. mitführt. Für o.g. Anwendung muss also erst das unkomprimierte Backup auf (irgend)einem Speichermedium mit genügend Platz unter einem Dateinamen abgespeichert werden. Erst danach kann Zip sinnvoll archivieren. Nur mit oben aufgeführtem Pfad, hiesse dies dass erst langsam (weil USB) die unkomprimierte Backupdatei geschrieben wird, dann die ganze von USB gelesen und erst zum Schluss komprimiert als Archiv wieder geschrieben wird. (2x unkomp. Datentransfer zuviel!) Der bisherige Ansatz mit gzip in der Pipe ist eleganter und effektiver. Umwege/Tricks/Alternativen sind sicher möglich [1], wird aber aufwändig und hängt von den möglichkeiten des Systems ab (RAM-Menge, freier Speicherplatz, tools) Oder möchtest Du nur am Schluss das .gz in einem Ziparchiv haben? [2] Oder alle .gz Dateien in einem einzigen Ziparchiv sammeln? [2] [1] man zip zeigt ob/wie mit deinem Zip in einer Pipe gearbeitet wird. Oder: erst ein Zip-Archiv (leer oder m. kl. Alibidatei) anlegen und dann RW mounten, dann das Backup direkt reinschreiben (Alibidatei ersetzen) könnte auch eine Strategie sein... [2] da kann Zip aber nix mehr an Kompression rausholen...
Kommandozeile vor dem Frühstück für Alle! schrieb: > [1] man zip zeigt ob/wie mit deinem Zip in einer Pipe gearbeitet wird. Wie würde sowas mit Zip gehen? Es soll eine ZIP Datei sein, weil die dann direkt von einem Windows Programm ausgelesen werden kann. Die Entpackroutine ist im Programm inkludiert und kann keine GZ lesen. (Habe schon versucht, die Datei mit anderer Dateieendung unterzuschieben)
Hast du genug Speicherplatz für einen unkomprimierten Dump?
1 | ... |
2 | |
3 | echo "Erstelle Backup in: ${PATHFILENM}" |
4 | sudo \ |
5 | /usr/local/mysql4/bin/mysqldump \ |
6 | -u"${getUser}" -p"${getPassword}" \ |
7 | --all-databases \ |
8 | > "${PATHFILENM}.sql" |
9 | sudo /usr/bin/zip "${PATHFILENM}.zip" "${PATHFILENM}.sql" |
10 | sudo rm "${PATHFILENM}.sql" |
Bashler schrieb: > (Habe schon versucht, die Datei mit anderer Dateieendung > unterzuschieben) Mit welcher Überlegung kommt man auf sowas? Würde analog das Beschriften eines Baums mit "Auto" zu solcheinem machen? Leider wurde vor Äonen der unsinnige Entscheid in Windows implementiert, Dateien der Namensgebung (Erweiterung)nach Icons anzuzeigen. Dies ist leider nur verwirrende Augenwischerei.
>> [1] man zip zeigt ob/wie mit deinem Zip in einer Pipe gearbeitet wird. > > Wie würde sowas mit Zip gehen? Zu jedem vollständig installierten Befehl zeigt "man" das Manual (manual pages) an. Also tippe:
1 | man zip |
Wieso alles so umständlich? Ist doch bloß eine Datei.
1 | #!/bin/bash
|
2 | Folder='/media/usb0/GenerellesBackup/' |
3 | Pass='123456' |
4 | User='root' |
5 | File=`date "+Backup_%Y_%m_%d_%H_%M_%S.zip"` |
6 | |
7 | if [ -d "${Folder}" ]; then |
8 | mkfifo db.sql |
9 | sudo /usr/local/mysql4/bin/mysqldump -u${User} -p${Pass} --all-databases > db.sql & |
10 | zip -FI "${Folder}/${File}" db.sql |
11 | rm -f db.sql |
12 | fi
|
BOFH schrieb: > Wieso alles so umständlich? Ist doch bloß eine Datei. Falsch. Oben ist es eine Datei, bei dir sind es aber (temporär) zwei, die viel mehr Speicherplatz benötigen.
T.roll schrieb: > Falsch. Oben ist es eine Datei, bei dir sind es aber (temporär) zwei, > die viel mehr Speicherplatz benötigen. [ ] Ich weiß über fifo Bescheid [ ] Ich behaupte einfach mal irgendwas Mach doch bitte mal ein Kreuzchen...
BOFH schrieb: > Mach doch bitte mal ein Kreuzchen... Aber gerne! [X] Ich habe die Zeile mit mkfifo übersehen. :)
Wow! Ich erinnere mich dunkel; bei der Ausbildung hatten die mal was von mkfifo erzählt. Hätte nie gedacht, dass irgend jemand ein Beispiel findet, in dem Named Pipes besser als Sockets sind.
Wie funktioniert das mit dem mkfifo? Wird da nicht alles temporär in den Arbeitsspeicher ausgelagert?
Kurzer schrieb: > Wird da nicht alles temporär in den Arbeitsspeicher ausgelagert? Nein. "writes" auf der einen Seite blockieren, wenn die andere nicht schnell genug "read"et. Wie bei sockets/pipes auch (cat irgendwas_schnelles|langsames_cmd). es gibt das tool "buffer", das man in die Pipe hängen kann, wenn man mehr RAM zum Zwischenspeichern verwenden möchte.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.