[HowTo] backup Vserver

gnugu13

Registered User
Teil 1
Ziel des backups ist ein verzeichnis - orientiertes Backup der Daten des
vservers unter der Beruecksichtigung der Besonderheit der mysql Datenbanken.

Features:

  • Konfiguration der zu sichernden Dateien ueber Konfigdatei
  • Sicherung der Verzeichnisse unter /backup als tar-Archive komprimiert
  • Inhaltsverzeichnis der tar-files als textfiles
  • vollstaendiges und incrementelles Backup
  • Sicherung der mysql Datenbanken (mysqlhotcopy)
  • (Zweit)Sicherung der files auf remote Server mittels rsync
  • Datentransfer gesichert mit ssh

Dateien:
Konfig dateien:
/etc/backup/backup.conf ## zentrale Konfigurationsdatei
/etc/backup/backup-dirs.conf ## konfig der zu sichernden Verzeichniss
/etc/backup/backup.cron ## crontab nach /etc/crond.daily kopieren
/etc/backup/daily.sh ## Script fuer taegliche incrementelle
## Sicherung nach /bin kopieren
/etc/backup/weekly.sh ## Script fuer die woechentliche
## Sicherung nach /bin kopieren
div Verzeichnisse
/var/log/backup ## Logverzeichnis fuer Logdateien
/var/mysqldump ## Sicherungsverzeichnis fuer
## mysql-Datenbanken
Sicherungsverzeichnis:
/backup ## Backupverzeichnis fuer eigene und
## fremde tar Dateien
/backup/inc
/backup/weekly
/backup/server.name/inc ## backupverzeichnis des
/backup/server.name/weekly ## entfernten Servers
##'server.name'

/backup/backup/server.name/backup/inc ## bei neuem rsync wird
/backup/backup/server.name/backup/weekly ## nun eine Kopie des
## alten Satzes im
## Unterverzeichnis
## backup abgelegt
Voraussetzungen:
root Rechte am Server
Umgang mit der Shell ist kein Fremdwort
vi oder anderen Lieblingseditor
tar, gzip, ssh # base paket
mysqlhotcopy # perl Script gehoert zu mysql Version 1.17 oder hoeher
rsync # zum wegsichern auf andere Server
ssh-keygen # openSSH Paket

Anpassungen:
Das Verzeichnis /backup anlegen

In der Konfigurationsdatei backup.conf MÜSSEN Anpassungen
vorgenommen werden.
37 REMOTE_SERVER='tux5.home' # servername des Remote Servers
38 REMOTE_PORT='22' # Remote Port fuer sshd falls
# abweichend
46 # SQL-Dump Variablen
47 # hier die passenden Namen&Passwoerter eintragen
48 # bitte das chmod 700 der Datei nicht vergessen !!
49 USER=root # user braucht in mysql Rechte!!
50 #PASSWORD=<passwort>
51 PASSWORD='ganzgeheim' # hier anpassen

91 WEEKLYCHANGE="1" # Montag ist Full Backup Tag
# 0/7 Sonntag 1 Mo 2 Die 3 Mi usw.

152 SENDMAILBIN="/usr/sbin/sendmail -t" # Pfad zu sendmail

157 SENDMAILTO="root@vsxxxxxx.de" # wer soll das log bekommen
212 echo "Gruss Klaus" >> $TMPFILE # die 'Unterschrift' in
# der mail

In der Datei

/etc/backup/backup-dirs.conf
die Verzeichnisse eintragen, welche gesichert werden sollen

Schema:
# Dies ist ein Kommentar
Label:/pfad/zu/verzeichniss

Bsp.:

# logfiles
log:/var/log

# die Webverzeichnisse
web1:/var/www/web1
web2:/var/www/web2
web3:/var/www/web3
web4:/var/www/web4
web5:/var/www/web5
web6:/var/www/web6

# confixx Verzeichnis
confixx:/var/www/confixx

root:/root

Teil 2 folgt
 
[HowTo] backup Vserver Teil 2

So nun die scripte. Ich stelle die dann auch als tar file zur Verfuegung.
Hier mal die Datei /etc/backup/backup.conf

Dinge die angepasst werden sollen stehen rot da.
############################################################################
#
# /etc/backup/backup.conf
#
# central configuration file for the backup configuration
#
# supports incremental backup daily, relativ to last weekly backup
# supports backup to tape drives
# supports mail notification for change tape in streamer
#
############################################################################
# Contents:
# I General settings
# II Weekly settings
# III Daily settings
# IV Mail notification
# V Functions
############################################################################
#
# I General settings
#
############################################################################
#
# Sicherungsdateien aus /backup/inc bzw. /backup/weekly
# werden mit rsync/ssh auf den (entfernten) Ziel Server
# kopiert
# Sicherstellen, dass ssh mit public/private keys funktionieren !!
#
# Quell Server : vserver1.de
# Ziel Server : server.home
# zielport des ssh : 2222 (default : 22)
# Sourcedir : $DAILYDIR oder $WEEKLYDIR
# Destdir : /backup/$HOSTNAME/
# Backupdir wird bei rsync automatisch mit vorhergehender
# Dateiversion gefuellt
# Backupdir : /backup/$HOSTNAME/backup
REMOTE_SERVER='server.home'
REMOTE_PORT='22'
HOSTNAME=`hostname -f`
#
# MAINDIR
# the root of the backup sub system
# MAINDIR="/"
MAINDIR="/"
#
# SQL-Dump Variablen
# hier die passenden Namen&Passwoerter eintragen
# bitte das chmod 700 der Datei nicht vergessen !!
USER=root
#PASSWORD=<passwort>
PASSWORD='geheimnis'
#
# wir holen die Datenbankverzeichnisse in TABLES
TABLES=`find /var/lib/mysql/* -type d -exec basename {} \;`

