Domainfactory Datensicherung aller Webseiten und Datenbanken als Shell Script (cron Backup Shell Script)

Gepostet am Oktober 6, 2012

Backup bezogen auf Domainfactory

Wenn man einen Root-Server bei Domainfactory hat, ist es empfehlenswert alle auf den Server befindlichen Daten und Datenbanken regelmäßig zu sichern. Zwar werden die Daten der letzten 3 Tage auch von DF gesichert, jedoch ist das zurückspielen kostenpflichtig und wie gesagt sind 3 Tage oft zu kurz. Also heißt es selbst ein Shell Script zur Sicherung zu schreiben. Leider gibt es bei DF ein kleines Problem, was die ganze Sache erschwert, es gibt keinen globalen Datenbankbenutzer, bzw. kann dieser nicht über Shell auf die DB zugreifen. Jede Datenbank hat ihren eigenen Benutzer. Leider kann man die Datenbanksicherung somit nicht durch „show databases“ komplett automatisieren. Aber für alle, die dieses Problem nicht haben schreibe ich im zweiten Teil des Beitrags auch hierfür einen Lösungsansatz.

Serverstruktur:
/kunden/AUFTRAGSNUMMER_ID/webseiten/ — hier liegen alle Seiten in Unterordnern
/kunden/AUFTRAGSNUMMER_ID/backup/ — von mir neu erstellt
/kunden/AUFTRAGSNUMMER_ID/backup/bachup.sh — die Backup-Datei siehe unten
/kunden/AUFTRAGSNUMMER_ID/backup/files/ — Backup der Dateien
/kunden/AUFTRAGSNUMMER_ID/backup/databases/ — Backup der Datenkanben
Bitte die Ordnerstruktur wie oben beschrieben anlegen.

Vorgehensweise:
Das Script legt in den Verzeichnissen „files“ und „databases“ ein Unterordner mit dem aktuellen Datum/Zeit an. In diesen Unterordner werden alle Sicherungsdaten gespeichert. Ein .tar für alle in Webseiten befindlichen Ordner und eine .gz für alle angegeben Datenbanken. Bei jeder Ausführung wird ein neuer Ordner erstellt.

Script in „backup.sh“

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/bin/sh
 
#################################################################################################################################
## CONFIG *change*
#################################################################################################################################
path_datas=/kunden/AUFTRAGSNUMMER_ID/webseiten
path_backup_files=/kunden/AUFTRAGSNUMMER_ID/backup/files
path_backup_db=/kunden/AUFTRAGSNUMMER_ID/backup/databases
 
MyUSER_DBlist=("dbAUFTRAGSNUMMER" "dbAUFTRAGSNUMMER_1" "dbAUFTRAGSNUMMER_2")
MyPASSlist=("password1" "password2" "password2")
MyHOST="127.0.0.3"
MAX_BACKUP_FILES=30
 
#################################################################################################################################
## clear old backup files *not change*
#################################################################################################################################
cd ${path_backup_files}
countfolders=$(ls -1 | wc -l)
clearfolders=$((countfolders-MAX_BACKUP_FILES))
counter=0
if [[ "clearfolders" -gt 0 ]]; then
    for folder in *
    do  
        if [[ "$counter" -lt "clearfolders" ]]; then
            rm -rf ${path_backup_files}/${folder}
            rm -rf ${path_backup_db}/${folder}
        else
            break
        fi
        counter=$((counter+1))
    done
fi
 
#################################################################################################################################
## GLOBAL *not change*
#################################################################################################################################
DAT=`date +%Y_%m_%d_%H_%M`
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
TAR="$(which tar)"
GZIP="$(which gzip)"
 
