MEDISTAR einfach neu installieren und Oracle-DB optimieren

Eine Neuinstallation von MEDISTAR-SQL ist relativ einfach. Bei mir funktionierte folgender Workaround:

  1. MEDISTAR-SQL Neuinstallations-DVD bzw. Programm besorgen und installieren. Dabei wird in der Regel nicht die neueste MEDISTAR-Version installiert, was nicht weiter stört.
  2. Anschließend alle Dateien des bisherigen MEDISTAR-Ordners über die Neuinstallation kopieren mit Ausnahme folgender Ordner und Dateien:
    – D:\MEDISTAR\INST\sql.ini
    – D:\MEDISTAR\oradata
  3. Den Export-Dump der bisherigen Installation in die neue Datenbank importieren.

Der wesentliche Punkt ist, dass es meiner bescheidenen Erfahrung nach nicht erforderlich ist, Quartalsupdates nachzuinstallieren, um die Software auf den neuesten Stand zu bringen. Das geschieht einfach durch das Kopieren der Dateien und den Import des aktuellen Dumps.

Nach gelungener Neuinstallation sollte man aber noch einige Einstellungen ändern bzw. optimieren. Um die erforderlichen Befehle nicht jedes Mal von Hand eingeben zu müssen, habe ich ein PowerShell-Skript erstellt, dass man einmalig nach einer Neuinstallation (oder später) auf dem MEDISTAR-Server ausführen sollte. Es mehrmals auszuführen schadet nicht, verändert dann aber nichts mehr.

Das Skript führt mit Hilfe von SQLPlus folgende Änderungen durch:
Die Datenbank wird in den Archivelog Modus gesetzt, um Online-Backups mit RMAN (Oracle Recovery Manager) zu ermöglichen. Als Ablagebereich wird standardmäßig die Flash Recovery Area, kurz FRA, genutzt. Hierfür wird die Archivierung eingeschaltet.
alter database archivelog;
archive log list;

Initialisierungsparameter im SPFILE werden geändert, um die Anzahl möglicher Verbindungen zu erhöhen. Der Default-Wert für PROCESSES ist 100, der für SESSIONS (1.1 * PROCESSES) + 5 und für TRANSACTIONS (1.1 * SESSIONS).
alter system set processes=930 scope=spfile;
alter system set sessions=1028 scope=spfile;
alter system set transactions=1030 scope=spfile;

Der Wert für die Lebensdauer der Passwörter wird korrigiert. Bei Usern sys, system und msuser darf kein Expiry-Date stehen.
alter profile default limit password_life_time unlimited;

Mit Hilfe der RMAN-Konsole erfolgen folgende Änderungen:
Für einen Full-Restore ist ein Controlfile-Backup notwendig. Deshalb wird der Parameter CONTROLFILE AUTOBACKUP auf “ON” gesetzt:
configure controlfile autobackup on;

Durch den Aufruf des ADR Command Interpreters erfolgen nachfolgende Einstellungen:
Alte Logs und Traces im Automatic Diagnostic Repository (ADR) können nach einer bestimmten Zeit automatisch gelöscht werden. Zuständig hierfür sind zwei Paramter SHORTP_POLICY (default 30 Tage, neu: 1 Woche) und LONGP_POLICY (default ein Jahr, neu: 1 Monat). „Purge“ sorgt bei einer länger bestehenden Installation für das sofortige Löschen älterer Dateien.
set control \(SHORTP_POLICY=168\);
set control \(LONGP_POLICY=720\);

Sie können das Skript hier herunterladen: MSPostInstallOptimization.zip
Wie immer geschieht die Anwendung auf eigene Gefahr. Alle MEDISTAR-Tasks sollten zuvor geschlossen werden.

MEDISTAR-SQL-Server richtig neustarten

Wenn der Computer, auf dem die Oracle-Datenbank läuft, heruntergefahren wird, besteht die Gefahr, dass die Oracle-Datenbank nicht sauber geschlossen werden kann, weil Windows vor dem Herunterfahren geöffneten Programmen nur wenig Zeit zum Schließen gibt.

Am besten wird die Datenbank vor dem Shutdown sauber heruntergefahren – das beschleunigt den späteren  Neustart!

Mit Hilfe eines Powershell-Skripts lässt sich der Vorgang automatisieren.