#
# CONFIGDIR
# the directory for the configuration
# CONFIGDIR="/etc/backup"
CONFIGDIR="/etc/backup"
#
# LOGDIR
# the directory for the log- and statusfiles of the jobs
#
# LOGDIR="/var/log/backup"
LOGDIR="/var/log/backup"
[ -d $LOGDIR ] || mkdir -p $LOGDIR
#
# TARGETDIR
# the directory for the backup files
# TARGETDIR="/backup"
TARGETDIR="/backup"
#
# TMPFILE
# file for tempory save of configuration, uses the bash env. $RANDOM
# TMPFILE="/tmp/$RANDOM.tmp"
TMPFILE="/tmp/$RANDOM.tmp"
TARTMPFILE="/tmp/$RANDOM.file"
#
# BACKUPDIRS
# get directories and description from seperate config file
# BACKUPDIRS=`cat $CONFIGDIR/backup-dirs.conf | grep -v "#"`
BACKUPDIRS=`cat $CONFIGDIR/backup-dirs.conf | grep -v "#"`
#
# WEEKLYCHANGE
# the day of the week for change the weekly backup type daily <=> weekly
# depends off system settings, Sunday or Monday is 0 ("date" and "cron")
# On Linux default is 0 = sunday,
# The default day for weekly change is Monday = 1
# WEEKLYCHANGE="1"
WEEKLYCHANGE="1"
#
# DAYOFWEEK
# get the current day of week
# DAYOFWEEK=`date +%w`
DAYOFWEEK=`date +%w`
#
############################################################################
#
# II Weekly settings
#
############################################################################
#
# WEEKLYDIR
# dirextory for the weekly backup files
# WEEKLYDIR="$TARGETDIR/weekly"
WEEKLYDIR="$TARGETDIR/weekly"
[ -d $WEEKLYDIR ] || mkdir -p $WEEKLYDIR
#
# WEEKLYLOG
# logfile for the weekly backup
# WEEKLYLOG="$LOGDIR/weekly.log"
WEEKLYLOG="$LOGDIR/weekly.log"
#
############################################################################
#
# III Daily settings
#
############################################################################
#
# DAILYDIR
# dirextory for the daily backup files
# DAILYDIR="$TARGETDIR/inc"
DAILYDIR="$TARGETDIR/inc"
[ -d $DAILYDIR ] || mkdir -p $DAILYDIR
#
# DAILYLOG
# logfile for the daily backup
# DAILYLOG="$LOGDIR/daily.log"
DAILYLOG="$LOGDIR/daily.log"
#
# DAILYPREFIX
# filename prefix for daily backup files, builded with the date command
# DAILYPREFIX=`date +%a-%Y-%m-%d`
DAILYPREFIX=`date +%a-%Y-%m-%d`
#
# RELATEFILE
# the relation file for the daily incremental backups, needed by find
# the timestamp of this file is the criteria for incremental
# RELATEFILE=$LOGDIR/start-weekly.log
RELATEFILE=$LOGDIR/start-weekly.log
#
############################################################################
#
# IV Mail notification
#
############################################################################
#
# SENDMAILBIN
# sendmail binary with params to use to send a mail, input with pipe
# SENDMAILBIN="/usr/sbin/sendmail -t"
SENDMAILBIN="/usr/sbin/sendmail -t"
#
# SENDMAILTO
# sendmail syntax with addresses to send a mail with the result
# SENDMAILTO="root@localhost"
SENDMAILTO="root@vsxxxxxx.de"
#
############################################################################
#
# V Functions
#
############################################################################
#
# create the tar files, used by daily and weekly
createBackupFiles(){
SUBTOUSE=$1
for BACKSET in $BACKUPDIRS; do
DESC=`echo $BACKSET | awk -F ":" '{ print $1 }' `
SOURCE=`echo $BACKSET | awk -F ":" '{ print $2 }'`
$SUBTOUSE $SOURCE $DESC
done
}

# erzeugen des Dumps der MySQL-Datenbank
# sichern mit weekly/daily script

dumpMysqlDatabase(){
for NAME in $TABLES
do
mysqlhotcopy --allowold -u $USER -p $PASSWORD $NAME /var/mysqldump
done
}

# Loeschen der archivierten Backup-Logs
# im /var/log Verzeichnis
# *.gz files

EraseGzFiles(){
find /var/log -name *.gz -exec rm -f {} \;
}

# create a log-/statusfile from current job used by daily and weekly
createLOG(){
LOGFILE=$1
ARCHIVE=$2
echo "Backup and tar-archive status:" >> $LOGFILE
for files in `cat $ARCHIVE`
do
tar -tzvf $files >> $LOGFILE
done
echo "End is `date`" >> $LOGFILE

# create mailmessage
echo "To: $SENDMAILTO " > $TMPFILE
echo "Subject: Heutige Sicherung am `date +%D`" >> $TMPFILE
echo "" >> $TMPFILE
ANZAHL_FILES=$[ `wc -l < $LOGFILE` - 2 ]
cat $LOGFILE >> $TMPFILE
tr -s ' ' < $LOGFILE | awk '{summe += $3 } ; END {printf "\nSumme: %.2f MB\n", summe/1048576};' >> $TMPFILE
echo "Das sind: $ANZAHL_FILES Dateien" >> $TMPFILE
echo "Gruss Klaus" >> $TMPFILE
cat $TMPFILE | $SENDMAILBIN
rm -f $TMPFILE

}
Teil 3 folgt
 
[HowTo] backup Vserver Teil 3

Das Script fuer die taegliche Sicherung (incrementelles Backup)
#!/bin/sh
#
# /bin/daily.sh
# this script creates the daily backup
# as incremental from last weekly backup
#
if [ "$1" = "1" ]
then
set -x
fi

# source the config file
. /etc/backup/backup.conf

