Wie sichere ich Exchange Server 2003 mit Boardmitteln?

Aufgrund der Anfragen in meinem letzten Webcast stelle ich an dieser Stelle einmal meine eigene Sicherungsmethode vor. Ich betreibe eine kleine Testumgebung mit einem Small Business Server 2003. Den darin enthaltenen Exchange Server sowie das gesamte System sichere ich mittels NTBackup und einem kleinen Skript.

Ein guter Einstiegspunkt für alle, die NTBackup automatisieren möchten, ist die FAQ-Seite von Thomas Krug. Der FAQ-Artikel NTBackup unter Win200x - Bandsicherung per Skript war die Grundlagen, auf der ich mein eigenes Skript entwickelt habe. Meine Erfahrungen habe ich an Thomas weitergegeben, der diese in sein eigenes Skript entsprechend hat einfliessen lassen.

NTBackup ab Windows 200x kann nicht mehr so einfach wie unter Windows NT 4.0 angesteuert werden. Dafür bietet es aber um so mächtigere Optionen. Die integrierte Medienverwaltung sorgt für entsprechendes Bandmanagement - was natürlich beim Zugriff von der Kommandozeile aus beachtet werden muss. Ich meinem Beispiel benutze ich täglich ein neues Band, welches unabhängig von seinem Inhalt überschrieben werden soll. Natürlich lässt sich diese Vorgehensweise noch weiter verfeinern, wenn man verhindern möchte, dass die Datensicherung zum Beispiel vom Vortag überschrieben wird.

Kleiner Tipp vorneweg für alle, die sich mit cmd-Dateien nicht so gut auskennen: Zu beachten ist, dass bei Windows an der Kommandozeile Variablen mit einem Prozentzeichen angegeben werden (%COMPUTERNAME%), innerhalb einses Batches jedoch zwei Prozentzeichen verwendet werden müssen (%%COMPUTERNAME%%).

Nun aber genug der Vorrede, fangen wir jetzt mit der Vorbereitung an:

@echo off
rem Backup-Skript mit NTBACKUP
SET BACKUP=E:\Backup
cd /d %BACKUP%

Am Anfang des Batches schalte ich das Echo ab, damit die Ausgabe des Batches leichter zu lesen ist. Weiterhin gehört zu jedem Skript noch ein Kommentar, was dieses tut (o.k., der fällt wirklich kurz aus bei mir). Schliesslich setze ich eine Variable zum Backupordner, damit ich das Skript leicht an andere Umgebungen anpassen kann. Die Verwendung von Variablen sei jedem an dieser Stelle an das Herz gelegt - es ermöglicht die einfache Portabilität des Skriptes. Innerhalb des Backup-Ordners liegen bei mir das Skript selbst, die Backupset-Dateien und jeweils benötigte Tools wie unxdate.exe - dazu aber später mehr.

Als nächsten Schritt starte ich einmal die Medienverwaltung und lasse einen Refresh durchführen:

rem Medienverwaltung zurücksetzen
start /wait  rsm.exe refresh /LF"HP C1537A SCSI Sequential Device"

Dadurch stelle ich sicher, dass das System das aktuell eingelegte Band erkennt und entsprechend einliest. Die Aufrufart über start /wait sorgt dafür, dass der gesamte Batch erst weitergeführt wird, wenn die Medienverwaltung vollständig abgeschlossen wurde. Ohne diesen Aufruf würde die Medienverwaltung parallel zum Skript laufen und das Skript oft fehlschlagen. Als Bandlaufwerksnamen habe ich mein DDS-Laufwerk eingetragen, welchen man aus dem Gerätemanager ermitteln oder per Kommandozeile mittels rsm view /tlibrary auslesen kann.

