Backup: 7-zip und batch dateien für ein automatisiertes Backup

Ab und zu schaut man sich nach besseren Backup Programmen um. Ein Blogeintrag von Caschy hat mich dazu animiert. Da alle „normalen“ Backupprogramme das sichern ganzer Laufwerke nicht zulassen, habe ich mich auf die Suche nach etwas schlauerem gemacht. Die Idee war ein Pendant zum bash-Backupscript von mir zu finden ohne die Welt gleich neu erfinden zu müssen (sprich selber schreiben).

Auf Loogans Site wurde ich fündig.

Dieses Backup kann full oder auch incrementelle Backups erstellen.

Das Script besteht aus 7 Teilen:

  • Backup.cmd, ist das Haupscript das die Backup Kommandos ausführt
  • Backupset.txt, eine Liste der Ordner und Files die gesichert werden sollen
  • CurrentSet.txt, hier steht der Pfad zum aktuellen FullBackup. Dieser wird für das incrementelle Backup benötigt
  • FullBackup.cmd, zum starten des FullBackup
  • FullBackupSettings.ini, alle Einstellungen des FullBackup
  • IncrementalBackup.cmd, zum starten des incrementellen Backups
  • IncrementalBackupSettings.ini, alle Einstellungen des incrementellen Backups

Das Scriptgebilde kann natürlich auch gestrafft werden. Durch den bestehenden Aufbau lassen sich die Einstellungen relativ einfach ändern und zur Ausführung des Scripts reicht ein ExecuteScript. Im folgenden sind hier alle Scripts aufgeführt:

Backup.cmd


@echo off

echo TRACE: Start

IF EXIST %1 GOTO Begin

echo Settings file does not exist
GOTO End

:Begin

echo TRACE: Read settings
for /f "eol=# tokens=1,2 delims==" %%i in (%1) do SET %%i=%%j

set varNewBackupSet=%varBackupLocation%\%DATE:~-4%-%DATE:~3,2%-%DATE:~0,2%-%TIME:~0,2%-%TIME:~3,2%-backup.%varFormat%

IF "%varBackupType%"=="full" GOTO CreateNewSet

echo TRACE: Load existing set
for /F %%i in (CurrentSet.txt) do set varOldBackupSet=%%i

IF EXIST "%varOldBackupSet%" GOTO ExecuteIncremental

echo Backup set does not exist!
GOTO End

:CreateNewSet
echo TRACE: Create new set
echo %varNewBackupSet% > CurrentSet.txt

:ExecuteFull
echo TRACE: Execute Full backup
"%var7zipPath%\7z" a -t%varFormat% "%varNewBackupSet%" @"%varFileList%"
GOTO End

:ExecuteIncremental
echo TRACE: Execute Incremental backup
"%var7zipPath%\7z" u -u- -u!"%varNewBackupSet%" -t%varFormat% "%varOldBackupSet%" @"%varFileList%"

:End
echo TRACE: Finished
pause

Das Backup Script lädt die Einstellungen aus dem Parameter 1, macht ein paar Prüfungen und startet danach 7Zip zum Backup. In den Konfigurations-Dateien wird definiert was wie und wo.

BackupSet.txt


D:\Guild Wars\Screens
D:\camma\Documents
D:\camma\Favorites
C:\Users\camma\Desktop
D:\Logaan\Saved Games
C:\Users\camma\AppData\Local\2DBoy
C:\Users\camma\AppData\Local\Ascaron Entertainment
C:\Users\camma\AppData\Local\id Software
C:\Users\camma\AppData\Local\Ironclad Games
C:\Users\camma\AppData\Local\Rockstar Games
C:\Users\camma\AppData\Roaming\EditPlus 3
C:\Users\camma\AppData\Roaming\FileZilla
C:\Users\camma\AppData\Roaming\Free Download Manager
C:\Users\camma\AppData\Roaming\Xfire