Screenshot
MSOraStop.ps1
################################################################################
# Zweck: Fährt die Datenbank herunter und beendet MEDISTAR- und Oracle-Dienste.
# Autor: Wilhelm Happe, © 2012
################################################################################
# Starte ggfs. erneut mit Administratorrechten
$id = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$princ = New-Object System.Security.Principal.WindowsPrincipal($id)
if(!$princ.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator))
{$ps = [System.Diagnostics.Process]::GetCurrentProcess()
 $psi = New-Object System.Diagnostics.ProcessStartInfo $ps.Path
 $script = $MyInvocation.MyCommand.Path; $prm = $script
 foreach($a in $args) {$prm += ' ' + $a};
 $psi.Arguments = $prm; $psi.Verb = "runas"
 [System.Diagnostics.Process]::Start($psi) | Out-Null; return;}
 
$ErrorActionPreference = "SilentlyContinue" # gilt für alle folgenden Befehle
 
If (Get-Process 'oracle' -ea 0) {
	$Password = "XXXXXXXX"  # PASSWORT BITTE ANPASSEN
	$SqlFile = "${env:temp}\Temp.sql" # Datei für SQL-Anweisungen
	"shutdown normal;", "exit;" -join "`n" | Set-Content $SqlFile
	sqlplus sys/$Password as sysdba '@'$SqlFile
	Remove-Item -Path $SqlFile} # Datei löschen
Else {Write-Warning "Es ist keine Oracle-Instanz verfügbar!"}
 
Function Dienst-Stoppen {param([string]$sName)
	$s = Get-Service -display $sName -ea SilentlyContinue
	If (!$s) {Write-Warning "$sName ist nicht installiert."}
	Else {Stop-Service -inputobject $s -passthru -ea 0
		If (!$?) {Write-Host "$sName wurde nicht beendet!"}}}
 
Write-Host "`nDie MEDISTAR-Dienste werden beendet.`n"
Stop-Process -processname dscm
Dienst-Stoppen -sName "MEDISTAR ISAM"
Dienst-Stoppen -sName "MEDISTAR RPCI"
Dienst-Stoppen -sName OracleOraDb11g_home1TNSListener
Dienst-Stoppen -sName OracleServiceMEDISTAR
Dienst-Stoppen -sName OracleDBConsolemedistar
Dienst-Stoppen -sName OracleMTSRecoveryService
 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$objForm = New-Object System.Windows.Forms.Form
$objForm.Text = "Fertig!"
$objForm.AutoSize = $True
$objForm.AutoSizeMode = "GrowAndShrink"
$objForm.StartPosition = "CenterScreen"
$objForm.FormBorderStyle = "FixedToolWindow"
$objForm.KeyPreview = $True
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter")
    {$script:x = $objListBox.SelectedItem;$objForm.Close()}})
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape")
    {$objForm.Close()}})
$objForm.Controls.Add($objLabel)
$objListBox = New-Object System.Windows.Forms.ListBox
$objListBox.AutoSize = $True
$objListBox.Add_MouseDoubleClick({$script:x = $objListBox.SelectedItem;$objForm.Close()})
$lbItem = @(
	($myInvocation.MyCommand.Name + " beenden"),
	"Computer neustarten",
	"Computer herunterfahren")
For($i=0; $i -lt $lbItem.Count; $i++) {[void] $objListBox.Items.Add($lbItem[$i])}
$objListBox.SelectedIndex = 0
$objListBox.Height = $objListBox.PreferredHeight
$objForm.Controls.Add($objListBox)
$objForm.Topmost = $True
$objForm.Add_Shown({$objForm.Activate()})
[void] $objForm.ShowDialog()
[Environment]::NewLine; Write-Host $x
Switch ($x) {
	$lbItem[1] {Restart-Computer}
	$lbItem[2] {Stop-Computer}
	default    {Exit}}

Klicken Sie hier, um das Skript herunter zu laden.

MEDISTAR-SQL-Datensicherung automatisieren

Unter MEDISTAR-SQL gibt es einen Backup-Dienst, der automatisch eine Siche­rung der Datenbank erstellt und im Ordner …\MEDISTAR\Sicherung ablegt. Damit liegt aber keineswegs eine ausreichende Datensicherung vor. Schließlich befinden sich die Backupdateien noch auf der Festplatte, auf der MEDISTAR und Oracle-Datenbank installiert sind. Bei einem Crash wären Original und Backup futsch.

Man ist also selbst dafür verantwortlich, dass diese Dateien auf einem anderen Medium gesichert werden. Das lässt sich mit Windows-Bordmitteln ein­rich­ten. Hierzu lassen wir z.B. auf einem Arbeitsplatz-PC eine Batch-Datei laufen, die an jedem Wochentag einen anderen Ordner für die Sicherung verwendet.

MSBackup.cmd
@echo off
set Heading=MEDISTAR-Backup-Sicherung
title=%Heading%
 

:: Pfade bitte individuell anpassen!
set MSPath=\\Server\d%%\MEDISTAR
set BackupDrive=E:

