Inspiriert durch den Artikel „Backup oder Datensicherung eines root-Servers / vServers / VPS„von Bitblokes habe ich mir Gedanken gemacht, wie ich meine MySQL-Datenbanken vernünftig und regelmäßig sichern kann. Die Snapshots von Servercow sind schon sehr gut, um ein Backup des ganzen Servers zu erstellen. Jedoch ist man hin und wieder auf eine einzelne Datenbank angewiesen.
Da ich bei Servercow einen zusätzlichen RAID5 HDD-Netzwerkspeicher von 150 GB und diesen in meine Nextcloud eingebunden habe, kann ich dort bequem meine Datenbanksicherungen ablegen. Bei jeder Synchronisation zu Hause, landen dann die Sicherungen auf meinem Notebook.
Da ich bisher meine Datenbanken manuell mit mysqldump durchgeführt habe, wollte ich das Ganze nun automatisieren.
Dazu wurde das Script MySQLscript.sh
1 |
# nano /root/MySQLscript.sh |
mit folgendem Inhalt erstellt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/bin/sh mysqldump -u root -meinpasswort in********** > /samba_share/backup/in**********-$(date +%Y-%m-%d).sql mysqldump -u root -meinpasswort cc********** > /samba_share/backup/cc**********-$(date +%Y-%m-%d).sql mysqldump -u root -meinpasswort bc********** > /samba_share/backup/bc**********-$(date +%Y-%m-%d).sql mysqldump -u root -meinpasswort kt********** > /samba_share/backup/kt**********-$(date +%Y-%m-%d).sql mysqldump -u root -meinpasswort wo********** > /samba_share/backup/wo**********-$(date +%Y-%m-%d).sql mysqldump -u root -meinpasswort ne********** > /samba_share/backup/ne**********-$(date +%Y-%m-%d).sql mysqldump -u root -meinpasswort cy********** > /samba_share/backup/cy**********-$(date +%Y-%m-%d).sql mysqldump -u root -meinpasswort pe********** > /samba_share/backup/pe**********-$(date +%Y-%m-%d).sql mysqldump -u root -meinpasswort ma********** > /samba_share/backup/ma**********-$(date +%Y-%m-%d).sql mysqldump -u root -meinpasswort pr********** > /samba_share/backup/pr**********-$(date +%Y-%m-%d).sql mysqldump -u root -meinpasswort ro********** > /samba_share/backup/ro**********-$(date +%Y-%m-%d).sql mysqldump -u root -meinpasswort bcc********* > /samba_share/backup/bcc*********-$(date +%Y-%m-%d).sql mysqldump -u root -meinpasswort pi********** > /samba_share/backup/pi**********-$(date +%Y-%m-%d).sql |
Dabei ist „in**********“ der Name meiner ersten Datenbank. Der Eintrag „meinpasswort“ im Script muss natürlich durch das MySQL root Passwort ersetzt werden.
Im Anschluss wird das Script ausführbar gemacht
1 |
# chmod +x MySQLscript.sh |
und der Befehl mit
1 |
# nano /etc/crontab |
in den crontab eingetragen.
1 |
0 2 * * * root /root/MySQLscript.sh |
So wird nach dem Neustart von Cron jeden Tag um 2:00 Uhr eine Sicherung jeder einzelnen Datenbank im Verzeichnis /samba_share/backup abgelegt.
1 |
# /etc/init.d/cron restart |
Wenigstens einer liest sich mein Zeug durch! 😉
Datenbanken lassen sich übrigens in der Regel sehr gut komprimieren. Wenn Du den Befehl mit gzip erweiterst, sollte das Backup sehr viel weniger Storage fressen.
Du kannst es ja ausprobieren, indem Du eine Datenbank immer mit und ohne gzip sicherst.
Viele Grüße und auf dass Du das Backup niemals benötigst!
Jürgen
Ja, kann man machen. Das würde dann im Script so aussehen:
>Bei jeder Synchronisation zu Hause, landen dann die Sicherungen auf meinem Notebook.
Rein aus Interesse, wie synchronisierst du das ganze? Per rsync?
Ich selbst habe, was die Datenbanksicherung betrifft einen etwas anderen Weg gewählt. Bei meinem Script werden die Dumps erst einmal erzeugt und mit gzip komprimiert (hier kann ich Jürgen nur recht geben. Das lohnt sich. Meine WordPress-Datenbank hatte 22.1 MB. Komprimiert 5,1 MB). Dann werden die Archive mit gpg verschlüsselt und per Dropbox-Uploader (findet man auf Github) in meine Dropbox gepackt und von dort aus mit meinen Rechnern synchronisiert.
Nein, via dem Nextcloud-Client.
Stimmt, da fehlt noch Kompression! 🙂
Meine Sicherung:
mysqldump –user=USER –password=PW –single-transaction DB | 7z a -si DB.7z
Bei 7z könnte man auch noch mit einem Passwort verschlüsseln.
„Nun erstellt der Cronjob jeden Tag um 2:00 Uhr eine Sicherung jeder einzelnen Datenbank.“
Stelle diesen Satz doch ans Ende nach „Im Anschluss wird cron neu gestartet. [code]“, dann stimmt es auch logisch.
Ich bin beim Lesen drüber gestolpert und habe mich gefragt, warum das Skript nach der Sicherung cron neustarten sollte…
Ich werde es verständlicher formulieren.
Ich sehe hier noch stark Bedarf an Verbesserungen bei dem Script. Zunächst willst Du kein Passwort in dem Script haben, dafür gibt es die Möglichkeit mit der .my.cnf bei MySQL. Ausserdem hast Du keinerlei Error-Erkennung, welche bei automatisch ablaufenden Scripten vorhanden sein sollte (help set) und wenn man das ganze noch in eine for-Schleife packt, spart man sich auch die vielen Zeilen. 😉
Hi Frickelpit,
kannst Du einen Vorschlag erarbeiten? Ich suche ebenso eine gute Lösung zur Sicherung von MySQL Datenbanken. Das Script ist ok, dennoch sehr ruidmentär und kann noch weitere Punkte beinhalten. Für den ersten Schritt die Anforderungen an ein solches Programm zusammenstellen und schreiben 🙂
Meine Punkte wären:
– regelmäßige Sicherung
– keine Passwörter in Scripts
– Archivierung (rsync mit optionaler Verschlüsselung)
– Logs
Welche Punkte wären noch zu beachten?
Hallo Geramaya,
> regelmäßige Sicherung
Kann man mit cron.{hourly,daily,weekly} erreichen
> keine Passwörter in Scripts
Wie erwähnt, kann man Zugangsdaten in die .my.cnf packen (muss vorher erstellt werden). Siehe: https://dev.mysql.com/doc/refman/5.7/en/option-files.html
> Archivierung (rsync mit optionaler Verschlüsselung)
Je nach Geschmack und Anwendung aber Komprimieren und dann mit rsync wegschaufeln klingt sinnvoll. 😉
> Logs
Kann man im Script mit angeben lassen.
Schau Dir am besten mal https://wiki.ubuntuusers.de/MySQL/Backup/ als Anhaltspunkt an.
Wie ich bei Jürgen im Blog kommentiert habe, Debian & Co bietet mit dem Paket „automysqlbackup“ alles was man für mysql Backups braucht ^_^ Es macht im Prinzip fast dasselbe wie hier beschrieben.
Das hatte ich zuvor auch im Auge. Vlt. teste ich automysqlbackup ja mal.
Aus welchem bescheuerten Grund führst du das Backupscript im Crontab als root aus?
Hallo,
warum nicht als Schleife?
#!/bin/sh
for dbname in in********** cc********** bc********** kt********** wo********** ne********** cy********** pe********** ma********** pr********** ro********** bcc********* pi**********
do
mysqldump -u root -pmeinpasswort ${dbname} > /samba_share/backup/${dbname}-$(date +%Y-%m-%d).sql
done
(1) ungetestett, da weder Linux noch MySQL zur Hand
(2) so lassen sich Änderungen (z.B. Komprimierungen) leichter einbauen
Gruß
Intux, wie hast du den Samba Share bei nextcloud eingerichtet, bin auch bei Servercow.
Danke
Malte
Das geht über die App „External Storage“.
https://docs.nextcloud.com/server/12/admin_manual/configuration_files/external_storage_configuration_gui.html
Grüße intux
Warum muss es immer „mysqldump“ sein.
Aus meiner Erfahrung kann ich „mydumper“ empfehlen. MySQL-Datenbanken multi-threaded sichern, und vor allem alle Daten in einzelnen Files. Per Parameter kann hier auch „gzip-kompression“ für die einzelnen Files zugeschaltet werden.
Das Backup enthält dann Dateien mit „._schema.sql“, sowie „..sql“.
Somit ist einerseits eine Nachbildung vorhandener Strukturen schnell möglich, als auch eine schnelle Rücksicherung von Teildaten. Und man kann komplette Server sichern, ohne „mehrere“ Jobs dafür zu benötigen.
[…] konnte ich auch den Cronjob für den User einrichten. Der Eintrag, wie im ersten Artikel „MySQL-Sicherung“ in /etc/crontab wurde wieder entfernt. und der Cron neu […]