Frage an die Bash Experten. SQL Sicherung unter Raspian Jessie.

Gast #4509179
Lesenswert?

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
Gast #4509235
Lesenswert?

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.
Gast #4509263
Lesenswert?

> 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...
Gast #4512114
Lesenswert?

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)
Gast #4512311
Lesenswert?

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"
Gast #4512613
Lesenswert?

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.
Gast #4512621
Lesenswert?

>> [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
Gast #4512924
Lesenswert?

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
Gast #4513915
Lesenswert?

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.
Gast #4575935
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren