Sicherungsskript Datenbank

iceview

Lieutenant
Registriert
Jan. 2008
Beiträge
714
Hallo zusammen,

vielleicht habt ihr eine Idee. Für eine recht wichtige Anwendung würde ich gerne auf dem lokalen System und einer NAS Datenbanksicherungen parken.

Derzeit sichere ich meine mySQL Datenbanken mittels eines Skripts stündlich.

Ich würde gerne für jeden Tag einen Ordner haben und dort die Sicherungen als Archiv komprimiert ablegen. Insgesamt soll der Datenbestand 1 Jahr beinhalten. Immer wenn Daten lokal abgelegt wurden, dann soll danach auf die NAS synchronisiert werden.

Ich hab bis jetzt nur das Sicherungsskript geschafft:
Code:
#!/bin/sh
#
# Pfade setzen
#
MYSQL_DUMP=/usr/bin/mysqldump
BACKUP_DIR=/home/user/backups/dumps
TAR=/bin/tar
RM=/bin/rm
DB_NAME=--all-databases
DB_USER=root
DB_PASS=passwort
AKT_DATUM=`date +%Y%m%d%H%M`
# mysql dump erzeugen 
#
$MYSQL_DUMP $DB_NAME -u $DB_USER --password=$DB_PASS > $BACKUP_DIR/$AKT_DATUM.backup.sql
#
# mysql dump komprimieren 
cd $BACKUP_DIR
$TAR -cvzf $AKT_DATUM.backup.sql.tgz $AKT_DATUM.backup.sql
#
# clean up
#
$RM $AKT_DATUM.backup.sql


Jemand noch eine Idee?

Danke für Eure Tipps!
 
Ja generell ja, aber man muss eben Perl ausführen auf dem Rechner.
Da ich auf den Server nur via SSH zugreife, müsste ich erstmal wieder von aussen gestatten via Browser auf das Webinterface zu gehen.

Sowas würde ich gerne vermeiden.
 
Hallo,

also als erste würde ich mal die Rückgabewerte Deiner Befehle auswerten, das ganze funktioniert mit $? diese Variable enthält immer den Rückgabewert des zuletzt aufgerufenen Programms, also mysqldump, tar, etc. Ist dieser Wert != 0 ist etwas schiefgegangen und du solltest das Skript abbrechen. Weiterhin solltest Du ein Logfile anlegen indem du erfolgreiche Ausführungen wie auch Fehler des Skripts mit Datum und Uhrzeit loggst! Alternativ könnte man auch im Fehlerfall ne Mail verschicken damit Du das mitkriegst!

Dateien die älter als 365 Tage sind kann man z.B. mit:

find $BACKUP_DIR -name '*.backup.sql' -mtime +365 -exec rm -rf {} \;

löschen, oder du verwendest das Debian Paket Tmpreaper, damit geht das auch...:

http://linux.about.com/cs/linux101/g/tmpreaper.htm
 
Gute Idee mit dem Abbruch und auch mit den Logfiles... die Frage ist nur *g*... wie mach ich das.
 
Warum sicherst du nicht jeden Tag voll, und speicherst REDO Logs?
Dann verlierst du im Fall des Falles maximal die letzte Transaktion, statt einer ganzen Stunde. Und du musst nicht jede Stunde backupen.
 
Tja... das habe ich noch nicht gemacht.

Die Dumps der gesamten Struktur sind gerade mal 200KB gross. Also es tut mir (noch) nicht weh, wenn ich die gesamten Daten sichere.

Aber genau hier zielt ja meine Frage hin, welches Konzept sollte ich wählen.

Ich habe den Server und zusätzlich noch 2 NAS mit je 1TB für SIcherungen.
Hier lässt sich doch bestimmt was bauen.

Genauso würde ich auch gerne die Logs des Apache nach Tagen sortiert sichern. Ich weiss, dass es wohl mit logrotate eine Möglichkeit gibt.

Mein Gedanke war einfach um 00:00 Uhr --> copy --> umbenennen -> Original löschen.

Danke für neue Ideen.
 
In ein Logfile schreibst Du mit

echo "Mein Logfile Text" >> meinlog.log

und ein Script im Fehlerfall beenden kannst Du mit

exit 1
 
Ja okay, das ist ja wie in ner DOS Batch... :)

Wie bekomme ich denn den Fehler (z.B. falsches mysql Passwort) mit in das Log?

Bei sowas hier wird ja nur der eigentliche Vorgang mitgeschrieben:

Code:
#if [ $? = 0 ]; then
echo "Dump um $AKT_DATUM erfolgreich geschrieben" >> mylog.log
else
echo "error" >> mylog.log
exit 1
fi
 
Das ist nicht ganz so einfach, denn $? gibt ja nur zurück ob der mysqldump befehl erfolgreich oder nicht war, also keine konkrete fehlermeldung... du könntest aber die bildschirmausgabe des mysqldump befehls in das logfile umleiten:

$MYSQL_DUMP $DB_NAME -u $DB_USER --password=$DB_PASS > $BACKUP_DIR/$AKT_DATUM.backup.sql >> mylog.log

dann würde alles was nach dem mysqldump aufruf auf dem bildschirm erscheint in das logfile geschrieben werden!
 
Ich bin jetzt mal nen Umweg gegangen:

In das Sicherungsskript als erstes die Option gesetzt:

#!/bin/sh -x

Dann das Skript laufen lassen

Der Aufruf dieses Skripts erfolgt wiederum über ein anderes Skript:

Code:
#!/bin/bash
LOGDIR=/home/backups/logfiles
BACKUP_DIR=/home/backups
LOG_DATUM=`date +%Y_%m_%d`
find $LOGDIR -type f -daystart -mtime 30 -delete
echo -e "\n########################\n" >> $LOGDIR/backup_$LOG_DATUM$
sudo ./backup.sh 2>> /home/backups/logfiles/backup_$LOG_DATUM.log

So bekomm ich erstmal pro Tag ein Log mit allen Aktionen.

Verfeinern kann ichs dann immer noch :)
 
Zurück
Oben