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.
################################################################################ # 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“