# my sub for daily incremental backup
createDaily (){
ALLSOURCE=$1
FILENAME=$2
SOURCEDIR=`echo $ALLSOURCE | sed s/,/\ /g`
find $SOURCEDIR -cnewer $RELATEFILE -type f > $TMPFILE
RECORDCOUNT=` wc -l $TMPFILE | awk '{ print $1 }' `
if [ "$RECORDCOUNT" == "0" ]; then
echo "no files for backup found in $SOURCEDIR" \
> $DAILYDIR/$DAILYPREFIX-$FILENAME.txt
else
tar -czf $DAILYDIR/$DAILYPREFIX-$FILENAME.tar.gz \
-T $TMPFILE -Pv \
> $DAILYDIR/$DAILYPREFIX-$FILENAME.txt
# Bilden der Tagessicherungsfiles
echo $DAILYDIR/$DAILYPREFIX-$FILENAME.tar.gz >> $TARTMPFILE

fi
rm -f $TMPFILE
}

# MAIN

if [ "$DAYOFWEEK" == "$WEEKLYCHANGE" ]; then
# only at day of weekly backup no incremental backup and delete
# the files from last old incremental backup week
# clean the target directory
rm -f $DAILYDIR/*
else
# dump the MySQL Databases
dumpMysqlDatabase

# create the backup files
createBackupFiles "createDaily"

# create a status/log file
createLOG "$DAILYLOG" "$TARTMPFILE"
rm $TARTMPFILE
rm $LOGFILE

# Syncronisieren mit rsync nach zielserver und zielverzeichnis
# Hier /backup/$HOSTNAME auf $REMOTE_SERVER
rsync -bazv --delete \
--rsh="ssh -p $REMOTE_PORT" --backup-dir=/backup/$HOSTNAME/backup \
$DAILYDIR $USER@$REMOTE_SERVER:/backup/$HOSTNAME


fi

set +x

und das Script fuer die woechentliche Sicherung (FullBackup)
Wer seine .gz files aus /var/log dann loeschen will den Kommentar entfernen (rot)

#!/bin/bash
#
# /bin/weekly.sh
#
# this script creates the weekly backup
#
if [ "$1" = "1" ]
then
set -x
fi

# source the config file
. /etc/backup/backup.conf

# my sub for weekly full backup
createWeekly (){
ALLSOURCE=$1
FILENAME=$2
SOURCEDIR=` echo $ALLSOURCE | sed s/,/\ /g`
tar -czf $WEEKLYDIR/$FILENAME.tar.gz $SOURCEDIR -Pv \
> $WEEKLYDIR/$FILENAME.txt
# Bilden der Tagessicherungsfiles
echo $WEEKLYDIR/$FILENAME.tar.gz >> $TARTMPFILE
}

### MAIN

if [ "$DAYOFWEEK" == "$WEEKLYCHANGE" ]; then
# clean the target directory
rm -f $WEEKLYDIR/*

# dump the MySQL Databases
dumpMysqlDatabase

# create the relativ file for incremental backups
echo "Start the weekly backup" > $RELATEFILE

# create tar files
createBackupFiles "createWeekly"

# clean inc directory
rm -f $DAILYDIR/*

# erase *.gz files in /var/log
# Loeschen ausgesetzt
# EraseGzFiles

# create status/logfile
createLOG "$WEEKLYLOG" "$TARTMPFILE"
rm $TARTMPFILE
rm $LOGFILE
# Syncronisieren mit rsync nach zielserver und zielverzeichnis
# Hier /backup/$HOSTNAME auf $REMOTE_SERVER
rsync -bazv --delete \
--rsh="ssh -p $REMOTE_PORT" --backup-dir=/backup/$HOSTNAME/backup \
$WEEKLYDIR $USER@$REMOTE_SERVER:/backup/$HOSTNAME




fi


set +x
Teil 4 folgt (morgen vielleicht), aber Ihr habt ja schon mal was zum lesen ;)
 
Danke für die große Mühe mit dem HowTo. :)

Kleine Änderung: Ich hab die Themen mal zusammen geführt.
 
Und der letzte Teil (???)

Teil 4
So, was uns nun noch fehlt sind:
1. die /etc/backup/backup.cron ## die Eintraege fuer den cron
2. die /etc/backup/backup-dirs.conf ## die Konfigdatei fuer die
## Verzeichnisse
Zu 1.
Den Inhalt der Datei habe ich in die crontab von root eingetragen.
(crontab -e)
---------------------------------------
# /etc/cron.d/backup.d
# backup jobs with incremental concept
08 03 * * * /bin/daily.sh
38 05 * * * /bin/weekly.sh
----------------------------------------



Zu 2.
Die Datei hat einen strukturierten Aufbau.
Dabei bildet der Label (bis :) den Dateinamen fuer das Tar Archiv
und das was dahinter steht stellen die Verzeichnisse dar, welche mit
allen Verzeichnissen und Unterverzeichnissen gesichert werden.
Denkt bitte daran, dass tar relativ sichert !!! (ohne leading slash).
D.h. beim Ruecksichern / restoren muss man dazu die Position /
im Verzeichnisbaum einnehmen. ---> siehe tar Doku


####################################################################
#
#
# list of directory's to backup with filename for tar- file
#
# /etc/backup/backup-dirs.conf
#
# sample:
# backup;/backup/config,/backup/etc,/backup/var
####################################################################
# Server
etc:/etc
root:/root
var-spool-mail:/var/spool/mail

#named:/var/named

##f-prot:/usr/local/f-prot

# Sourcen
#source:/usr/local/src

# Data
#home:/home

mysql:/var/mysqldump

# crontabs
cron:/var/spool/cron

# logfiles
log:/var/log

# die Webverzeichnisse
web1:/var/www/web1
web2:/var/www/web2
web3:/var/www/web3
web4:/var/www/web4
web5:/var/www/web5
web6:/var/www/web6
web7:/var/www/web7
web8:/var/www/web8
web9:/var/www/web9
web10:/var/www/web10



# confixx Verzeichnis
#confixx:/var/www/confixx
# falls alle Webverzeichnisse in ein tar file
# httpd:/var/www

# End of file

######
Ja, nun die Files in die Richtigen Verzeichnisse gebracht, die
Konfiguration angepasst und dann?

Erst mal testen.

Meine Scripte enthalten noch die rsync Variante auf anderen Servern
eine Kopie der Sicherung anzulegen. Wer das nicht brauch (ich brauche es halt),
sollte diese punkte auskommentieren.
Das waere in

/bin/daily.sh
Zeile ab 57 bis 59
---------------------------------------
# Syncronisieren mit rsync nach zielserver und zielverzeichnis
# Hier /backup/$HOSTNAME auf $REMOTE_SERVER
rsync -bazv --delete \
--rsh="ssh -p $REMOTE_PORT" --backup-dir=/backup/$HOSTNAME/backup \
$DAILYDIR $USER@$REMOTE_SERVER:/backup/$HOSTNAME
----------------------------------------
und
/bin/weekly.sh
Zeile 52 bis 56
----------------------------------------
# Syncronisieren mit rsync nach zielserver und zielverzeichnis
# Hier /backup/$HOSTNAME auf $REMOTE_SERVER
rsync -bazv --delete \
--rsh="ssh -p $REMOTE_PORT" --backup-dir=/backup/$HOSTNAME/backup \
$WEEKLYDIR $USER@$REMOTE_SERVER:/backup/$HOSTNAME
----------------------------------------
Tests:

So nun kann man testen.
Erstmal sollte man nur mit einem Testverzeichnis anfangen.

Also in die /etc/backup/backup-dirs.conf mal
nur ein Verzeichnis eintragen.

z.Bsp.:
web1:/var/www/web1

Dann ein Fullbackup. Da das Fullbackup nur an dem zugewiesenen Tag ausgefuehrt wird.
Und es ist angenommen Mittwoch. Muss man in der Datei /etc/backup/backup.conf
Zeile 91
WEEKLYCHANGE="3"

einstellen.
Dann an der Shell
/bin/weekly.sh
sollte etwas am Bilschirm bewegen.
Wenn alles klar ging. sollte im Verzeichnis /backup/weekly
zwei Dateien liegen:
-rw-r--r-- 1 root root 8460210 Oct 18 00:55 web1.tar.gz
-rw-r--r-- 1 root root 26868 Oct 18 00:55 web1.txt
Die txt-Datei ist die Beschreibungsdatei.
nun das incrementelle Backup
wir aendern mal die Datumseintraege der dateien des web1/html Verzeichnisses
auf die schnelle mit:
find /var/www/web1/html -type f -exec touch {} \;

Nun das script daily.sh

/bin/daily.sh

und im Verzeichnis
/backup/inc
sollten (mindestens) die zwei Dateien auftauchen:
-rw-r--r-- 1 root root 326282 Oct 18 15:05 Tue-2005-10-18-web1.tar.gz
-rw-r--r-- 1 root root 2249 Oct 18 15:05 Tue-2005-10-18-web1.txt
Die zwei Dateien sind immer dabei - es sind die mysql-Datenbanken
Diese werden immer mit gesichert
-rw-r--r-- 1 root root 19264977 Oct 18 15:08 Tue-2005-10-18-mysql.tar.gz
-rw-r--r-- 1 root root 36168 Oct 18 15:08 Tue-2005-10-18-mysql.txt
Falls etwas nicht so laeuft wie erwartet gibt es in den beiden scripten noch die
Debug flags. Das ist dann was fuer Shell Kenner.
durch Aufruf der Dateien mit Argument 1
Wird das Debugging aktiviert (nur fuer den Lauf)
also
/bin/daily.sh 1

und man bekommt die Shellersetzungen zu Gesicht, falls mit den Variablen was nicht stimmt
Achso, wenn nun die email Adresse korrekt eingetragen war, dann sollte der Empfaenger
auch post erhalten haben.
Das Archiv lege ich nach http://tuxplay.de/forum/backup.tgz

Ich baue auch noch ein pdf welches ich dann dort hinlege.
So nun isses 1:45 Uhr oder so, ich will noch nen schluck lesen.

Fragen ??
mailto:forum(at)tuxplay.de

oder hier stellen

Gruss
Klaus
 
Danke für dieses schöne HOWTO. Hat alles bestens geklappt und
jetzt bin ich mal ganz gespannt, was morgen auf dem Server liegt.

Lediglich die Pfade zu den .sh-Dateien sind nicht /bin/*.sh, sondern
/etc/backup/*.sh.

Interessant wäre noch die genaue Vorgehensweise, wenn man dann
einzelne Dateien / Verzeichnisse zurücksichern möchte.

Ciao

Martin:) :)
 
Last edited by a moderator:
fmschrader said:
Danke für dieses schöne HOWTO. Hat alles bestens geklappt und
jetzt bin ich mal ganz gespannt, was morgen auf dem Server liegt.

Lediglich die Pfade zu den .sh-Dateien sind nicht /bin/*.sh, sondern
/etc/backup/*.sh.
Ja, da habe ich doch glatt vergessen zu schreiben, dass die beiden shellscripts
dahin zu kopieren sind, wo sie auch hingehoeren.
nach /bin

Interessant wäre noch die genaue Vorgehensweise, wenn man dann
einzelne Dateien / Verzeichnisse zurücksichern möchte.

Ciao

Martin:) :)

Tscha, mit den normalen Verzeichnissen eigentliche kein grosses Ding

wichtig waere nur, falls die daten am urspruenglichen Ort zurueckgesichert werden sollen (was ja meist der Fall ist), dass man zum zuruecksichern im Verzeichnisbaum an der [root] steht !!
von da aus kann man das restoring mit tar durchfuehren.

bsp.: ich moechte das fullbackup (weekly) des Users web7 zuruecksichern.
Das tar file liegt unter /backup/weekly/web7.tar.gz

1.
cd /
2.
tar xzf /backup/weekly/web7.tar.gz

fertig

Kurzform

(cd / ; tar xzf /backup/weekly/web7.tar.gz)

angenommen ich brauche nur das 'html' Verzeichnis daraus...
(cd / ; tar xzf /backup/weekly/web7.tar.gz /var/www/web7/html)

fertig.

Ich moechte alle archive wieder entpacken !!! VORSICHT !!!

cd /
for archiv in `ls /backup/weekly/*.gz`
do
tar xzf $archiv
done
die kleinen strichelchen vor und hinter dem Ausdruck `ls /backup/weekly/*.gz` sind backticks also <SHIFT> ` (neben <BACKSPACE> Taste)
aber das sollte man vorher mal woanders testen

cd /tmp
mkdir restore
cd restore
for archiv in `ls /backup/weekly/*.gz`
do
tar xzf $archiv
done

Danach kann man ja erst mal in Ruhe nachsehen was Sache ist.
Bitte nicht vergessen dabschliessend das testverzeichnis wieder zu loeschen!!
cd /tmp
rm -r restore


Gruss
Klaus
 
Spitze!

Danke gnugnu13 für deine Mühe. Du bist ein gutes Vorbild für einen Neuling wie mich. Ich werde auch meine Skripte mit anderen Forumnutzern teilen, soweit Bedarf da ist.

Ich habe die Skripte unter Suse 9.3 mit Confixx eingesetzt. Sie funktionieren sehr gut.

Zur Installation und Deinstallation habe ich zwei Skripte geschrieben. Bei Install-Skript werden die nötigen Verzeichnisse automatisch angelegt und die zugehörigen Dateien reinkopiert. Beim Deinstall-Skript werden alle angelegten Verzeichnisse und kopierte Dateien gelöscht. Beim Testen haben diese Skripte meine Arbeit sehr erleichtert. Falls es andere Newbies wie mich interessiert kann ich sie hier veröffentlichen.

Ich habe jetzt zwei Fragen , die ich weder per Suchfunktion im Forum noch durch Googeln klären konnte.
1. Die Datenbanken werden mit mysqlhotcopy gesichert. Die gesicherten Daten befinden sich nach entpacken der Xxx-xxxx-xx-xx-mysql.tar.gz-Datei in den Verzeichnissen /var/mysqldump/confixx und /var/mysqldump/mysql. Wie werden diese zurück in die Datenbank geschrieben?
2. Wie kann ich meine Sicherungsdatei xxx-mysql.tar.gz per Shellbefehl als eMail-Anhang an meine gmx-Adresse schicken? Ich würde zur Zeit (obwohl es ein sehr unsicherer Weg ist) noch wegen der geringen Datenbankgröße so meine Daten absichern. Ich habe die jetzige Standartinstallation Suse mit Confixx für vServer Basic, d.h. postfix als Mailserver.

Für jede Hilfe bin ich dankbar.

Gruß,
Wind
 
Last edited by a moderator:
Wie Restore ich eine Datenbank/Tabelle und anderes

Hi Gemeinde,
Wenn mehr Luft ist schreibe ich auch mal noch das HOWTO für
das restore.
Hier nun mal der Tipp für die mysql Datenbanken.

wind said:
Zur Installation und Deinstallation habe ich zwei Skripte geschrieben. Bei Install-Skript werden die nötigen Verzeichnisse automatisch angelegt und die zugehörigen Dateien reinkopiert. Beim Deinstall-Skript werden alle angelegten Verzeichnisse und kopierte Dateien gelöscht. Beim Testen haben diese Skripte meine Arbeit sehr erleichtert. Falls es andere Newbies wie mich interessiert kann ich sie hier veröffentlichen.
Ich baue mal noch nen RPM da ist danne alles drinne :D

wind said:
Ich habe jetzt zwei Fragen , die ich weder per Suchfunktion im Forum noch durch Googeln klären konnte.
1. Die Datenbanken werden mit mysqlhotcopy gesichert. Die gesicherten Daten befinden sich nach entpacken der Xxx-xxxx-xx-xx-mysql.tar.gz-Datei in den Verzeichnissen /var/mysqldump/confixx und /var/mysqldump/mysql. Wie werden diese zurück in die Datenbank geschrieben?
2. Wie kann ich meine Sicherungsdatei xxx-mysql.tar.gz per Shellbefehl als eMail-Anhang an meine gmx-Adresse schicken? Ich würde zur Zeit (obwohl es ein sehr unsicherer Weg ist) noch wegen der geringen Datenbankgröße so meine Daten absichern. Ich habe die jetzige Standartinstallation Suse mit Confixx für vServer Basic, d.h. postfix als Mailserver.

Zu 1.
Bleiben wir gleich bei der mysql Datenbank.
mysqlhotcopy ist ein PerlScript, welches die Datenbanken (bei laufendem mysqld) sichert - kein triviales Ding.

Das Zielverzeichnis der mysql Datenbank ist /var/mysqldump.
Darin befinden sich nun die eigentlichen Datenbanken - jeweils in einem eigenem Unterverzeichnis.

Angenommen Du arbeitest mit phpmyadmin ( ueber den Webserver ) - so wie ich letztens - und loeschst ausversehen in der Datenbank confixx und da in der Tabelle admin einen Datensatz ( ja, da steht grade nur einer drinne - halt als Beispiel) und Du weisst nicht mehr was der Datensatz so enthielt, ist es zeit auf das Backup zurueckzugreifen.

Wichtig !! kopieren der Datenbankdateien NUR !!! bei heruntergefahrener
Datenbankengine (mysqld). Also VOR dem kopieren bei SuSE 'rcmyslq stop'
ausfuehren!! - Bei RedHat 9 ist es der befehl 'service mysqld stop'.
So nun sollte man schon wissen, welche Datenbank (und welche Tabelle) man restoren will. In unserem Fall die Tabelle admin.
Das Verzeichnis /var/mysqldump enthaelt:
Code:
15xxyy:/var/mysqldump # ls -lisa
total 37
15352686    2 drwx------   11 root     root         2048 Oct 24 05:38 .
29541230    2 drwxr-xr-x   24 root     root         2048 Jul  7 12:07 ..
23912520    4 drwxr-x---    2 root     root         4096 Oct 24 05:38 confixx
47858204    2 drwxr-x---    2 root     root         2048 Oct 24 05:38 mailbox
54322268    2 drwxr-x---    2 root     root         2048 Oct 24 05:38 mysql
5275822   11 drwxr-x---    2 root     root        10240 Oct 24 05:38 usr_web17_1
36765920    2 drwxr-x---    2 root     root         2048 Oct 24 05:38 usr_web1_1
34267220    6 drwxr-x---    2 root     root         6144 Oct 24 05:38 usr_web2_1
17244374    2 drwxr-x---    2 root     root         2048 Oct 24 05:38 web10_1
17342618    2 drwxr-x---    2 root     root         2048 Oct 24 05:38 web23_1
60286165    2 drwxr-x---    2 root     root         2048 Oct 24 05:38 web2_1
15xxyy:/var/mysqldump #
Wir wechseln nach confixx und lassen uns anzeigen:
Code:
15xxyy:/var/mysqldump/confixx # ls -lisa
total 537
23912520    4 drwxr-x---    2 root     root         4096 Oct 24 05:38 .
15352686    2 drwx------   11 root     root         2048 Oct 24 05:38 ..
23912522    1 -rw-rw----    1 mysql    mysql         592 Oct 23 14:50 admin.MYD
23912523    1 -rw-rw----    1 mysql    mysql        1024 Oct 24 05:38 admin.MYI
23912524   12 -rw-rw----    1 mysql    mysql       10556 Oct 23 11:22 admin.frm
23912525    1 -rw-rw----    1 mysql    mysql          76 Oct 24 05:32 allgemein.MYD
23912526    1 -rw-rw----    1 mysql    mysql        1024 Oct 24 05:38 allgemein.MYI
23912527   11 -rw-rw----    1 mysql    mysql        9964 Aug 28  2003 allgemein.frm
23912528    2 -rw-rw----    1 mysql    mysql        1228 Mar 10  2005 anbieter.MYD
23912529    2 -rw-rw----    1 mysql    mysql        2048 Mar 11  2005 anbieter.MYI
23912530   17 -rw-rw----    1 mysql    mysql       15544 Aug 28  2003 anbieter.frm
23912531    1 -rw-rw----    1 mysql    mysql          96 Mar 10  2005 angebote.MYD
23912532    2 -rw-rw----    1 mysql    mysql        2048 Mar 11  2005 angebote.MYI
23912533   11 -rw-rw----    1 mysql    mysql        9572 Aug 28  2003 angebote.frm
23912534    0 -rw-rw----    1 mysql    mysql           0 Aug 28  2003 autoresponder
.MYD
23912535    1 -rw-rw----    1 mysql    mysql        1024 Aug 28  2003 autoresponder
.MYI
23912536   10 -rw-rw----    1 mysql    mysql        8898 Aug 28  2003 autoresponder
.....
und ne Menge weiterer Tabellen. Die Tabellen haben auch den richtigen Eigentuemer/Gruppe und die richtigen Rechte!!
Die Tabelle admin besteht aus 3 Dateien:

Code:
15352686    2 drwx------   11 root     root         2048 Oct 24 05:38 ..
23912522    1 -rw-rw----    1 mysql    mysql         592 Oct 23 14:50 admin.MYD
23912523    1 -rw-rw----    1 mysql    mysql        1024 Oct 24 05:38 admin.MYI
23912524   12 -rw-rw----    1 mysql    mysql       10556 Oct 23 11:22 admin.frm
Diese 3 Dateien kopiern wir einfach in das Zielverzeichnis mit:
cp /var/mysqldump/confixx/admin* /var/lib/mysql/confixx/
.
Dort befinden sich die eigentlichen Datenbankdateien. (unter /var/lib/mysql)
Nun noch den Daemon neu starten : 'rcmysql start' bzw. 'service mysqld start'
und mit phpmyadmin nachgesehen - voila , alles im Lot.

Mit anderen Worten. Mysqlhotcopy erzeugt ein reines Backup der Datenbanken
von /var/lib/mysql nach /var/lib/mysqldump.
Wir sichern mit unserem Script dann dieses Verzeichnis (/var/mysqldump) in ein komprimiertes Tar-Archiv unter /backup/weekly bzw. /backup/inc.
In meinem Script sichere ich jeden Tag die komplette Datenbank.
Im /var/lib/mysqldump Verzeichnis liegt das Backup vom letztem Lauf.
Falls ich ein Restore von einem anderem Datum benoetige, muss ich das vorher entpacken. ( Wie immer mehrere Moeglichkeiten).
Am einfachsten , wir gehen vom Fullbackup aus (unter /backup/weekly)

Code:
cd /
ls /backup/weekly

15xxyy:/ # ls /backup/weekly
confixx.tar.gz   log.tar.gz             web1.tar.gz   web14.tar.gz  web19.tar.gz  web23.tar.gz  web6.tar.gz
confixx.txt      log.txt                web1.txt      web14.txt     web19.txt     web23.txt     web6.txt
cron.tar.gz      mysql.tar.gz           web10.tar.gz  web15.tar.gz  web2.tar.gz   web24.tar.gz  web7.tar.gz
cron.txt         mysql.txt              web10.txt     web15.txt     web2.txt      web24.txt     web7.txt
etc.tar.gz       named.tar.gz           web11.tar.gz  web16.tar.gz  web20.tar.gz  web3.tar.gz   web8.tar.gz
etc.txt          named.txt              web11.txt     web16.txt     web20.txt     web3.txt      web8.txt
grundweb.tar.gz  root.tar.gz            web12.tar.gz  web17.tar.gz  web21.tar.gz  web4.tar.gz   web9.tar.gz
grundweb.txt     root.txt               web12.txt     web17.txt     web21.txt     web4.txt      web9.txt
home.tar.gz      var-spool-mail.tar.gz  web13.tar.gz  web18.tar.gz  web22.tar.gz  web5.tar.gz
home.txt         var-spool-mail.txt     web13.txt     web18.txt     web22.txt     web5.txt
151219:/ #tar xzf /backup/weekly/mysql.tar.gz

Damit wird das tarfile unter /var/mysqldump entpackt und man kann, mit der oben beschriebenen Prozedur das Restoring durchfuehren.

Das ganze kann man dann noch in ein script packen. Da ich aber Restoring sehr selten benoetige, bevorzuge ich die manuelle Methode.


So und nun zu 2.

Eine mail an jemanden mit Anhang zu senden ist nicht trivial, da es sich ja um eine MIME (also mail Erweiterung handelt.)
Eine Moeglichkeit: (erfordert, dass das Paket uudeview installiert wird (Yast).
Also etwa so
echo "Text der Mail"| uuenview -b -m <Empfänger> -s <Subject> -a
<Attachment>

Bsp.: echo "Hier kommt das Archiv vom `date`" | uuenview -b -m admin@deinhost.de -s Datenbanksicherung -a /backup/weekly/mysql.tar.gz

Fragen ?
Wie immer Hier :p
Gruss
Klaus
 
Danke!

Funktioniert wunderbar.
Herzlichen Dank für deine ausführliche Darstellung gnugu13.
Hast sehr geholfen.
1. Habe für einen kompletten RESTORE (nach einem vServer-PowerRestore) folgendes Skript benutzt:
Code:
cd /
for archiv in `ls /backup/weekly/*.gz`
do
tar xzf $archiv
done
rcmysql stop
cp -R /var/mysqldump/* /var/lib/mysql/*
rcmysql start
2. Auf UUDeview wäre ich nie gekommen. Habe es bei yast nicht gefunden. Und dann:
Code:
wget [URL="http://www.fpx.de/fp/Software/UUDeview/download/uudeview-0.5.20.tar.gz"]http://www.fpx.de/fp/Software/UUDeview/download/uudeview-0.5.20.tar.gz[/URL] 
tar xvfz uudeview-0.5.20.tar.gz 
cd uudeview-0.5.20 
./configure 
make 
make install 
rm -R uudeview-0.5.20
... und UUDeview läuft. MySQL-Backup per Mail kommt an.
Nochmals. Danke..
und Gruß
wind
 
Hallo Klaus,

Deine Backup-Skripte laufen bei mir nun seit Monaten problemlos im HIntergrund nachts und jeden Morgen habe ich eine Protokoll-Mail im
Eingang. Vielen Dank!

Eine Frage kommt mir aber auf: Die Skripte sind so geschrieben, daß
ein inkrementelles Backup immer alle Files erfasst, die nach dem letzten vollständigen Backup geändert wurden. Das bedeutet, daß ein File im schlimmsten Fall sechs Mal gesichert wird, auch wenn es nur
am ersten Tag nach der Komplettsicherung geändert wurde.

Das führt zu unnötig großen Backup-Files. Wäre es nicht machbar, die Files nur zu sichern, wenn sie seit dem letzten Komplett- oder
Teil-Backup geändert wurden?

Was müßte dazu gemacht werden? Ein Datumsvergleich nicht nur mit
der letzten Komplettsicherung, sondern auch mit der letzten Teilsicherung? Oder aber eine Auswertung des Archiv-Signs (gibts das überhaupt auf Linux?)?.

Habe ich das verständlich geschrieben? Ich meine, daß eine Datei, die am Tag 1 nach der Komplettsicherung geändert wurde auch nur am
Tag 1 gesichert wird und nicht auch am Tag 2 und 3 und 4 und 5 und
6. Geht das irgendwie?

Ciao

Martin
 
inkrementelles versus differentielles Backup

Tscha prinzipiell wäre es möglich die Backupstrategie zu wechseln.
Allgemein gilt:

Differentielles Backup

Bei einem differentiellen Backup werden nur die seit dem letzten
vollständigen Backup geänderten Dateien gesichert. Dies spart
sowohl Zeit als auch Speicherplatz.

Bei einer Wiederherstellung der Daten muss man dabei allerdings mit mehreren
Medien arbeiten: Zuerst wird das vollständige Backup eingespielt und
danach das differentielle Backup.

Inkrementelles Backup


Beim inkrementellen Backup werden nur die Dateien gesichert,
die seit dem letzten Backup (full oder differential/incremental) geändert wurden. Daher eignet
sich das inkrementelle Backup besonders für die tägliche
Sicherung.
Bei einer Wiederherstellung der Daten muss man dabei allerdings mit mehreren
Medien arbeiten: Zuerst wird das vollständige Backup eingespielt und
danach alle incremental Backups bis zum jüngsten Backup.

d.h. Da wir Montags ein Fullbackup machen und bis Sonntag mit incremential Backup arbeiten, würde bei einem Crash am Sonntag es erforderlich machen
alle Backups ( Mo,Di,Mi,Do,Fr,Sa ) in der Reihenfolge in das System zu restoren.

----
Wie dem auch sei. Unser Backup Scriptum nutzt als Vergleichskriterium das Änderungsdatum. Derzeit wird bei einem Fullbackup (Freitags)
durch das Script : /bin/weekly.sh

Code:
### MAIN

if [ "$DAYOFWEEK" == "$WEEKLYCHANGE" ]; then
        # clean the target directory
        rm -f $WEEKLYDIR/*

        # dump the MySQL Databases
        dumpMysqlDatabase

        # create the relativ file for incremental backups
        echo "Start the weekly backup" > $RELATEFILE

        # create tar files
        createBackupFiles "createWeekly"

durch die echo Anweisung wird die Bezugsdatei (normalerweise /var/log/backup/start-weekly.log) erzeugt. Diese Datei ist der Ausgangspunkt
für die weiteren incrementiellen Backups.
Bei dem Script /bin/daily.sh
suchen wir nun die Dateien, welche sich seit dem Datum der Bezugsdatei
geändert haben:
Code:
# my sub for daily incremental backup
createDaily (){
        ALLSOURCE=$1
        FILENAME=$2
        SOURCEDIR=`echo $ALLSOURCE | sed s/,/\ /g`
        find $SOURCEDIR -cnewer $RELATEFILE -type f > $TMPFILE
        RECORDCOUNT=` wc -l $TMPFILE | awk '{ print $1 }' `
        if [ "$RECORDCOUNT" == "0" ]; then
                 echo "no files for backup found in $SOURCEDIR" \
                         > $DAILYDIR/$DAILYPREFIX-$FILENAME.txt
        else
Mit
find $SOURCEDIR -cnewer $RELATEFILE -type f > $TMPFILE
----------------^^^^^^
suchen wir die Dateien die jünger sind als das letzte Sicherungsdatum.

Das Umstellen auf eine differentielle Methode wird erreicht, wenn ich im Abschluss der Sicherung (täglich) das Datum der Vergleichsdatei auf das
aktuelle Datum setze :
z.Bsp.:

Code:
createDaily (){
        ALLSOURCE=$1
        FILENAME=$2
        SOURCEDIR=`echo $ALLSOURCE | sed s/,/\ /g`
        find $SOURCEDIR -cnewer $RELATEFILE -type f > $TMPFILE
        RECORDCOUNT=` wc -l $TMPFILE | awk '{ print $1 }' `
        if [ "$RECORDCOUNT" == "0" ]; then
                 echo "no files for backup found in $SOURCEDIR" \
                         > $DAILYDIR/$DAILYPREFIX-$FILENAME.txt
        else
                 tar -czf $DAILYDIR/$DAILYPREFIX-$FILENAME.tar.gz \
                        -T $TMPFILE -Pv \
                        > $DAILYDIR/$DAILYPREFIX-$FILENAME.txt
                 # Bilden der Tagessicherungsfiles
                 echo $DAILYDIR/$DAILYPREFIX-$FILENAME.tar.gz >> $TARTMPFILE
                 [COLOR="Red"]touch $RELATEFILE$[/COLOR]
        fi
        rm -f $TMPFILE
}

Dies könnte man nun noch erweitern, in dem wir ein neues script erzeugen
mit dem Namen dailydiff.sh und die entsprechenden Routinen aus daily.sh dort hinein kopiert und anpasst.
Nun kann man die Backupscripte unter /etc/backup noch modifizieren und den cron job anpassen.
Das testen sollte man natürlich nicht vergessen.

Schöne Woche noch

Gruss
Klaus
 
Last edited by a moderator:
Danke für die Mühe.

Dann werd ich einfach mal ein "touch $RELATEFILE$" in die daily.sh
einfügen und die Protokolle ein paar Tage lang beobachten.
Mittwoch oder Donnerstag werd ich ja sehen, was nachts läuft.

Ciao

Martin
 
fmschrader said:
Danke für die Mühe.

Dann werd ich einfach mal ein "touch $RELATEFILE$" in die daily.sh
einfügen und die Protokolle ein paar Tage lang beobachten.
Mittwoch oder Donnerstag werd ich ja sehen, was nachts läuft.

Ciao

Martin
Ähem, Hüstel,
da hat der Dreckfuhlerteufel zugeschlagen.
ändere mal auf
touch $RELATEFILE - kein $ am Ende !!
gruss
Klaus
 
Hallo Klaus,

irgendwie kann es das noch nicht sein. schau mal die magere Ausbeute
beim daily an.

Ciao

Martin

Backup and tar-archive status:
-rw-r--r-- root/root 1789 2005-12-15 02:30:38 /etc/apache2/sysconfig.d/loadmodule.conf
-rw-r--r-- root/root 268 2005-12-15 02:30:38 /etc/apache2/sysconfig.d/global.conf
-rw-r--r-- root/root 150 2005-12-15 02:30:38 /etc/apache2/sysconfig.d/include.conf
-rw-r----- root/root 3072 2005-12-15 00:51:47 /etc/mail/popauth.db
End is Thu Dec 15 03:15:53 CET 2005

Summe: 0.01 MB
Das sind: 4 Dateien
Gruss Klaus
 
fmschrader said:
Hallo Klaus,

irgendwie kann es das noch nicht sein. schau mal die magere Ausbeute
beim daily an.

Ciao

Martin

Backup and tar-archive status:
-rw-r--r-- root/root 1789 2005-12-15 02:30:38 /etc/apache2/sysconfig.d/loadmodule.conf
-rw-r--r-- root/root 268 2005-12-15 02:30:38 /etc/apache2/sysconfig.d/global.conf
-rw-r--r-- root/root 150 2005-12-15 02:30:38 /etc/apache2/sysconfig.d/include.conf
-rw-r----- root/root 3072 2005-12-15 00:51:47 /etc/mail/popauth.db
End is Thu Dec 15 03:15:53 CET 2005

Summe: 0.01 MB
Das sind: 4 Dateien
Gruss Klaus

Hmm,
gib mir mal das longlisting der Datei
aus /var/log/backup
etwa so:

Code:
-rw-r--r--    1 root     root           24 Dec 12 05:38 start-weekly.log
gruss klaus
 
Hey Klaus,

sorry, wie meinen? Ich habe Dir den Inhalt der Protokoll-Mail gepostet.
Geändert habe ich lediglich in der daily.sh die hinzugefügte Zeile, wie
Du vorgeschlagen hast.

Vor dieser Änderung hat die tägliche Sicherung jede Menge Dateien erfasst.
Siehe unten, das ist nur das Ende.

Ciao

Martin

-rw-r--r-- wwwrun/www 8723 2005-12-10 17:10:58 /srv/www/web16/html/joomla/templates/dwd_greybusiness/css/template_css.css
-rw-r--r-- root/root 5315605 2005-12-10 23:49:24 /srv/www/web16/log/access_log
-rw-r--r-- root/root 125578 2005-12-06 02:01:14 /srv/www/web16/log/old/access_log_2005_w49-0.gz
End is Sun Dec 11 03:17:17 CET 2005

Summe: 104.62 MB
Das sind: 2364 Dateien
Gruss Klaus
 
Back
Top