===== Automatisches Server-Backup =====
==== Anforderung ====
Wird (p2f) in geschäftskritischen Abläufen eingesetzt, ist es unumgänglich, Sicherungskopien vom aktuellen Stand der (p2f)-Installation zu erstellen.
Da bei der Konzeption von (p2f) dafür gesorgt wurde, dass alle Daten auf dem (p2f)-Server abgelegt werden, ist es ausreichend, wenn das p2fRoot-Verzeichnis des Servers gesichert wird.
Dieses Verzeichnis ist im laufenden Betrieb nicht sicher zu kopieren, weil von verschiedenen Komponenten des (p2f)-Systems jederzeit schreibend auf den Server zugegriffen werden kann. Es ist also notwendig, den Server-Dienst anzuhalten, bevor die Kopie des p2fRoot-Verzeichnisses erstellt wird, um Abbrüche des Kopiervorgangs oder inkonsistente Kopien zu vermeiden.
\\
\\
==== Realisierung ====
Um das Anlegen einer Sicherungskopie zu vereinfachen, gibt es im Kontrollfeld des (p2f)-Servers einen Reiter, der die Konfiguration einer automatischen Sicherung erlaubt.
Da der Server die Sicherung selbst anstösst, kann er dafuer sorgen, dass für die Dauer der Sicherung ein **konsistenter Stand** des p2fRoot-Verzeichnisses vorgefunden wird. Erreicht wird dies, indem schreibende Anfragen während der Sicherung verzögert werden. Die Sicherung erfolgt daher praktisch ohne Betriebsunterbrechung, muss also nicht mit irgendeinem Wartungsfenster synchronisiert werden.
\\
\\
{{print2forms:tips:0067-1.PNG }}
Im Eingabefeld //Sicherungsverzeichnis// kann über einen Klick auf die Schaltfläche //Auswahl...// ein Verzeichnis selektiert werden, in das die Sicherungskopien des Servers abgelegt werden sollen.
Im Eingabefeld //Kommandozeile// wird das für die Durchführung der Sicherung Kommando angegeben - beispielsweise //"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -F "C:\Users\Public\Documents\SPE Systemhaus GmbH\print2forms\p2fScript\Backup.ps1"//, wobei die Pfade gegebenenfalls an die jeweilige Installation anzupassen sind.
Der Zeitpunkt der Sicherung wird durch die Angaben im unteren Teil des Konfigurationsdialogs festgelegt. In der Abbildung wird jeden Sonntag um 02:00 Uhr (**Lokalzeit** des Rechners, auf dem der Server ausgeführt wird) die Kommandozeile ausgeführt.
\\
Der Server kopiert so schnell wie möglich zunächst das gesamte p2fRoot-Verzeichnis in das im Konfigurationsdialog angegebene Backup-Verzeichnis, damit Verzögerungen im Ablauf auf ein Minimum reduziert werden. Anschliessend wird ein von Anwender vorzugebendes Kommando ausgeführt.
Nachfolgend ist beispielhaft ein PowerShell-Skript //Backup.ps1// abgebildet, das lediglich das gesicherte p2fRoot-Verzeichnis in ein Zip-Archiv packt.
Im ersten Teil des Skriptes ist zu sehen, welche Parameter vom (p2f)-Server an das Skript übergeben werden.
\\
\\
<#
.SYNOPSIS
Used in automatic p2fServer backup processing
#>
param(
## Kind of call: OK, ERROR
[Parameter(Mandatory = $true, Position = 0)]
[string]$Kind,
## Last p2fRoot change time: 2016-08-10 12:43:17
[Parameter(Mandatory = $true, Position = 1)]
[string]$LastChange,
## Last backup time: 2016-08-10 12:43:17
[Parameter(Mandatory = $true, Position = 2)]
[string]$LastBackup,
## Path to backup folder: "C:\tmp\p2f\Backup\p2fRoot-16-08-24T14-41"
[Parameter(Position = 3)]
[string]$BackupPath
)
Set-StrictMode -Version 3
Write-EventLog -LogName Application -Source p2fServer -Category 0 -EntryType Information -EventId 5000 -Message "Backup script called"
# V5 Compress-Archive -Path C:\Stuff -DestinationPath archive.zip
function ZipFiles($zipfilename, $sourcedir )
{
Add-Type -Assembly System.IO.Compression.FileSystem
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
[System.IO.Compression.ZipFile]::CreateFromDirectory($sourcedir,
$zipfilename, $compressionLevel, $false)
}
# continue on ok only
If ($Kind -ne "OK")
{
exit 1
}
$ZipFileName = $BackupPath + ".zip"
if ((Test-Path -Path $ZipFileName -PathType Leaf))
{
Write-EventLog -LogName Application -Source p2fServer -Category 0 -EntryType error -EventId 5000 -Message "Zip file already exist"
exit 2
}
$p2fError = $false
If (Test-Path -Path $BackupPath)
{
Try
{
ZipFiles -zipfilename $ZipFileName -sourcedir $BackupPath
}
Catch
{
Write-EventLog -LogName Application -Source p2fServer -Category 0 -EntryType error -EventId 5000 -Message "Error on zip backup folder"
$p2fError = $true
}
}
# remove backup folder
If (! $p2fError)
{
Try
{
Remove-Item -Recurse -ErrorAction stop $BackupPath
}
Catch
{
Write-EventLog -LogName Application -Source p2fServer -Category 0 -EntryType error -EventId 5000 -Message "Error on removing " + $BackupPath
}
}
exit 0
\\
\\
==== Hinweise ====
* Das vorgestellte Skript setzt die Verfügbarkeit von PowerShell in der Version 3 voraus.
* Mit Hilfe der vom (p2f)-Server beim Aufruf des Kommandos mit übergebenen Zeiten, kann gegebenenfalls ermittelt werden, ob eine Sicherung überhaupt notwendig ist.