MySQL-Sicherung

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

mit folgendem Inhalt erstellt.

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

und der Befehl mit 

in den crontab eingetragen.

So wird nach dem Neustart von Cron jeden Tag um 2:00 Uhr eine Sicherung jeder einzelnen Datenbank im Verzeichnis /samba_share/backup abgelegt.

Autor: Frank Lüttig

Mein Name ist Frank, ich bin 1969 geboren und wohne in Halle (Saale). Ich bin ein technikbegeisterter Linux-User und berichte von Zeit zu Zeit auf intux.de über meine Erfahrungen im Bereich Open Source.

18 Gedanken zu „MySQL-Sicherung“

  1. 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

    1. Ja, kann man machen. Das würde dann im Script so aussehen:

  2. >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.

  3. 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.

  4. „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…

  5. 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. 😉

    1. 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?

      1. 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.

  6. 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.

  7. 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ß

  8. 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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.