Backup der MySQL-Datenbank über einen cronjob: Unterschied zwischen den Versionen

Aus
 
(5 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
==Vorbemerkungen==
[[Category:Backup and Recovery]][[Category:cron]][[Category:mySQL]]
== Das Skript ==
* Das unten beschriebene Skript sowie die erstellten Backups sollte man am besten irgendwo auf Volume1 speichern, den gewünschten Pfad muss man im Skript überall dort eingeben, wo bis jetzt '''deinpfad''' steht. Auch das '''sqlpasswort''' muss noch entsprechend angepasst werden.
* Das unten beschriebene Skript sowie die erstellten Backups sollte man am besten irgendwo auf Volume1 speichern, den gewünschten Pfad muss man im Skript überall dort eingeben, wo bis jetzt '''deinpfad''' steht. Auch das '''sqlpasswort''' muss noch entsprechend angepasst werden.
Man erstellt eine Datei mysqlbackup.sh mit folgendem Inhalt:
Man erstellt eine Datei mysqlbackup.sh mit folgendem Inhalt:
Zeile 22: Zeile 23:
* Die Datei wird jetzt in /volume1/deinpfad gespeichert.  
* Die Datei wird jetzt in /volume1/deinpfad gespeichert.  
* Jetzt muss noch das Unterverzeichnis /volume1/deinpfad/backup angelegt werden.  
* Jetzt muss noch das Unterverzeichnis /volume1/deinpfad/backup angelegt werden.  
* Testweise kann man das Skript schon mal mit "sh /volume1/deinpfad/mysqlbackup.sh" starten. Bei jedem Aufruf werden zunächst die überflüssigen Backups gelöscht und dann das neue Backup angelegt.  
* Testweise kann man das Skript schon mal mit "sh /volume1/deinpfad/mysqlbackup.sh" starten. Bei jedem Aufruf werden zunächst die überflüssigen Backups gelöscht und dann das neue Backup angelegt.
* Zum Schluss muss man dieses Skript noch in der Datei /etc/crontab einfügen, um einen zeitgesteuerten Aufruf zu ermöglichen. Man fügt dazu folgende Zeile in die crontab ein (Tabs verwenden, keine Leerzeichen!):
== Cronjob ==
<pre>
Das Skript muss noch in der Datei /etc/crontab eingetragen werden, um einen zeitgesteuerten Aufruf zu ermöglichen. Dazu wird das Kommando '''sh /volume1/deinpfad/mysqlbackup.sh''' mit einem passenden Präfix eingetragen, und anschließend der cron daemon neu gestartet. Details dazu sind im Artikel über [[Cron]] zu finden, hier einige Beispiele für Präfixe (Tabs verwenden, keine Leerzeichen!):
#minute hour    mday    month  wday    who    command
1      0      *      *      *      root    sh /volume1/deinpfad/mysqlbackup.sh
</pre>
* Diese Zeile bewirkt, dass das Skript täglich um 0:01 Uhr ausgeführt wird (direkt nach dem Aktualisieren der Uhrzeit).
* Zum Abschluss muss der cron-Dienst bzw. die Synology Station neu gestartet werden bzw. einen SIGHUP Signal an das crond Prozess senden und einen neuscan der crontab erzwingen:
<pre> > ps | grep crond | grep -v grep
1229 root        580 S  /usr/sbin/crond
 
> kill -HUP 1229</pre>
 
== Crontab Aufbau ==
===Aufbau der cron-Tabellen===
 
cron-Tabellen bestehen aus beliebig vielen Zeilen. Kommentare werden durch # in Spalte eins eingeleitet. Sie gelten bis zum Zeilenende. Leerzeilen werden ignoriert.
 
Nach der Deklaration lokaler Variablen folgt die eigentliche Tabelle. Diese besteht aus sieben Spalten pro Zeile. Die ersten fünf Spalten spezifizieren den Ausfügrungszeitpunkt. Die sechte Spalte enthält den Namen des Users, unter dessen Account der Dienst ausgeführt wird. Der Rest wird als siebte Spalte interpretiert und enthält die auszuführenden Befehle.
 
===Die Terminfelder===
 
Das erste Feld beinhaltet die Minute, das zweite die Stunde, das dritte den Tag, das vierte den Monat.
'''dow''' (day of the week) steht für den Wochentag.
 
Innerhalb der Terminfelder können die Angaben als Zahlen (im Feld month und dow auch über die englischen Namen) erfolgen. Mehrere Einzeleinträge sind möglich. Sie werden durch Kommata getrennt. Auch Bereiche können angegeben werden. 2,3,4,6 kann auch als 2-4,6 angegeben werden. Das *-Zeichen wird als Joker eingesetzt, das den Bereich ersetzen kann (<erstes Element>-<letztes Element>). Die Felder werden durch ein TAB voneinander getrennt.
 
===Beispielaufbau der cron-Tabelle===
Beispiel einer ''Crontab'':
<pre>
<pre>
#minute hour    mday    month  wday    who    command
#minute hour    mday    month  wday    who    command
Zeile 73: Zeile 47:
</pre>
</pre>


<pre>
==Links==
Die Struktur ist also wie folgt zu verstehen:
* Referenz für [http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html mysqldump in MySQL 5.1]
* * * * * auszuführender Befehl
┬ ┬ ┬ ┬ ┬
│ │ │ │ │
│ │ │ │ └──── Wochentag (0-7) (Sonntag =0 oder =7)
│ │ │ └────── Monat (1-12)
│ │ └──────── Tag (1-31)
│ └────────── Stunde (0-23)
└──────────── Minute (0-59)
</pre>

Aktuelle Version vom 28. September 2020, 12:20 Uhr

Das Skript

  • Das unten beschriebene Skript sowie die erstellten Backups sollte man am besten irgendwo auf Volume1 speichern, den gewünschten Pfad muss man im Skript überall dort eingeben, wo bis jetzt deinpfad steht. Auch das sqlpasswort muss noch entsprechend angepasst werden.

Man erstellt eine Datei mysqlbackup.sh mit folgendem Inhalt:

#!/bin/bash
#
# dieses Skript kann man beliebig oft ausführen
#
# Anzahl der Sicherungen die aufgehoben werden sollen
KEEP=2
BACKUPS=`find /volume1/deinpfad/backup -name "mysqldump-*.gz" | wc -l | sed 's/\ //g'`
while [ $BACKUPS -ge $KEEP ]
do
ls -tr1 /volume1/deinpfad/backup/mysqldump-*.gz | head -n 1 | xargs rm -f 
BACKUPS=`expr $BACKUPS - 1` 
done
DATE=`date +%Y%m%d%H%M%S`
rm -f /volume1/deinpfad/backup/.mysqldump-${DATE}.gz_INPROGRESS
/usr/syno/mysql/bin/mysqldump --opt -uroot -psqlpasswort --all-databases | gzip -c -9 > /volume1/deinpfad/backup/.mysqldump-${DATE}.gz_INPROGRESS
mv -f /volume1/deinpfad/backup/.mysqldump-${DATE}.gz_INPROGRESS /volume1/deinpfad/backup/mysqldump-${DATE}.gz
exit 0
  • Die Datei wird jetzt in /volume1/deinpfad gespeichert.
  • Jetzt muss noch das Unterverzeichnis /volume1/deinpfad/backup angelegt werden.
  • Testweise kann man das Skript schon mal mit "sh /volume1/deinpfad/mysqlbackup.sh" starten. Bei jedem Aufruf werden zunächst die überflüssigen Backups gelöscht und dann das neue Backup angelegt.

Cronjob

Das Skript muss noch in der Datei /etc/crontab eingetragen werden, um einen zeitgesteuerten Aufruf zu ermöglichen. Dazu wird das Kommando sh /volume1/deinpfad/mysqlbackup.sh mit einem passenden Präfix eingetragen, und anschließend der cron daemon neu gestartet. Details dazu sind im Artikel über Cron zu finden, hier einige Beispiele für Präfixe (Tabs verwenden, keine Leerzeichen!):

#minute hour    mday    month   wday    who     command
# Command jede Minute ausführen:
*       *       *       *       *       root    sh /volume1/deinpfad/mysqlbackup.sh

# Jeden Tag um 22:00 h ausführen
0       22      *       *       *       root    sh /volume1/deinpfad/mysqlbackup.sh

# Jeden Sa. um 22:00 h ausführen
0       22      *       *       6       root    sh /volume1/deinpfad/mysqlbackup.sh

# Alle 5 min ausführen
*/5     *       *       *       *       root    sh /volume1/deinpfad/mysqlbackup.sh

# Alle 2 Std. ausführen
00      */2     *       *       *       root    sh /volume1/deinpfad/mysqlbackup.sh

# Von Mo. bis Fr. um 01:00 h ausführen
0       1       *       *       1-5     root    sh /volume1/deinpfad/mysqlbackup.sh

Links