MySQL Dump bei stderr nicht komprimieren

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
macos
Beiträge: 28
Registriert: 14.10.2011 17:23:19

MySQL Dump bei stderr nicht komprimieren

Beitrag von macos » 19.10.2016 17:30:28

Hallo Freunde der Kommandozeile,

ich führe mit Hilfe von "mysqldump" relgelmäßig ein Datenbank Backup durch. Hierbei prüfe ich zudem über den stderr Stream ob ein Fehler passiert ist (zB wenn der MySQL Server down ist) und schreibe die Error Message in eine tmp Datei.

Nun will ich zusätzlich, bei einem erfolgreich ausgeführten dump, die Backupdatei mit gzip komprimieren. Es klappt auch soweit alles, solange kein Fehler passiert. Wenn ich den MySQL Server abschalte und den Dump ausführe schreibt der mit eine leere gz Datei. Eigentlich soll hier überhaupt keine gz Datei erstellt werden sondern nur der Fehler in die tmp Datei geschrieben werden.

Weiß jemand wie man nach dem stderr Stream (also bei einem Fehler) alles ab dem pipe abbricht so das keine gz Datei geschrieben wird und nur die tmp Datei mit der Error Message erstellt wird?

Code: Alles auswählen

mysqldump -h "localhost" -u "root" --password="" "mydatabase"  2> "/path/errDE35.tmp" | gzip -9 > "/path/dump-db.sql.gz"

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: MySQL Dump bei stderr nicht komprimieren

Beitrag von heisenberg » 19.10.2016 19:10:28

Das gar keine Datei geschrieben wird, ist wahrscheinlich nicht zielführend. Der Fehler kann ja erst auch mitten im Prozess auftreten. Deswegen kann man z. B. erst eine Temp-Datei schreiben und diese je nachdem ob's geklappt hat oder nicht löschen oder umbenennen in die richtige Backupdatei.

Code: Alles auswählen

set -o pipefail
if mysqldump -h "localhost" -u "root" --password="" "mydatabase"  \
     2> "/path/errDE35.tmp" | gzip -9 > "/path/dump-db.sql.gz.tmp" ;then
     mv "/path/dump-db.sql.gz.tmp" "/path/dump-db.sql.gz"
else
     rm "/path/dump-db.sql.gz.tmp"
fi
pipefail
man bash hat geschrieben: The return status of a pipeline is the exit status of the last command, unless the pipefail option is enabled.
If pipefail is enabled, the pipeline's return status is the value of the last (rightmost) command to exit with a
non-zero status, or zero if all commands exit successfully. If the reserved word ! precedes a pipeline, the
exit status of that pipeline is the logical negation of the exit status as described above. The shell waits for
all commands in the pipeline to terminate before returning a value.
Ansonsten gibt's da auch noch Debianautomysqlbackup

Antworten