:: Wochentag ermitteln. Geht nicht mit CMD-Befehlen, daher VBS.
echo Wscript.Echo WeekdayName(Weekday(now,0),false,0) > %~n0.vbs
FOR /F "usebackq" %%a IN (`cscript.exe %~n0.vbs //nologo`) DO set weekday=%%a
del %~n0.vbs

:: LogDatei nicht in BackupFolder speichern; ROBOCOPY würde sie löschen!
set BackupFolder=%BackupDrive%\%~n0%weekday%
set TmpFile=%BackupDrive%\%~n0%weekday%.tmp
set LogFile=%BackupDrive%\%~n0%weekday%.log
set Options=/MIR /R:1 /W:1 /NC /NDL /NP /NS /TEE /FFT /Log+:%TmpFile%

:: MEDISTAR-Backup um Makrodateien und Patientenlisten ergänzen.
xcopy /d /h /i /f /k %MSPath%\INST\*.mac    %MSPath%\Sicherung\INST\*.*
xcopy /d /i /y /f /k %MSPath%\PARA\PLPARA.* %MSPath%\Sicherung\PARA\*.*

:: LogDatei anlegen, ggfs. überschreiben. Synchronisieren mit ROBOCOPY.
echo %Heading% am %weekday%, den %date% um %time:~0,8% Uhr. > "%TmpFile%"
robocopy %MSPath%\Sicherung %BackupFolder% %Options%

:: ASCII (TmpFile) nach Unicode (LogFile) umwandeln. TmpFile entsorgen.
cmd /u /c type %TmpFile% > %LogFile%
del %TmpFile%

:: LogDatei anzeigen und Batchdatei beenden ohne zu warten.
start %LogFile%

Wenn die Batchdatei richtig eingerichtet ist, wollen wir das DOS-Fenster nicht mehr sehen – wir bekommen ja nach erfolgter Datensicherung die Logdatei angezeigt. Aus diesem Grund starten wir die Batchdatei ohne sichtbares Fenster mit einem kleinen VB-Skript.

MSBStart.vbs
‚ Dieses VisualBasic-Skript startet MSBackup ohne sichtbares Fenster.
‚ Bitte beachten Sie, dass das Skript nicht MSBackup.vbs heißen darf,
‚ weil MSBackup.vbs von der Batchdatei gleichen Namens gelöscht wird!
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "MSBackup.cmd", 0, False
WshShell.Popup "MSBackup wird ausgeführt. Bitte warten...", 3, "Info"

Der dritte Schritt besteht darin, dass die Datensicherung täglich 10 oder 15 Minuten nach der Backup-Erstellung durch den MEDISTAR-Backup-Dienst mit Hilfe der Windows-Aufgabenplanung automatisch startet. Damit das VB-Skript die Batchdatei findet, muss unter «Starten in (optional)» der Pfad angegeben werden. Administratorrechte («mit höchsten Privilegien») sind erforderlich.

Weitere Informationen zu robocopy finden Sie hier.

MEDISTAR- und Oracle-Dienste auf dem Heimrechner

Man kann ja darüber diskutieren, ob die Oracle-Datenbank für eine Kleinpraxis überdimensioniert ist. Unvernünftig wäre es auf jeden Fall auf einem Heimrechner, der in der Hauptsache für andere Dinge benutzt wird, die MEDISTAR- und Oracle-Dienste ständig laufen zu lassen.

Ich habe daher den Starttyp der Dienste von „Automatisch“ auf „Manuell“ geändert. Wenn ich MEDISTAR benutzen möchte, starte ich die Dienste durch den Aufruf eines Powershell-Skriptes.

Gegenüber einer normalen Batchdatei hat Powershell Vorteile: Erstens kann sich das Skript selbst Administratorrechte anfordern und zweitens informiert das Skript darüber, wann die Dienste laufen.
Wenn Sie auf Ihrem Rechner Powershell zum ersten mal benutzen, können Sie keine Skripte ausführen. Sie müssen zuvor die Ausführungsrichtlinien ändern.

