OPHTHALMOSTAR Web Log

29. Oktober 2011

MEDISTAR-SQL-Backup einlesen bzw. importieren

Vor gut einem Jahr habe ich bereits an dieser Stelle eine Batchdatei publiziert, die den Import der MEDISTAR-SQL-Sicherung automatisiert. Den gleichen Job erledigt das nachfolgende Powershell-Skript noch ein bisschen komfortabler.
Das Skript importiert den Datenbank-Dump (ORACLE_EXP.DMP) und kopiert die ISAM-Datenbankdateien in die entsprechenden Ordner.
Die Angaben in den ersten beiden Zeilen müssen individuell angepasst werden.

MSImport.ps1
# Zweck:  Importiert ISAM-Datenbanken und Oracle-Dump in eine bestehende
#         MEDISTAR-Installation. Vorhandene Daten werden überschrieben.
 
$DumpFolder = "T:\Sicherung"
$Password = "XXXXXXXX"
$DumpFile = "ORACLE_EXP.DMP"
$MediStar = "${env:MEDISTARDIR}"
 
$ErrorActionPreference = "SilentlyContinue"
$Host.UI.RawUI.WindowTitle = "Wiederherstellung der MEDISTAR-SQL-Sicherung"
 
Function Script-Exit {param([string]$Msg, $Sec) "`n";
  For ($Sec; $Sec -ge 0; $Sec --)
    {Write-Host "`r$Msg Skript wird beendet ($Sec)" -NoNewline;
    Start-Sleep 1}; Exit}
 
If (!(Test-Path -path $DumpFolder\$DumpFile)) {
  # 16 = Desktop, 17 = Computer, 18 = Netz
  $DumpFolder = 17; $Description = "Bitte wählen Sie den Ordner aus,`n" + `
  "der die Datei $DumpFile enthält."}
Else {$Description = "$DumpFile befindet sich im Ordner $DumpFolder.`n" + `
  "Sie können den Import starten. Klicken Sie auf OK."}
$Object = New-Object -comObject Shell.Application
$Folder = $Object.BrowseForFolder(0, $Description, "&H200", $DumpFolder)
If ($Folder -eq $null) {Script-Exit -Msg "Abbruch durch Benutzter." -Sec 3}
Else {$DumpFolder = $Folder.Self.Path; Write-Host "DumpFolder: $DumpFolder"}
If (!(Test-Path -path $DumpFolder\$DumpFile))
  {Script-Exit -Msg "$DumpFile nicht gefunden!" -Sec 3}
Else {Write-Host "$DumpFile gefunden."}
 
$Message = "Beim Restore werden die vorhandenen Daten gelöscht!"
$Object = New-Object -comObject wscript.shell
$Result = $Object.Popup($Message, 0, $myInvocation.MyCommand.Name, 1)
If ($Result -eq 2) {Script-Exit -Msg "Abbruch durch Benutzter." -Sec 3}
 
$CopyFrom = Get-Childitem $DumpFolder | where {$_.psIsContainer -eq $true}
ForEach ($Item in $CopyFrom) {
  $Item = -join ($DumpFolder, "\", $Item, "\*.*")
  $Folder = Split-Path (Split-Path $Item) -leaf
  If (Test-Path "$MediStar\$Folder") {
    Copy-Item -path $Item -dest $MediStar\$Folder -force -passthru}}
 
$SqlFile = "${env:temp}\Temp.sql"
@"
drop user msuser cascade;
commit;
CREATE or REPLACE DIRECTORY imp_dir AS '$DumpFolder';
exit;
"@ | Set-Content $SqlFile
sqlplus sys/$Password as sysdba '@'$SqlFile
 
impdp system/$Password directory=imp_dir dumpfile=$DumpFile full=yes `
logfile=imp_medistar.log
 
"shutdown immediate;", "startup;", "exit;" -join "`n" | Set-Content $SqlFile
sqlplus sys/$Password as sysdba '@'$SqlFile
 
Remove-Item -Path $SqlFile
Write-Host "Fertig. $DumpFolder\imp_medistar.log wird gestartet."
Invoke-Expression $DumpFolder\imp_medistar.log

Sie können die Datei auch herunterladen.