Ich habe Probleme damit, crontab
zur 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
Antworten:
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
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:
Dies ist eine gute Ressource zur Erläuterung der E / A-Umleitung: http://www.codecoffee.com/tipsforlinux/articles2/042.html
quelle
Wenn Sie Ihrem Namen der Sicherungsdatei (Centos7) eine Datums- und Uhrzeitangabe hinzufügen müssen, verwenden Sie Folgendes:
Dadurch wird die Datei erstellt: db.2017-11-17.231537.sql.gz
quelle
Mit dem
tee
Befehl können Sie die Ausgabe umleiten:siehe Dokumentation hier
quelle
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.-> was auch zu 1 Datei namens dumpfilename.sql.gz führt
Darüber hinaus
--single-transaction
verhindert 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 hierquelle
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 ;-))
quelle