MEDISTAR-SQL-Backup mit PowerShell erstellen

Der in der MEDISTAR-SQL-Version vorhandene Backup-Dienst automatisiert die Datensicherung, indem er einmal am Tag zu einer bestimmten Uhrzeit Kopien der ISAM-Datenbanken und einen Dump der Oracle-Datenbank erstellt. Die Dateien landen im Unterordner «Sicherung» des MEDISTAR-Verzeichnisses. Wenn man zusätzlich zu anderen Zeiten sichern möchte, kann dies mit folgendem PowerShell-Skript geschehen. Die Befehle für das Erstellen des Dumps der Oracle-Datenbank sind übrigens dem Log-Protokoll des Backup-Dienstes entnommen.

MSBackup.ps1
################################################################################
# Zweck: Exportiert ISAM-Datenbanken und erzeut einen Dump der Oracle-Datenbank.
#        Das Skript imitiert den MEDISTAR-Backup-Dienst. Es bietet als zusätz-
#        liches Feature die Möglichkeit, für jeden Wochentag einen anderen
#        Sicherungsort anzugeben (siehe Variable '$Location').
#        Außerdem können neben den ISAM-Datenbanken auch andere Dateien aus den
#        gleichen Ordnern gesichert werden (siehe Variable '$ExtTypes').
# Autor: Wilhelm Happe, © 2012
################################################################################
 
$PassWord = "XXXXXXXX"
$DumpFile = "ORACLE_EXP.DMP"
$IsamDirs = "HDATEN","INST","MED","PARA","PDATEN","PRAXIS","STAT"
$ExtTypes = "*.isd","*.isk","*.ism","PLPARA.*","oph*.mac"
$Isam_Log = "$Location\ISAM_EXP.log"
$MediStar = "${env:MEDISTARDIR}"
$Location = [string]::Concat($MediStar, "\Sicherung")
#$Location = [string]::Concat("D:\MSBackup", "_", (Get-Date).DayOfWeek)
 
$ErrorActionPreference = "SilentlyContinue"; $Index = 0
$Host.UI.RawUI.WindowTitle = "MEDISTAR-SQL-Export"
 
Function New-Folder {param([string]$Path)
  New-Item -itemtype directory -path "$Path" -force | out-null
  If ($?) {"$Path wurde erstellt."}
  Else {Write-Warning "$Path konnte nicht erstellt werden."; Sleep 3; Exit}}
 
If (Get-Process 'm42t' -ea 0) {
  Write-Warning "Sie müssen alle MEDISTAR-Tasks beenden."; Sleep 3; Exit}
 
Write-Host `nVorhandene Sicherungsdaten werden gelöscht: -fore blue -back white
Remove-Item -Path $Location\$DumpFile -force -ErrorAction 0
ForEach ($Item in $IsamDirs) {Remove-Item -Path $Location\$Item -recurse}
New-Folder -Path $Location
ForEach ($Item in $IsamDirs) {New-Folder -Path $Location\$Item}
 
Set-Content $Isam_Log -value ("Zeit: " + (Get-Date -format D) + ", " + `
  (Get-Date -format T) + "`nUser: " + $env:computername + "\" + `
  $env:username + "`n" + "¯" * 42)
 
# Der nachfolgende Block kopiert keine Dateien aus Unterordnern (s. unten)
If ($IsamDirs.Length -gt 0) {ForEach ($Folder in $IsamDirs) {
  Write-Host `nOrdner mit ISAM-Dateien werden kopiert: -fore blue -back white
  ForEach ($File in GCI "$MediStar\$Folder" -include $ExtTypes -recurse) {
    $FilePath = $MediStar -replace "\\","\\" -replace "\:","\:"
    $Destination = $File -replace $FilePath,$Location
    Copy-Item -path $File -dest $Destination -force -ea 0
    If ($?) {$Index ++; "$Destination"; AC $Isam_Log -value $Destination}
    Else {Write-Warning "$File wurde nicht kopiert"}}}}
Else {Write-Warning "`$IsamDirs enthält keine Elemente."; Sleep 3; Exit}
 
AC $Isam_Log ("_" * 42 + "`nAnzahl kopierter Dateien: " + $Index + "`nZeit: " `
  + (Get-Date -format D) + ", " + (Get-Date -format T))
 
Write-Host `nEs wird ein Export der Datenbank erstellt: -fore blue -back white
$SqlFile = "${env:temp}\Temp.sql"
@"
CREATE or REPLACE DIRECTORY exp_dir AS '$Location';
exit;
"@ | Set-Content $SqlFile  # Standard-Exportpfad neu setzten
sqlplus sys/$PassWord as sysdba '@'$SqlFile
expdp system/$PassWord directory=exp_dir dumpfile=$DumpFile `
  logfile=ORACLE_EXP.log schemas=MSUSER
@"
CREATE or REPLACE DIRECTORY exp_dir AS '$MediStar\Sicherung';
exit;
"@ | Set-Content $SqlFile  # Standard-Exportpfad zurücksetzten
sqlplus sys/$PassWord as sysdba '@'$SqlFile
Remove-Item -Path $SqlFile

Wenn der Wunsch besteht, Patientenbilder mitzusichern hilft der folgende Skriptblock. Enhalten ist die Anweisung, nur Bilder aus den letzten 90 Tagen zu kopieren.

# Der nachfolgende Block ermöglicht das Kopieren von Dateien aus Unterordnern.
# Z.B. werden Patientenbilider aus dem Unterordner PBILDER von PDATEN kopiert.
Write-Host `nEs werden zusätzliche Dateien kopiert: -fore blue -back white
$CopyFrom = @(
  "$MediStar\PDATEN\PBILDER\*.jpg"
	)
ForEach ($Item in $CopyFrom) {
  $Target = Split-Path $Item  # hinten trimmen (z.B.: '\_*.*')
  $Target = $Target.Replace("$MediStar\", "") # vorne trimmen
	If (!(Test-Path "$Location\$Target" -PathType Container))
		{New-Item "$Location\$Target" -Type Directory}
  Foreach ($i in Get-ChildItem $Item) {
    if ($i.LastWriteTime.Date -gt $(Get-Date).AddDays(-90))
      {
      Copy-Item $i.FullName $Location\$Target -ErrorVariable "Err"
	    If ($Err) {"Fehler beim Kopieren von $i.FullName"; Start-Sleep -s 5})
  }
}

Ein Gedanke zu „MEDISTAR-SQL-Backup mit PowerShell erstellen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.