userLen=${#MyUSER_DBlist[@]}
passLen=${#MyPASSlist[@]}
 
if [ ${userLen} != ${passLen} ]
then exit
fi
 
#################################################################################################################################
## Backup Files *not change*
#################################################################################################################################
cd ${path_backup_files}
mkdir backup_${DAT}
cd ${path_datas}
 
for folder in *
do  
    ${TAR} cfP ${path_backup_files}/backup_${DAT}/${folder}.tar ${path_datas}/${folder}
    echo backup "${folder}.tar" complete!
done
 
#################################################################################################################################
## Backup Database *not change*
#################################################################################################################################
cd ${path_backup_db}
mkdir backup_${DAT}
 
for (( i=0; i<${userLen}; i++ ));
do
    ${MYSQLDUMP} -u ${MyUSER_DBlist[$i]} -p${MyPASSlist[$i]} -h ${MyHOST} ${MyUSER_DBlist[$i]} | ${GZIP} -9 > ${path_backup_db}/backup_${DAT}/${MyUSER_DBlist[$i]}.gz
    echo backup "${MyUSER_DBlist[$i]}.gz" complete!
done

Als letztes muss das backup.sh Script auf ausführbar gesetzt und als cron im DF-Kundenbereich eingebunden werden.
Achtung: bricht der cron von Domainfactory einfach ab ohen fertig zu sein gibt es im Kundenbereich unter „Serverkonfiguration“ ein Zeitlimit und Speicherlimit, es ist empfehlenswert beide Optionen zu deaktivieren.

Datenbank Backup bezogen auf andere Server und Provider (automatisiert)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# config
MyUSER="MYSQL-USERNAME"
MyPASS="MYSQL-PASSWORD"
MyHOST="localhost"
 
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
GZIP="$(which gzip)"
 
#global
IGGY="test"
 
# Get all database list first
DBS="$($MYSQL -u $MyUSER -h $MyHOST -p$MyPASS -Bse 'show databases')"
 
# database backup
for db in $DBS
do
    skipdb=-1
    if [ "$IGGY" != "" ];
    then
	for i in $IGGY
	do
	    [ "$db" == "$i" ] && skipdb=1 || :
	done
    fi
 
    if [ "$skipdb" == "-1" ] ; then
	FILE="$MBD/$db.$HOST.$NOW.gz"
	# save db
        $MYSQLDUMP -u $MyUSER -h $MyHOST -p$MyPASS $db | $GZIP -9 > $FILE
    fi
done

Tags:

Eine Antwort bis “Domainfactory Datensicherung aller Webseiten und Datenbanken als Shell Script (cron Backup Shell Script)”

  1. Andrea Puiatti
    Nov 30, 2012
    Reply

    Hey Marcel,

    ich habe einige kleine Veränderungen gemacht falls jemand so wie ich, 1,2,3,4,5…131 database hat.
    Besser wäre ein file zu nutzen aber egal…

    In diese Version, „overwrite“ ich einfach das alte Backup weil ich duplicity (http://duplicity.nongnu.org) nutze.
    Das ist das beste Backup software dass ich gefunden habe.
    Viel besser als rsapshot oder rsync

    Nochmal danke für dein Script!

    #!/bin/sh

    #################################################################################################################################
    ## CONFIG *change*
    #################################################################################################################################
    path_datas=/kunden/372333_10437/webseiten
    path_backup_files=/kunden/372333_10437/backup/data
    path_backup_db=/kunden/372333_10437/backup/db

    #DATABASE NAME ROOT i.e. db382333
    dbName=“dbXXXXXX“

    #DATABASE NUMBER TO START FROM (usually 1) AND TO END (in this example I back up 131 databases)
    #be sure to enter X password and Y userid where X==Y
    dbStart=1
    dbEnd=131

    #THIS FUNCTION ADDS TO dbName A SEQUENTIAL NUMBER i.e. db382333_1, db382333_2, … ,db382333_131
    for (( i=0;i<$dbEnd;i++ ));
    do
    temp=$((i+1))
    dbList[$i]="$dbName""_""$temp"
    done

    MyPASSlist=(
    "password_db1"
    "password_db2"
    "password_db3"
    "password_db4"
    "password_db5"
    "password_db6"
    "password_db7"
    "password_db8"
    "password_db9"
    "password_db10"
    "…"
    "password_db131"
    )

    MyHOST="127.0.0.3"

    #################################################################################################################################
    ## GLOBAL *not change*
    #################################################################################################################################
    MYSQL="$(which mysql)"
    MYSQLDUMP="$(which mysqldump)"
    TAR="$(which tar)"
    GZIP="$(which gzip)"

    userLen=${#dbList[@]}
    passLen=${#MyPASSlist[@]}

    if [ ${userLen} != ${passLen} ]
    then exit
    fi

    #################################################################################################################################
    ## Backup Database *not change*
    #################################################################################################################################
    cd ${path_backup_db}

    for (( i=0; i ${path_backup_db}/${dbList[$i]}.gz
    done



Leave a Reply

 

Posts of Current Category



Facebook: