mysqldump & gzip-Befehle zum ordnungsgemäßen Erstellen einer komprimierten Datei einer MySQL-Datenbank mit crontab


73

Ich habe Probleme damit, crontabzur Arbeit zu kommen. Ich möchte eine MySQL-Datenbanksicherung automatisieren.

Die Einrichtung:

  • Debian GNU / Linux 7.3 (keuchend)
  • MySQL Server Version: 5.5.33-0 + wheezy1 (Debian)
  • Verzeichnisse Benutzer, Backup und Backup2 haben die Berechtigung 755
  • Die Benutzernamen für MySQL-Datenbank und Debian-Konto sind identisch

In der Shell funktioniert dieser Befehl

mysqldump -u user -p[user_password] [database_name] | gzip > dumpfilename.sql.gz

Wenn ich dies mit crontab -e in eine Crontab lege

* * /usr/bin/mysqldump -u user -pupasswd mydatabase | gzip> /home/user/backup/mydatabase-backup-`date +\%m\%d_\%Y`.sql.gz >/dev/null 2>&1

Eine Datei wird jede Minute im Verzeichnis / home / user / backup erstellt, hat jedoch 0 Bytes.

Wenn ich diese Ausgabe jedoch in ein zweites Verzeichnis umleite, backup2, stelle ich fest, dass das richtige, ordnungsgemäß komprimierte mysqldumpfile darin erstellt wird. Ich kann nicht herausfinden, was der Fehler ist, der zu einer 0-Byte-Datei im ersten Verzeichnis und der erwarteten Ausgabe im zweiten Verzeichnis führt.

* * /usr/bin/mysqldump -u user -pupasswd my-database | gzip> /home/user/backup/mydatabase-backup-`date +\%m\%d_\%Y`.sql.gz >/home/user/backup2/mydatabase-backup-`date +\%m\%d_\%Y`.sql.gz 2>&1

Ich würde mich sehr über eine Erklärung freuen.

Vielen Dank


Entschuldigung für Tippfehler in der ersten Codezeile sollte es gzip statt zip sein
user3397547

Ich würde das nicht jede Minute laufen lassen
m79lkm

Ich habe es nur ausgeführt, um die Befehle zu testen.
user3397547

Antworten:


106

Zuerst wird der Befehl mysqldump ausgeführt und die generierte Ausgabe wird über die Pipe umgeleitet. Die Pipe sendet die Standardausgabe als Standardeingabe an den Befehl gzip. Nach dem Dateinamen.gz folgt der Ausgabeumleitungsoperator (>), der die Daten bis zum letzten Dateinamen umleitet, in dem die Daten gespeichert werden.

Mit diesem Befehl wird beispielsweise die Datenbank gesichert und über gzip ausgeführt, und die Daten landen schließlich in three.gz

mysqldump -u user -pupasswd my-database | gzip > one.gz > two.gz > three.gz

$> ls -l
-rw-r--r--  1 uname  grp     0 Mar  9 00:37 one.gz
-rw-r--r--  1 uname  grp  1246 Mar  9 00:37 three.gz
-rw-r--r--  1 uname  grp     0 Mar  9 00:37 two.gz

Meine ursprüngliche Antwort ist ein Beispiel für die Umleitung des Datenbankspeicherauszugs in viele komprimierte Dateien (ohne doppelte Komprimierung). (Da ich die Frage gescannt und ernsthaft übersehen habe - Entschuldigung)

Dies ist ein Beispiel für das erneute Komprimieren von Dateien:

mysqldump -u user -pupasswd my-database | gzip -c > one.gz; gzip -c one.gz > two.gz; gzip -c two.gz > three.gz

$> ls -l
-rw-r--r--  1 uname  grp  1246 Mar  9 00:44 one.gz
-rw-r--r--  1 uname  grp  1306 Mar  9 00:44 three.gz
-rw-r--r--  1 uname  grp  1276 Mar  9 00:44 two.gz

Dies ist eine gute Ressource zur Erläuterung der E / A-Umleitung: http://www.codecoffee.com/tipsforlinux/articles2/042.html


Das Problem, das ich habe, ist, dass die Befehle mysqldump und gzip funktionieren. Bei der ersten Umleitung zum Verzeichnis 'backup' wird eine 0-Byte-Datei erstellt. Die zweite Umleitung zum Verzeichnis 'backup2', bei der keine erneute Komprimierung erforderlich ist, erstellt die gewünschte Datei. Ich wollte wissen, warum das passiert.
user3397547

1
Die Ausgabe wird nicht an gzip weitergeleitet, sondern umgeleitet. Es wird durchgeleitet, bis es zum letzten Teil gelangt.
Dann

1
Bash erkannte die Umleitung und versuchte zunächst, die Datei zu öffnen. Die Datei wurde geöffnet (erstellt), dann bestimmt bash, wie die Daten umgeleitet werden sollen. Wenn beim Öffnen der Datei ein Fehler auftritt, schlägt der Befehl fehl und schreibt Fehler in stderr. Wenn die Ausgabe erneut umgeleitet wird, wird das stdin vom ersten Befehl an die nächste Datei in der Zeile gesendet. Wenn die Datei geöffnet wird und keine anderen Umleitungen vorhanden sind, werden die Daten in die Datei geschrieben.
m79lkm

Vielen Dank für die Erklärung, dass bash die stdin-Ausgabe bis zum Ende der Zeile umleitet und dann gzip die Datei am Ende komprimiert. Ich glaube, ich hatte> / dev / null 2> & 1 in meinem ursprünglichen Code und die mysqldump-Datei wurde an / dev / null gesendet und verworfen. Ich habe jetzt den Code so, wie er sollte.
user3397547

1
Moll: Fügen Sie das Passwort nicht in den Befehl ein. Es wird in Ihrer Geschichte enden und kann abgerufen werden. (für Cron ist es in Ordnung)
Tibi

16

Wenn Sie Ihrem Namen der Sicherungsdatei (Centos7) eine Datums- und Uhrzeitangabe hinzufügen müssen, verwenden Sie Folgendes:

/usr/bin/mysqldump -u USER -pPASSWD DBNAME | gzip > ~/backups/db.$(date +%F.%H%M%S).sql.gz

Dadurch wird die Datei erstellt: db.2017-11-17.231537.sql.gz


12

Mit dem teeBefehl können Sie die Ausgabe umleiten:

/usr/bin/mysqldump -u user -pupasswd my-database | \
tee >(gzip -9 -c > /home/user/backup/mydatabase-backup-`date +\%m\%d_\%Y`.sql.gz)  | \
gzip> /home/user/backup2/mydatabase-backup-`date +\%m\%d_\%Y`.sql.gz 2>&1

siehe Dokumentation hier


Meine Frage war, wie die erste Umleitung zu einer 0-Byte-Datei und die zweite zu einer vollständigen Datei führt
user3397547

2
Entschuldigung - ich habe eine Antwort auf Ihre ursprüngliche Frage gepostet. Ich werde dies hier belassen - hoffe, dieser kleine Ausschnitt wird jemandem nützlich sein.
m79lkm

1
In der Tat war es :)
Paolo Stefan

1

Neben der Lösung von m79lkm oben besteht mein 2-Cent- Betrag in diesem Thema nicht darin, das Ergebnis direkt in gzip weiterzuleiten, sondern es zuerst als .sql-Datei und dann als gzip auszugeben. (Verwenden Sie && anstelle von |)

Der Dump selbst wird schneller sein. (für das, was ich getestet habe, war es doppelt so schnell )

Andernfalls werden Ihre Tabellen länger gesperrt und die Ausfallzeit / langsame Reaktion Ihrer Anwendung kann die Benutzer stören. Der Befehl mysqldump beansprucht viele Ressourcen von Ihrem Server.

Also würde ich "&& gzip" anstelle von "| gzip" wählen.

Wichtig: Überprüfen Sie zuerst den freien Speicherplatz mit,df -h da Sie mehr als Rohrleitungen benötigen gzip.

mysqldump -u user -p[user_password] [database_name] > dumpfilename.sql && gzip dumpfilename.sql

-> was auch zu 1 Datei namens dumpfilename.sql.gz führt

Darüber hinaus --single-transactionverhindert die Option, dass die Tabellen gesperrt werden, führt jedoch zu einer soliden Sicherung. Sie könnten also in Betracht ziehen, diese Option zu verwenden. Siehe Dokumente hier

mysqldump --single-transaction -u user -p[user_password] [database_name] > dumpfilename.sql && gzip dumpfilename.sql

0

Persönlich habe ich eine Datei.sh (rechts 755) im Stammverzeichnis erstellt, Datei, die diesen Job erledigt, in der Reihenfolge der crontab.

Crontab-Code:

10 2 * * * root /root/backupautomatique.sh

File.sh Code:

rm -f /home/mordb-148-251-89-66.sql.gz # (Um das alte zu löschen)

mysqldump mor | gzip> /home/mordb-148-251-89-66.sql.gz (was Sie getan haben)

scp -P2222 /home/mordb-148-251-89-66.sql.gz root @ otherip: /home/mordbexternes/mordb-148-251-89-66.sql.gz

(um eine Kopie woanders zu senden, wenn der sendende Server abstürzt, weil zu alt, wie ich ;-))

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.