Forum: PC Hard- und Software Raspberry PI 3: MySQLDump versagt.Es wird kein Fehler zurückgegeben.


von FFFF (Gast)


Lesenswert?

Hallo Leute,

Letzte Woche hat mein Serverchen den Geist aufgegeben.(Mein Fehler)
Allerdings ist mir dabvei was aufgefallen:
Ich starte jeden Tag einen Cronetab, welcher mir ein Script ausführt um 
den
MySQL Server zu sichern.
Das hat er auch versucht, allerdings war der MySQLServer down.
Er hat zwar ein Archiv erstellt, die SQL Datei darin hat aber eine
Grösse von 0 byte.
Leider komme ich da aber an keinen Fehlercode dran.

Muss ich als erstes einen Dump ausführen und danach erst das Archiv 
erstellen?

mfG
FFFF


Scriptauszug:
LogDate=$(date "+%A %d.%m.%Y %H:%M:%S")
FileDate=$(date "+%Y_%m_%d_%H_%M")
echo "$LogDate : Create MySQL dump under: $Folder$Filename$FileDate.gz"
echo "$LogDate : Create MySQL dump under: $Folder$Filename$FileDate.gz" 
>>$Folder$LogFileName
sudo /usr/local/mysql4/bin/mysqldump -u$User -p$Password --all-databases 
| pigz --best > $Folder$Filename$FileDate'.gz'
LogDate=$(date "+%A %d.%m.%Y %H:%M:%S")
if [ $? -ne 0 ]; then
    echo "$LogDate : Error creating SQL Stream" >>$Folder$LogFileName
    echo "$LogDate : Error creating SQL Stream"
else
    echo "$LogDate : SQL Dump OK" >>$Folder$LogFileName
    echo "$LogDate : SQL Dump OK"
fi

von c.m. (Gast)


Lesenswert?

$? enthält den returnwert des date befehls

von randy (Gast)


Lesenswert?

hallo,

der erste ansatz waere ein "set -x" im bash script, um
zu sehen ob alle variablen sauber im mysqldump call erscheinen.

danach mal ohne pigz arbeiten und in eine normale datei schreiben.

ich vermute das der dump ansich schon nichts ausgibt, sondern ein
fehler kommt.


HTH,
-- randy

von Peter II (Gast)


Lesenswert?

Ich würde zur Sicherheit immer noch mal schauen was im dem Zip gelandet 
ist. Im einfachsten fall reicht schon die Größe zu prüfen, es sollen 
z.b. nicht mehr als 10% zum letzten backup abweichen.

Oder die Zeit messen wenn das Backup nur 10 Sekunden braucht, stimmt 
etwas nicht.

von Daniel A. (daniel-a)


Lesenswert?

Bei mysqldump, warum musst du den ganzen Pfad angeben, und warum setzt 
du ein sudo davor?

Sudo könnte fehlschlagen, oder das Passwort von mysqldump.

Tipp, dashier:
1
sudo /usr/local/mysql4/bin/mysqldump -u$User -p$Password --all-databases | pigz --best > $Folder$Filename$FileDate'.gz'
2
LogDate=$(date "+%A %d.%m.%Y %H:%M:%S")
3
if [ $? -ne 0 ]; then

Würde ich so schreiben: (Gegebenenfalls muss man PATH setzen)
1
LogDate=$(date "+%A %d.%m.%Y %H:%M:%S")
2
if ! mysqldump -u$User -p$Password --all-databases \
3
   | pigz --best > "$Folder$Filename$FileDate.gz"
4
then

von FFFF (Gast)


Lesenswert?

Daniel A. schrieb:
> LogDate=$(date "+%A %d.%m.%Y %H:%M:%S")
> if ! mysqldump -u$User -p$Password --all-databases \
>    | pigz --best > "$Folder$Filename$FileDate.gz"
> then

Aktueller Code:
if ! mysqldump -u$User -p$Password --all-databases \
   | pigz --best > "$Folder$Filename$FileDate.gz"
then
   LogDate=$(date "+%A %d.%m.%Y %H:%M:%S")
   echo "$LogDate : Error creating SQL Stream" >>$Folder$LogFileName
   echo "$LogDate : Error creating SQL Stream"
else
   LogDate=$(date "+%A %d.%m.%Y %H:%M:%S")
   echo "$LogDate : SQL Dump OK" >>$Folder$LogFileName
   echo "$LogDate : SQL Dump OK"
fi



Ausgabe aber leider:
/usr/local/sbin/MySQLBackup.sh: Zeile 43: mysqldump: Kommando nicht 
gefunden.
Mittwoch 10.08.2016 08:26:36 : SQL Dump OK


Zeile 43:
if ! mysqldump -u$User -p$Password --all-databases \

von SR (Gast)


Lesenswert?

Dann wirst du wohl den kompletten Pfad angeben müssen.
which mysqldump gibt dir vielleicht einen.


