PHP & MySQL Engineering

Testsystem per Cronjob neu aufsetzen

Ich habe vor Ostern von einem meiner Leser folgende Frage erhalten:

Ich möchte ein CMS für Besucher als Testsystem anbieten. Dadurch wird dieses System aber immer von den Besuchern umkonfiguriert und hin und wieder unbrauchbar gemacht.

Bis jetzt habe ich immer einen Dump der Datenbank gemacht und von Hand täglich zurück geschrieben. Ebenso auch eine Kopie von den dazu gehörenden Template-Files. Könnte man dies nicht über ein Script automatisieren?

Ja, diesen Prozess kann man automatisieren, ich habe dieses Problem wie folgt gelöst:

1. Das Script

Über dieses Script werden sowohl die Dateien als auch die Datenbank des Testsystems gesichert und bei Bedarf wiederhergestellt. Ich habe das Script an meinem Blog getestet, die Benutzerdaten sowie die Ordner müsst Ihr natürlich an Eure eigene Umgebung anpassen. Weitere Erklärungen befinden sich unterhalb des Scriptes Icon Wink in Testsystem per Cronjob neu aufsetzen

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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#!/bin/sh
 
#Zugangsdaten der Datenbank
mysql_user="BENUTZERNAME"
mysql_pass="PASSWORT"
mysql_host="HOST"
mysql_database="DATENBANK"
 
#Ordner der Webseite, von der das Backup angelegt wird
original_folder=/var/www/lunar/public/htdocs
 
#Log Ordner
backup_log_folder=/var/www/lunar/local/scripts/website_backup/logs
 
#Log Dateien
backup_log_info=$backup_log_folder/backup.log
backup_log_error=$backup_lof_folder/backup.err
backup_log_date_format="%d.%m.%Y %R";
 
#Backup Ordner
backup_file_folder=/var/www/lunar/local/scripts/website_backup/backup
 
#Backup Dateien
backup_file_system=$backup_file_folder/backup_system.tar.gz
backup_file_database=$backup_file_folder/backup_database.sql.gz
 
#Vergangene Zeit berechnen
backup_start_time=`date +%s`
 
#Sicherheitskopie erstellen
if [ "$1" == "create" ]
then
        #Backup Ordner erstellen
        mkdir -p $backup_file_folder
 
        #Backup Ordner überprüfen
        if [ ! -d $backup_file_folder ]
        then
                echo "[`date +"$backup_log_date_format"`] Invalid directory $backup_file_folder, aborting" | tee -a $backup_log_error
                exit 1
        fi
 
        #Backup der Dateien anlegen
        #Hierbei wechselt tar zuerst in den Wurzelordner und erstellt dann das Backup
        #Damit dies funktioniert muss der erste Slash des Quellordners entfernt werden 
        #Diese Vorgehensweise verhindert den Hinweis "tar: Removing leading `/' from member names"
        tar -czf $backup_file_system -C / "${original_folder#"${original_folder%%[!/]*}"}"
 
        #Backup der Datenbank anlegen
        mysqldump --opt --add-drop-database  --password=$mysql_pass --user=$mysql_user --host=$mysql_host --databases $mysql_database | gzip > $backup_file_database
 
        #Falls der Fehler "Access denied...when using LOCK TABLES" auftreten sollte, dann hat der 
        #MySQL-Benutzer mit dem man arbeitet nicht die benötigten Benutzerrechte um Tabellen zu sperren.
        #Hier kann man den Parameter --lock-tables=false (hinter --opt anhängen) verwenden falls man keinen
        #Zugriff auf die Benutzerrechte hat
 
        #Loggen
        echo "[`date +"$backup_log_date_format"`] Backup of folder [$original_folder] and database [$mysql_database] created" | tee -a $backup_log_info
 
#Webseite wiederherstellen
elif [ "$1" == "restore" ]
then
        #Backup Dateien überprüfen
        if [ ! -f $backup_file_system ]
        then
                echo "[`date +"$backup_log_date_format"`] System backup file $backup_file_system not found, aborting" | tee -a $backup_log_error
                exit 1
        fi
 
        if [ ! -f $backup_file_database ]
        then
                echo "[`date +"$backup_log_date_format"`] Database backup file $backup_file_database not found, aborting" | tee -a $backup_log_error
                exit 1
        fi
 
        #Dateien wiederherstellen
        tar --recursive-unlink -xzf $backup_file_system -C /
 
        #Datenbank wiederherstellen
        gunzip < $backup_file_database | mysql --password=$mysql_pass --user=$mysql_user --host=$mysql_host
 
        #Loggen
        echo "[`date +"$backup_log_date_format"`] Backup of folder [$original_folder] and database [$mysql_database] restored" | tee -a $backup_log_info
 