Dies Dateiliste wird an 7Zip übergeben. Einzige Einschränkung ist hier, dass der gleiche Ordner oder die gleiche Datei nicht doppelt aufgeführt werden dürfen. Wenn mehrere Ordner an verschiedenen Stellen gleich heissen, kann dies auch durch mehrere Scripts gelöst werden, welche gleichnamige Ordner auf verschiedene BackupSets verteilt.

CurrentSet.txt


D:\2009-08-15-17-16-backup.zip

Hier ist der Pfad zum zuletzt angefertigten FullBackup enthalten. Die incrementellen Backups lesen diesen aus uns benützen das FullBackup zum Updaten der Dateienlisten die gesichert werden müssen.

FullBackup.cmd


@echo off
Backup D:\camma\Documents\Tools\7ZipBackup\FullBackupSettings.ini

Dieses startet das Hauptscript mit den entsprechenden Einstellungen. Falls mehrere Sets mit verschiedenen Einstellungen ausgeführt werden sollen, muss folgender Code benutzt werden:


@echo off
call Backup D:\camma\Documents\Tools\7ZipBackup\FullBackupSettings.ini
call Backup D:\camma\Documents\Tools\7ZipBackup\FullBackupSettings2.ini
call Backup D:\camma\Documents\Tools\7ZipBackup\FullBackupSettings3.ini

FullBackupSettings.ini


# File path to the 7-zip executables
var7zipPath=C:\Program Files\7-Zip

# Backup format
varFormat=zip

# Target location for the backup
varBackupLocation=D:

# List file
varFileList=D:\camma\Documents\Tools\7ZipBackup\BackupSet.txt

# Mode
varMode=a

# Type
varBackupType=full

Die Konfigurationsdatei wird im Hauptscript eingelesen. Es enthält den Modus des Backups, die Pfad angaben sowie Einstellungen von 7Zip.

IncrementalBackup.cmd

@echo off
Backup D:\camma\Documents\Tools\7ZipBackup\IncrementalBackupSettings.ini

Analog der FullBackup Konfiguration für das incrementelle Backup

IncrementalBackupSettings.ini

# File path to the 7-zip executables
var7zipPath=C:\Program Files\7-Zip

# Backup format
varFormat=zip

# Target location for the backup
varBackupLocation=D:

# List file
varFileList=D:\camma\Documents\Tools\7ZipBackup\BackupSet.txt

# Mode
varMode=u

# Type
varBackupType=incremental

Viel Spass beim testen und benutzen des Scripts.

Bash Script zum erstellen eines File und MySQL Backup mit FTP Upload

Update 21.07.2009
– mysqldump angepasst, damit die dumps auch mit phpMyAdmin eingelesen werden können.
– durchgängige Benennung der Dateien (Zeitformat überall gleich)
– Problembehebung Zeitformat (19:22:20 hat zumindest Mac auf einem smb Share nicht gerne)
– DB information_schema wird nicht mehr mitgesichert
– Vor jeder File Erstellung wird die Zeit neu eingelesen. Dadurch hat man die genaue Übersicht des Backupzeitpunkts

Update 30.06.2009 – INCFILE Pfad angepasst. Nun wird das tar-inc-backup.dat File sicher im gleichen Ordner wie das Script abgelegt.

Gestern habe ich das für mich ultimative Script zum erstellen eines Backup via Bash Script entdeckt.