OraStart.ps1
# Starte Skript mit Administratorrechten, falls ohne diese Rechte gestartet wurde.
$identity = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$princ = New-Object System.Security.Principal.WindowsPrincipal($identity)
if(!$princ.IsInRole( `
[System.Security.Principal.WindowsBuiltInRole]::Administrator))
{
$powershell = [System.Diagnostics.Process]::GetCurrentProcess()
$psi = New-Object System.Diagnostics.ProcessStartInfo $powerShell.Path
$script = $MyInvocation.MyCommand.Path
$prm = $script
foreach($a in $args) {
$prm += ‚ ‚ + $a
}
$psi.Arguments = $prm
$psi.Verb = „runas“
[System.Diagnostics.Process]::Start($psi) | Out-Null
return;
}

# Starte Dienste, deren Starttyp von ‚Automatisch‘ auf ‚Manuell‘ geändert wurde.
Start-Service „MEDISTAR ISAM“
Start-Service „MEDISTAR RPCI“
Start-Service OracleMTSRecoveryService
Start-Service OracleOraDb11g_home1TNSListener
Start-Service OracleServiceMEDISTAR
Start-Service OracleDBConsolemedistar

# Starte, wenn gewünscht, einen MEDISTAR-Task, nachdem die Dienste gestarte wurden.
$title = „MEDISTAR-SQL-Starter“
$message = „MEDISTAR kann nun gestartet werden!`nSoll dies jetzt geschehen (Task-0)?“
$yes = New-Object System.Management.Automation.Host.ChoiceDescription „&Ja, Task-0 öffnen“, `
„Der MEDISTAR-Task wird gestartet.“
$no = New-Object System.Management.Automation.Host.ChoiceDescription „&Nein, nur beenden.“, `
„Powershell-Skript wird beendet.“
$options = [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no)
$result = $host.ui.PromptForChoice($title, $message, $options, 0)
switch ($result) {
0 {D:\MEDISTAR\prg4\m42t.exe desk-0 -style medistar}
1 {„Sie haben Nein gewählt.“}
}

Das Skript kann in abgewandelter Form auch die Dienste beenden. Es muss nur „Start-Service“ durch „Stop-Service“ ersetzt werden und Part 3 gelöscht werden.

MEDISTAR-SQL und Oracle-Datenbank – erste Erfahrungen

Seit einer Woche läuft in meiner Praxis die neue MEDISTAR-Version. Die Installation gelang im zweiten Versuch. Anschließend befanden sich 5,9 GB mehr Daten auf der Festplatte. OK, ein gewisser Anteil besteht aus Sicherungskopien, die später gelöscht werden können.

Was hat sich geändert?
Nach dem Hochfahren des Rechners bzw. Servers dauert es mehrere Minuten, bis die neuen Dienste gestartet sind. Erst wenn diese Dienste laufen, kann MEDISTAR gestartet werden.

Die auffälligste Änderung besteht darin, dass eine MD-Zeile nun über 1000 Zeichen erfassen kann. Die Position des Umbruchs („weicher Umbruch“) kann über einen Schieberegler eingestellt werden. Dieses an und für sich positive Feature ist aber noch nicht konsequent umgesetzt worden: bei der Übernahme der Zeilen in die Brieftextverarbeitung werden sie zerstückelt, d.h. es werden Semikolons eingefügt. Bei K- und Y-Zeilen erfolgt kein weicher Umbruch. Was zunächst nach Bug aussieht, geschieht aus Rücksicht auf alte Formularprogramme.

Besonders positiv fällt auf, dass Patientenlisten nun viel schneller erstellt werden. Ich vermute, dass dies auch für die Patientenmarker-Funktion zutrifft.

Die befürchtete Verlangsamung auf den Arbeitsplatzrechnern ist nicht eingetreten. Der älteste Rechner in meiner Praxis ist 10 Jahre alt (Pentium 1 GHz, 256 MB Arbeitsspeicher). Obwohl der Hardware-Check zur Entsorgung rät, lässt sich weiterhin mit ihm arbeiten, selbstverständlich unter der Voraussetzung, dass der Hauptrechner/Server schnell genug arbeitet.

Wenn ein Patient in einer Patientenliste angeklickt wird, ist es nicht mehr möglich direkt in den MDs zu landen.

Für die Datensicherung wurde in MEDISTAR eine neue Funktion eingebaut. Der „MEDISTAR Backup Dienst“ arbeitet im Hintergrund und sichert z.B. nachts die Einträge der Oracle-Datenbank und die ISAM-Datenbanken. Die Sicherungsdateien werden im Ordner D:\MEDISTAR\Sicherung abgelegt.
Die Datensicherung ist durch das nebeneinander von Oracle-Datenbank und ISAM-Datenbanken komplizierter geworden. Der nützliche Backup-Dienst sieht derzeit nur eine Sicherung pro Tag vor. Der Vorteil des Online-Backups (Datensicherung im laufenden Betrieb) existiert derzeit nicht, da sich Oracle- und ISAM-Sicherung auf dem gleichen Stand befinden müssen. Für Großpraxen spielt das wahrscheinlich eine untergeordnete Rolle, da dort die Ausfallsicherung über RAID-Systeme erfolgt.

PS: Bitte beachten Sie, dass sich dieser Bericht auf den Stand vom August 2010 bezieht. Sowohl die Installationsroutine wie auch das Programm selbst werden ständig weiterentwickelt.