Oder aber:

Daniel A. schrieb:
> (Gegebenenfalls muss man PATH setzen)

von FFFF (Gast)


Lesenswert?

Sod.Pfad ist angegeben.
Dump funktioniert.
Habe nun den Server gestoppt.
Resultat:

mysqldump: Got error: 2002: Can't connect to local MySQL server through 
socket '/usr/local/mysql4/var/mysqld.sock' (2) when trying to connect
Mittwoch 10.08.2016 08:46:00 : SQL Dump OK


Also so funktioniert es auch nicht :-(

von Soeren K. (srkeingast)


Lesenswert?

FFFF schrieb:
> if ! mysqldump -u$User -p$Password --all-databases \

mysqldump -u $User -p"$Password" --all-databases


Das manual ist dein Freund.

von FFFF (Gast)


Lesenswert?

Nochmals, das Problem, um was es geht:

FFFF schrieb:
> Hallo Leute,
>
> Letzte Woche hat mein Serverchen den Geist aufgegeben.(Mein Fehler)
> Allerdings ist mir dabvei was aufgefallen:
> Ich starte jeden Tag einen Cronetab, welcher mir ein Script ausführt um
> den
> MySQL Server zu sichern.
> Das hat er auch versucht, allerdings war der MySQLServer down.
> Er hat zwar ein Archiv erstellt, die SQL Datei darin hat aber eine
> Grösse von 0 byte.
> Leider komme ich da aber an keinen Fehlercode dran.

Das MySQLDumping funktioniert.

Wenn was schief geht, wird eine GZ Datei ohne Inhalt erstellt.
In der Logfile wird immer "SQLDump OK" eingetragen, obwohl ein Fehler 
auftritt.

Nicht nur "Das Manual lesen"

von TestX (Gast)


Lesenswert?

Schau dir mal den zweiten beitrag hier im thread an. Dort steht das 
problem wieso sowas immlog steht. Dein log schreibt nämlich nur müll

von Soeren K. (srkeingast)


Lesenswert?

FFFF schrieb:
> Das MySQLDumping funktioniert.

Das funktioniert erst, und erst dann kannst du nach weiteren Problemen 
suchen, wenn dein mysqldump-"Befehl" auf der Bash funktioniert.


Das hier:

if ! mysqldump -u$User -p$Password --all-databases \
   | pigz --best > "$Folder$Filename$FileDate.gz"


Gibt doch auch nur wieder das Ergebnis von pigz zurück. Und das wird 
nicht fehlschlagen.

: Bearbeitet durch User
von FFFF (Gast)


Lesenswert?

Mein code sieht nun wie folgt aus:

LogDate=$(date "+%A %d.%m.%Y %H:%M:%S")
FileDate=$(date "+%Y_%m_%d_%H_%M")
echo "$LogDate : Create MySQL dump under: $Folder$Filename$FileDate.gz"
echo "$LogDate : Create MySQL dump under: $Folder$Filename$FileDate.gz" 
>>$Folder$LogFileName
if ! /usr/local/mysql4/bin/mysqldump -u$User -p$Password --all-databases 
| pigz --best > "$Folder$Filename$FileDate.gz"
then
LogDate=$(date "+%A %d.%m.%Y %H:%M:%S")
echo "$LogDate : Error creating SQL Stream" >>$Folder$LogFileName
echo "$LogDate : Error creating SQL Stream"
else
LogDate=$(date "+%A %d.%m.%Y %H:%M:%S")
echo "$LogDate : SQL Dump OK" >>$Folder$LogFileName
echo "$LogDate : SQL Dump OK"
fi

Was stimmt nun?
Die Lösung von Daniel Abrecht?

von Lukey S. (lukey3332)


Lesenswert?

Mach mal
1
mysqldump -u$User -p$Password --all-databases \
2
    | pigz --best > "$Folder$Filename$FileDate.gz"
3
if [[ ${PIPESTATUS[0]} -gt 0 ]]
4
then
5
...

http://stackoverflow.com/questions/1221833/bash-pipe-output-and-capture-exit-status

BTW: Falls du genug Ram frei hast, empfehle ich lrzip.

von Soeren K. (srkeingast)


Lesenswert?

FFFF schrieb:
> /usr/local/mysql4/bin/mysqldump -u$User -p$Password --all-databases

Geht dieser Teil denn ohne das restliche drumherum? Die If-Abfrage wird 
nicht gehen, hatte ich zwei Beiträge weiter oben geschrieben.

FFFF schrieb:
> Was stimmt nun?
> Die Lösung von Daniel Abrecht?

Viele Wege führen nach Rom.

: Bearbeitet durch User
von FFFF (Gast)


Lesenswert?

/usr/local/mysql4/bin/mysqldump -u$User -p$Password --all-databases \
| pigz --best > "$Folder$Filename$FileDate.gz"
if [[ ${PIPESTATUS[0]} -gt 0 ]]
then


Funktioniert. Dankeschön :-D

von Sheeva P. (sheevaplug)


Lesenswert?

FFFF schrieb:
> Scriptauszug:
> LogDate=$(date "+%A %d.%m.%Y %H:%M:%S")
> FileDate=$(date "+%Y_%m_%d_%H_%M")
> echo "$LogDate : Create MySQL dump under: $Folder$Filename$FileDate.gz"
> echo "$LogDate : Create MySQL dump under: $Folder$Filename$FileDate.gz"
>>>$Folder$LogFileName
> sudo /usr/local/mysql4/bin/mysqldump -u$User -p$Password --all-databases
> | pigz --best > $Folder$Filename$FileDate'.gz'
> LogDate=$(date "+%A %d.%m.%Y %H:%M:%S")
> if [ $? -ne 0 ]; then
>     echo "$LogDate : Error creating SQL Stream" >>$Folder$LogFileName
>     echo "$LogDate : Error creating SQL Stream"
> else
>     echo "$LogDate : SQL Dump OK" >>$Folder$LogFileName
>     echo "$LogDate : SQL Dump OK"
> fi

"sudo mysqldump" ergibt keinen Sinn -- schon gar nicht, wenn mysqldump 
sich ohnehin mit Username und Passwort am MySQL-Server anmeldet.

Vermutlich ist das sudo hier auch das Problem, das erwartet nämlich 
normalerweise eine interaktive Paßworteingabe, wenn Du es nicht explizit 
mit der "NOPASSWD"-Option eingerichtet hast. Durch die Verwendung der 
Shell Redirection wird dann zwar eine leere Datei angelegt, aber sudo 
wartet dann ewig auf die Eingabe eines Paßwortes, ruft daher mysqldump 
gar nicht auf und dieses liefert dann keine Daten an pigz...

Außerdem würde ich das wiederholte "$Folder$Filename$FileDate" sowie 
"$Folder$LogFileName" einfach eigenen Variablen zuweisen und dann diese 
benutzen. Es mehrmals zu konstruieren ist unelegant und fehleranfällig. 
Schon die zweimalige Zuweisung an "LogDate" ist unschön und obendrein 
fehlerhaft: dadurch kommen Leerzeichen in Deine Dateinamen, die darum 
gequotet ("") werden müßten. (Wobei ich grundsätzlich von der Nutzung 
von Leerzeichen in Dateinamen abrate, weil diese bei Shelltools immer 
wieder zu fehleranfälligen Verrenkungen führen.) Expandier das einfach 
mal: aus
1
LogDate=$(date "+%A %d.%m.%Y %H:%M:%S")
2
echo "a" > ${LogDate}
führt zu:
1
echo "a" > Mittwoch 10.08.2016 09:57:40
Das ist vermutlich nicht das, was Du willst. (Ansonsten rate ich eher 
dazu, Sekunden seit Epoch zu benutzen (date +"%s") oder wenigsten ein 
ISO-Datum (date -Iseconds).)

Weiterhin würde ich die Logmeldungen nicht in separate Dateien, sondern 
über logger(1) ins Syslog schreiben. Da gehören solche Logdaten nämlich 
hin (nicht umsonst haben UNIX-Systeme ein sehr umfangreiches, zentrales 
Logging),  schon alleine damit klassische Logmonitore wie logcheck oder 
"richtige" Monitoringlösungen wie Icinga oder Zabbix das sehen können.

Im Übrigen ist der Rückgabewert eines erfolgreichen Shellkommandos in 
der Regel NICHT 0, sondern 1 -- das dürfte auch für mysqldump gelten. 
Zudem bist Du Dir hoffentlich darüber im Klaren, daß Du nicht den 
Rückgabewert von mysqldump, sondern den von pigz überprüfst.

von ./. (Gast)


Lesenswert?

> Im Übrigen ist der Rückgabewert eines erfolgreichen Shellkommandos in
> der Regel NICHT 0, sondern 1

Unfug.

von Dirk D. (dicky_d)


Lesenswert?

Sheeva P. schrieb:
> Im Übrigen ist der Rückgabewert eines erfolgreichen Shellkommandos in
> der Regel NICHT 0, sondern 1 -- das dürfte auch für mysqldump gelten.
> Zudem bist Du Dir hoffentlich darüber im Klaren, daß Du nicht den
> Rückgabewert von mysqldump, sondern den von pigz überprüfst.


In welcher Welt lebst du?

$ true ; echo $?
0

$ false ; echo $?
1

von Sheeva P. (sheevaplug)


Lesenswert?

./. schrieb:
>> Im Übrigen ist der Rückgabewert eines erfolgreichen Shellkommandos in
>> der Regel NICHT 0, sondern 1
>
> Unfug.

Upsi, haste Recht. Memo to self: erst Kaffee, dann posten.

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
Noch kein Account? Hier anmelden.