#!/bin/sh
# Website + MySQL backup script
# Full backup day - Sun (rest of the day do incremental backup)
# Copyright (c) 2005-2006 nixCraft
# This script is licensed under GNU GPL version 2.0 or above
# Modified June 2009 by BlatterTech Informatik www.blattertech.ch
#
# Restore Database Backup
# gunzip mybackup.sql.gzip
# mysql -u USER -p dbname < mybackup.sql # # Restore Files # You need to restore the last full backup first ($FULLBACKUP day) # followed by each of the subsequent incremental backups to the # present day in the correct order. # # --------------------------------------------------------------------- ### Backp Name ### BACKUPSET="Backup of Website xy" SHORTNAME="websitexy" ### System Setup ### DIRS="/home/path/to/files /home/path/to/other/files" BACKUP=/tmp/backup.$$ NOW=$(date +"%Y%m%d") SCRIPTPATH=`dirname $0` INCFILE="$SCRIPTPATH/$SHORTNAME-tar-inc-backup.dat" DAY=$(date +"%u") # 1=Mon, 2=Tue, 3=Wed, .. FULLBACKUP="2" ### MySQL Setup ### MUSER="mysqluser" MPASS="mysqlpassword" MHOST="localhost" MYSQL="$(which mysql)" MYSQLDUMP="$(which mysqldump)" GZIP="$(which gzip)" ### FTP server Setup ### FTPD="/path/on/ftpserver" FTPU="ftpuser" FTPP="ftppassword" FTPS="your.ftpserver.com" NCFTP="$(which ncftpput)" ### Other stuff ### EMAILID="your@email.com" ### Start Backup for file system ### [ ! -d $BACKUP ] && mkdir -p $BACKUP || : ### See if we want to make a full backup ### i=$(date +"%Hh%Mm%Ss") if [ ! -f $INCFILE ]; then FTPD="$FTPD/full" FILE="$SHORTNAME-files-full-$NOW-$i.tar.gz" tar -g $INCFILE -zcvf $BACKUP/$FILE $DIRS elif [ "$DAY" == "$FULLBACKUP" ]; then FTPD="$FTPD/full" FILE="$SHORTNAME-files-full-$NOW-$i.tar.gz" tar -zcvf $BACKUP/$FILE $DIRS else FTPD="$FTPD/incremental" FILE="$SHORTNAME-files-i-$NOW-$i.tar.gz" tar -g $INCFILE -zcvf $BACKUP/$FILE $DIRS fi ### Start MySQL Backup ### # Get all databases name DBS="$($MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases')" for db in $DBS do if [ "$db" == "information_schema" ]; then continue fi i=$(date +"%Hh%Mm%Ss") FILE=$BACKUP/$SHORTNAME-mysql-$db.$NOW-$i.sql.gz $MYSQLDUMP -Q --opt --compact -u $MUSER -h $MHOST -p$MPASS $db | $GZIP -9 > $FILE
# FILE=$BACKUP/$SHORTNAME-mysql-$db.$NOW-$(date +"%T").sql.bz2
# $MYSQLDUMP -Q --opt --compact -u $MUSER -h $MHOST -p$MPASS $db | bzip2 -cq9 > $FILE
done

i=$(date +"%Hh%Mm%Ss")
### Make md5 Sum ###
$(which md5sum) -b $BACKUP/* >$BACKUP/$SHORTNAME-backup$NOW-$i.md5

### Dump backup using FTP ###
#Start FTP backup using ncftp
#If ncftp not aviable, use ftp:
#ftp -inv $FTPS <$T
echo "Hostname: $(hostname)" >>$T
echo "Backup Set: $BACKUPSET"
echo "Backup failed" >>$T
mail -s "BACKUP FAILED" "$EMAILID" <$T rm -f $T fi

Das Script habe ich hier gefunden.

Auf der selben Seite gibt es einen Generator um das Script mit den eigenen Parametern abzufüllen.
http://bash.cyberciti.biz/backup/wizard-ftp-script.php

Ich habe das Script noch ein wenig aufgebohrt. So habe ich die Möglichkeit geschaffen beim Fehlermail mitzugeben welches Backup den Fehler verursacht hat. Zudem habe ich die Bezeichnung des Backuptages auf die Tagesnummer geändert. Somit ist das Script nicht von der Systemsprache abhängig.
Zu guter letzt, habe ich eine Prüfung eingebaut ob das tar.dat File vorhanden ist. Dieses wird für das incrementelle Backup verwendet. Falls dieses nicht existiert, wird ein Fullbackup gemacht.

Kunden von CeviNet können das Script einfach in Ihrem Webspace als Cronjob einbinden:

Cronjob einrichten

Cronjob einrichten