Für alle, die bei dem Begriff DDS stöhnen: Hey, ich brauche die Sicherung nicht wirklich! Das ist ein Testsystem. Das Tape dient mir nur als technische Hilfe, um Tests grundlegend durchführen zu können. Für den Liveeinsatz empfehle ich ganz klar keine DDS-Laufwerke - hier sind Techniken wie DLT oder LTO um Längen stabiler und zuverlässiger im Betrieb. Die Sicherheit der eigenen Daten sollte jedem Administrator diesen Aufpreis wert sein. Die Hintergründe habe ich in einem Newsgroup-Thread im Herbst 2004 einmal erläutert.

Wenden wir uns nun den spannenderen Teilen zu. Thomas generiert einen Bandnamen aus der Datumsausgabe des Windows-Datumbefehls und nutzt auf meinen Tip hin im Skript zur Unterstützung von englischen und deutschen Servern als Trennzeichen den Slash und den Punkt:

rem Bandname generieren
for /f "Tokens=1-4 Delims=/. " %%i in ('date /t') do  set dt=%%k-%%j-%%i
for /f "Tokens=1" %%i in ('time /t') do set tm=%%i
set tm=%tm::=-%
set dtt=%dt%::%tm%

Ich selbst benutze primär den Wochentag als Bandnamen, so dass ich auch Sicherungen auf Festplattenordner mittels Backup2Disk durchführen kann. Dabei werden dann sieben Backupdateien erzeugt, die wochenweise überschrieben werden. Somit habe ich einen kleinen Rotationszyklus implementiert.

Leider gibt unter Windows 2003 der Datumsbefehl nicht den Wochentag aus, wenn der Server unter Regions- und Sprachoptionen Deutsch (Deutschland) eingestellt hat. Da ich auf Servern grundsätzlich die englische Version bevorzuge, habe ich an dieser Stelle kein Problem. Das Datumskommando liefert dort die Kurzform des Tages mit. Der heutige Tag sieht dann folgendermassen aus: 'Fr 03/04/2005'.

Wie kann man aber nun dieses Problem auf deutschen Servern umgehen?

Eine Lösung wäre, die Default-Sprache des Servers für den nicht angemeldeten Zustand auf Englisch zu stellen. Um das zu erreichen, muss der Registry-Key HKEY_Users\.DEFAULT\Control Panel\International\Locale abgeändert werden. Mehr dazu im Knowledge Base Artikel VBScript Date and Time Functions May not be Formatted Properly in Non-English (US) Locales. Ein einfacher Weg für die Registryänderung ist, die regionalen Einstellungen des angemeldeten Users auf den gewünschten Wert zu stellen, den gesamten Subtree HKEY_CurrentUser\Control Panel\International\ zu exportieren, mit Notepad die Pfade anzupassen, so dass er als HKEY_Users\.DEFAULT\Control Panel\International\ wieder importierbar ist. Dadurch würde das Backup-Skript über Geplante Tasks gestartet sauber funktionieren, da es dann einen englischen Sprachraum vorfindet. Der Administrator selbst kann in seinem Profil Deutsch auswählen, so dass er im laufenden Betrieb keine Probleme hat.

Ein zweiter Weg wäre, auf einen anderen Datums-Befehl auszuweichen. In den GNU Utilities für Win32 gibt es eine date.exe, die ich als unxdate.exe einsetze und im Backup-Ordner mit abspeicher. Damit kann ich den Bandnamen deutlich einfacher und flexibler generieren. Der Aufruf for /f "Tokens=1" %%i in ('unxdate.exe +%%a') do set dtt=%%i im Batch sorgt dafür, dass als Variable die englische Kurzform des Tages genutzt werden kann. Ein kleiner Exkurs sei an dieser Stelle gestattet: Mit diesem Datumskommando lassen sich auch Dinge wie der Name des letzten Monats über 'unxdate.exe --date="1 month ago" +%m' sehr einfach auslesen. Es wird dabei auch der Jahreswechsel beachtet - somit kann man sehr einfach Logfile-Bearbeitungen automatisiert vornehmen, wenn man zum Beispiel am 01.01. das Logfile vom Vormonat komprimieren oder auswerten will.