#Falscher Parameter
else
        echo "Aufruf wie folgt:"
        echo " $0 create   : Sicherheitskopie der Webseite anlegen"
        echo " $0 restore  : Webseite anhand der Sicherheitskopie wiederherstellen"
        exit 1
fi
 
#Vergangene Zeit berechnen
backup_end_time=`date +%s`
backup_elapsed_time=`expr $backup_end_time - $backup_start_time`
echo -e "[`date +"$backup_log_date_format"`] Elapsed time "`date -d "1970-01-01 $backup_elapsed_time +sec" +"%H:%M:%S"`"" | tee -a $backup_log_info

Um das Script zu testen habe ich die folgenden Ordner angelegt:

/var/www/lunar/local/scripts/website_backup/
/var/www/lunar/local/scripts/website_backup/backup/
/var/www/lunar/local/scripts/website_backup/logs/

Das Script habe ich hier abgespeichert:

/var/www/lunar/local/scripts/website_backup/website_backup.sh

2. Das Testsystem abspeichern

Um das Testsystem abzuspeichern muss man das Script mit dem Parameter create aufrufen:

/var/www/lunar/local/scripts/website_backup # sh website_backup.sh create
[14.04.2009 13:20] Backup of folder [/var/www/lunar/public/htdocs] and database [lunar] created
[14.04.2009 13:20] Elapsed time 00:00:01

Hierbei wurden die folgenden Dateien angelegt:

/var/www/lunar/local/scripts/website_backup # ll backup/
total 3.0M
2009-04-14 13:20 backup_database.sql.gz
2009-04-14 13:20 backup_system.tar.gz

Noch ein kurzer Blick auf die Logs:

/var/www/lunar/local/scripts/website_backup # tail logs/backup.log 
[14.04.2009 13:20] Backup of folder [/var/www/lunar/public/htdocs] and database [lunar] created
[14.04.2009 13:20] Elapsed time 00:00:01

3. Das Testsystem wiederherstellen

Um das Testsystem wiederherzustellen muss man das Script mit dem Parameter restore aufrufen. Dies funktioniert natürlich nur dann, wenn bereits ein Backup vorhanden ist. Die Datenbank und Dateien des Testsystems werden hierbei komplett durch die gesicherten Versionen ersetzt.

/var/www/lunar/local/scripts/website_backup # sh website_backup.sh restore
[14.04.2009 13:31] Backup of folder [/var/www/lunar/public/htdocs] and database [lunar] restored
[14.04.2009 13:31] Elapsed time 00:00:01

4. Die Wiederherstellung automatisieren

Um die Wiederherstellung zu automatisieren bietet es sich an, zunächst eine Sicherheitskopie anzulegen (Siehe Punkt 2), und diese dann per Cronjob regelmässig neu aufzuspielen.

Hier zum Beispiel ein Cronjob, welcher das Testsystem stündlich wiederherstellen würde:

00 */1 * * * sh /var/www/lunar/local/scripts/website_backup/website_backup.sh

Für Anregungen und Fragen könnt Ihr mir gerne einen Kommentar hinterlassen, oder eine Frage an den Experten stellen.

 

Kommentare: 3

Kommentar hinterlassen »

 
 
 

Diese Scriptlösung habe ich schon lange gesucht.
Die Detailierte Ausführung und Beschreibung ist hervorragend. Da steht einem Online-Testlauf ja nichts mehr im Wege.
Vielen Dank für diese Lösung.
Die Ergebnisse werde ich gerne hier kommentieren.
Viele Grüße nach Luxembourg
G.H.W.

 
 

[18.04.2009 16:00] Backup of folder [/var/www/web112/html/src_files] and database [usr_xxxxx.xxx] restored
[18.04.2009 16:00] Elapsed time 00:00:02

Das ist doch klasse, wenn man so eine Email erhält! Das Script läuft auf Anhieb, ohne Probleme, es sichert Datenbank und Files.
Deshalb nochmals vielen Dank an dieser Stelle dafür.

 
 

Danke für das Feedback. Es freut mich dass ich Ihnen weiterhelfen habe können.

 
 

Kommentar hinterlassen

 
(Wird nicht veröffentlicht)
 
(rel="follow")
 
Kommentar *
 
Zehn + Sieben =