Weiteren Verfeinerungen und Optimierungen steht hier natürlich nichts im Wege. Ich habe auch schon in grösseren Umgebungen den Servernamen über %COMPUTERNAME% mit einfliessen lassen und damit Backup2Disk-Ordner realisiert. Dabei stellte ein Datenserver sogenannten Nearline-Speicher in Form von einem günstigen SATA-RAID0 zur Verfügung, auf den alle Server ihre Onlinesicherung via NTBackup zentral ablegen und im Wochenrhythmus die Backup2Disk-Ordner rotieren. Die Bandsicherung sichert dann tagsüber lokal den Nearline-Speicher auf Tapewechsler, so dass die Bänder entsprechend auch ausgelagert werden konnten. Für Rücksicherungszwecke sind die letzten sieben Tage immer auf schnellem Speicher vorhanden, so dass auch die Restore-Zeiten drastisch kürzer als bei Bandlaufwerken oder -robotern ausfallen. Möglich sind aber auch Dinge wie Vollsicherung Nachst und Teilsicherung von Exchange stündlich über den Tag, so dass im absoluten Disaster-Fall lediglich die letzte Stunde beim gleichzeitigen Verlust von Transaktionslogdateien und Server-Datenbanken verloren geht. Der eigenen Experimentierfreudigkeit steht hier nichts im Wege.

Nun aber zurück zu unserem Backup-Skript:

rem Backup starten... Aufruf in einer Zeile!
ntbackup.exe backup "@%BACKUP%\auswahl.bks" /n "Band %dtt%" /d "Band %dtt%" /v:no /r:no /rs:yes /hc:on /m normal /j "Band %dtt%" /l:s /p "4mm DDS" /UM

Zur Durchführung des Backups selbst wird eine Backupset-Datei benötigt. Diese muss mit NTBackup erzeugt werden und liegt bei mir im gleichen Verzeichnis wie das Backup-Skript. Manuell sollte die Datei nicht geändert werden. Sie sieht zwar aus, wie eine Textdatei - Textänderungen via Notepad funktionieren aber nicht. Daher einfach NTBackup verwenden und den Backupsatz entsprechend speichern. An dieser Stelle kann man jetzt NTBackup mehrfach mit unterschiedlichen Bacckup-Sets ausführen lassen, um zum Beispiel das Filesystem, den System State und die Exchange Datenbanken separat zu sichern. Wie im Webcast schon erläutert muss die Exchange-Sicherung separat erfolgen und nicht zusammen mit dem System State durchgeführt werden. Die genauen Hintergründe sind im Knowledge Base Artikel Der Sicherungsvorgang schlägt fehl, wenn Sie Exchange Server 2003-Datenbanken und Systemstatusinformationen gleichzeitig sichern zu finden.

Mit NTBackup lassen sich auch über das Netz mehrere Exchange-Server von einer Stelle aus sichern. Wer Microsofts SQL Server 2000 hat, kann mit NTBackup auch die SQL-Datenbanken online sichern. An dieser Stelle können kreative Köpfe jede Menge Optimierungspotenzial realisieren.

Zum Abschluss der Sicherung kann dann noch bei Bedarf das Band aus dem Laufwerk ausgeworfen werden:

rem Band auswerfen
rsm.exe eject /PF"Band %dtt% - 1" /astart

Damit habe ich eine einfache Möglichkeit, die Datensicherung mit Boardmitteln zu realisieren. Über Backup2Disk kann ich diese Sicherung auch auf mehreren Servern durchführen. Dazu muss ich nur den Ordner %BACKUP% auf den neuen Server kopieren und eventuell mittels NTBackup einmal die Backupset-Datei den lokalen Gegebenheiten anpassen. Den geplanten Task, der die Datensicherung ausführt, habe ich auch in dem Ordner liegen. Er lässt sich per drag&drop einfach aktivieren.

Soviel zu einem Einblick in meine eigene Sicherungsstrategie - ich freue mich über Feedback von allen, die diese Strategie selbst implementieren und eventuell intelligent erweitern.