Citrix Virtual Apps & Desktops – SQL Datenbank Migration

Veröffentlicht von

Last Updated on 12. Juni 2020 by Sebastian

In diesem Blogbeitrag möchte ich euch über die Möglichkeit berichten die 3 Citrix SQL Datenbanken ( Site, Monitoring, Logging ) auf einen andren SQL Server zu Migrieren. Ich schreiben diesen Blog Beitrag, da ich komischerweise im Internet keine für mich passenden Anleitung gefunden habe. Ich war dadurch gezwungen mir die Infos von mehreren Seiten zusammenzutragen. Eigentlich ist das Migrieren der Datenbanken kein Hexenwerk aber trotzdem sollte man für einen optimalen Ablauf ein paar Dinge beachten.

1. ) Datenbank sichern
Im ersten Schritt sollte wir die Datenbanken auf dem jetzigen SQL Server sichern. Sollten wir nicht wissen auf welchen Server sich die Datenbanken aktuell befinden können wir mit PowerShell befehen dies entsprechend feststellen.

asnp citrix* <- Die Citrix PowerShell Module
Get-BrokerDBConnection <- Zeigt die Site Database Verbindung an
Get-LogDBConnection <- Zeigt die Configuration Logging Database Verbindung an
Get-MonitorDBConnection <- Zeigt die Monitor Database Verbindung an
In unseren Beispiel lautet der Server DEHWT-DC04 und Datenbank haben als Präfix CitrixDEDHN

Um nun auch mit der Sicherung zu beginen sollten wir zuvor dafür sorgen das der Delivery Controller(Global für die Site) keine weitere Daten in die Monitoring und Logging Datenbank schreibt.

Set-MonitorConfiguration -DataCollectionEnabled $false <- Deaktiviert das Monitoring

Set-LogSite -State Disabled <- Deaktiviert das Logging 
Die beiden Befehle geben keine Rückmeldung bei erfolgter Ausführung.

Entweder verbinden wir uns jetzt Remote oder direkt auf dem SQL Server via SQL Management Studio zur entsprechenden Instanz des SQL Servers.

Nachdem Login auf der SQL Server Instantz

Durch ein Rechtsklick auf die jeweilige Datenbank öffnet sich ein Kontextmenü. Unter Tasks befindet sich der Punkt Back Up

Im nächsten Dialog müssen wir das Backupziel auswählen. In diesem Fall habe ich den Ordner Temp gewählt. Zusätzlich kann man ein Namen für die Backupdatei wählen. Bitte darauf achten wenn ihr keinen Dateisuffix angibt wird die Datei ohne Endung gespeichert. 🙂 Wir wiederholen dann diesen Schritt für alle 3 Datenbanken.

Es gibt hier auch je nach SQL Version die Möglichkeit ein Backup auf ein Bandlaufwerk vorzunehmen.

Nun wechseln wir auf den neuen SQL Server wo wir die 3 Datenbanken einspielen wollen. In unserem Beispiel heist der neue Server ADM01. Nachdem wir auch hier via Mangement Studio verbunden sind klicken wir mit der Rechten Maustaste auf den Punkt Database und wählen dort im Kontextmenü den Punkt Restore Database

Hier könnt ihr dann unter Device eure Datenbank lokal oder auf einem Netlaufwerk suchen. Achtung ihr könnt zwar eine Mehrfachselektion( Mehrere Dateien gleichzeitig ) durchführen aber im Grunde trotzdem nur die letzt gewählte Datenbank unter dem Punkt Database importieren. Vielleicht gibt es hier noch einen Alternativen schritt zu betrachten und man kann hier auch alle 3 Datenbanken auf einmal importieren dann gerne per Mail oder in den Kommentaren posten. Ansonsten wiederholen wir den Schritt für jede exportierte Datenbank.

Als nächstes Erstellen wir den Account ( Computerkonto )für den Delivery Controller. Da es nicht möglich ist ein Computerkonto über die Standardfunktion hinzuzufügen, verwenden wir hier eine kurze SQL Abfrage. Diesen Vorgang wiederholen wir natürlich für jeden Delivery Controller den wir in unserer Site haben.

create login [itnetx\dehwt-xc01$] from windows

Nachdem wir das Computerkonto hinzugefügt haben, überprüfen wir die Berechtigungen des Computerkontos auf den Datenbanken. Da sich die SID des Computerkontos nicht geändert hat sollten alle Berechtigungen noch richtig gesetzt sein. Rechte Maustaste auf den entsprechenden Computeraccount -> Properties

Unter User Mappings können wir dann einzeln für jede Datenbank die „role membership“ prüfen. Für Configuration Logging ist es:

Logging database – ConfigLoggingSchema_ROLE
Logging database – public

Für die Monitoring Database sind es die folgenden Rollen:

Monitoring database – Monitor_ROLE
Monitoring database – public

Abschließend für die Site Database sind es folgenden Rollen:

Site database – ADIdentitySchema_ROL
Site database – Analytics_ROLE (7.8 and newer)
Site database – AppLibrarySchema_ROLE (7.8 and newer)
Site database – chr_Broker
Site database – chr_Controller Site database – ConfigLoggingSchema_ROLE
Site database – ConfigLoggingSiteSchema_ROLE
Site database – ConfigurationSchema_ROLE 
Site database – DAS_ROLE
Site database – DesktopUpdateManagerSchema_ROLE
Site database – EnvTestServiceSchema_ROLE
Site database – HostingUnitServiceSchema_ROLE
Site database – Monitor_ROLE
Site database – MonitorData_ROLE
Site database – OrchestrationSchema_ROLE (7.11 and newer)
Site database – public 
Site database – StorefrontSchema_ROLE (7.8 and newer)
Site database – TrustSchema_ROLE (7.11 and newer)

Nachdem wir nun alles für einen reibungslosen Übergang zum neuen Datenbankserver vorbereitet haben, beginnen wir damit die alten Datenbankverbindung vom Delivery Controller zu trennen. Vorab können wir uns noch versichert das der Local Host Cache aktiv ist. Damit sind zumindest Shared Desktops beim umschalten weiter Verfügbar. Bestehende Verbindungen zu Hosted Shared Desktops oder Hosted VDI sind von dem Ausfall zudem auch nicht betroffen.

Get-BrokerSite

Set-BrokerSite -LocalHostCacheEnabled $true -ConnectionLeasingEnabled $false <- Setzt den LHC sollte er nicht gesetzt sein. 

Wir müssen jetzt verschiedene Einträge die auf unsere alte Datenbank verweisen „nullen“. Idealerweise schreiben wir uns die Zeilen in der Microsoft ISE oder einem anderen PowerShell Editor eurer Wahl zusammen. Ihr könnt euch auch mit dem folgenden Befehl alle Set-*DBConnection Befehle anzeigen lassen.

get-command set-*DBConnection

Jetzt übertragen wir unsere Befehle in ein Script. Wichtig ist das die AdminDBConnection als letztes genullt wird.

Set-ConfigDBConnection -DBConnection $null
Set-AppLibDBConnection –DBConnection $null    
Set-OrchDBConnection –DBConnection $null      
Set-TrustDBConnection –DBConnection $null     
Set-AcctDBConnection -DBConnection $null
Set-AnalyticsDBConnection -DBConnection $null 
Set-HypDBConnection -DBConnection $null
Set-ProvDBConnection -DBConnection $null
Set-BrokerDBConnection -DBConnection $null
Set-EnvTestDBConnection -DBConnection $null
Set-SfDBConnection -DBConnection $null
Set-MonitorDBConnection -DataStore Monitor -DBConnection $null  
Set-MonitorDBConnection -DBConnection $null                     
Set-LogDBConnection -DataStore Logging -DBConnection $null       
Set-LogDBConnection -DBConnection $null                          
Set-AdminDBConnection -DBConnection $null -force

Nachdem wir das nun auf dem ersten Delivery Controller gemacht haben müssen wir das natürlich auch auf dem zweiten tun. Entweder verbinden wir uns dort per RDP oder machen es per PowerShell

Enter-PSSession $Hostname

Dort führt ihr natürlich auch das Script aus. Vorher müsst ihr aber dort nochmal die Citrix Module laden wie oben beschrieben.

Nachdem nun alle Datenbankeinträge genullt sind wurde vom Delivery Controller der Local Host Cache aktiviert und eine aktive Steuerung des Delivery Controller ist nicht mehr möglich. Damit wir diese Zustand schnell wieder ändern. Setzen wir ein weiteres Script ein. Wichtig sind für euch die oberen 4 Zeilen. Dort pflegt ihr ServerName sowie die Namen der unterschiedlichen Datenbanken. Solltet ihr mehrere SQL Instanzen haben müsst ihr die entsprechende Instanz beim ServerName mit angeben.

$ServerName = "ADM01"
$SiteDBName = "CitrixDEDHNSite"
$LogDBName = "CitrixDEDHNLogging"
$MonitorDBName = "CitrixDEDHNMonintoring"

$csSite = "Server=$ServerName;Initial Catalog=$SiteDBName;Integrated Security=True;MultiSubnetFailover=True"

$csLogging = "Server=$ServerName;Initial Catalog=$LogDBName;Integrated Security=True;MultiSubnetFailover=True"

$csMonitoring = "Server=$ServerName;Initial Catalog=$MonitorDBName;Integrated Security=True;MultiSubnetFailover=True"

Set-AdminDBConnection -DBConnection $csSite
Set-ConfigDBConnection -DBConnection $csSite
Set-AcctDBConnection -DBConnection $csSite
Set-AnalyticsDBConnection -DBConnection $csSite # 7.6 and newer
Set-HypDBConnection -DBConnection $csSite 
Set-ProvDBConnection -DBConnection $csSite
Set-AppLibDBConnection –DBConnection $csSite # 7.8 and newer
Set-OrchDBConnection –DBConnection $csSite # 7.11 and newer
Set-TrustDBConnection –DBConnection $csSite # 7.11 and newer
Set-BrokerDBConnection -DBConnection $csSite
Set-EnvTestDBConnection -DBConnection $csSite
Set-SfDBConnection -DBConnection $csSite
Set-LogDBConnection -DBConnection $csSite
Set-LogDBConnection -DataStore Logging -DBConnection $null
Set-LogDBConnection -DBConnection $null
Set-LogDBConnection -DBConnection $csSite
Set-LogDBConnection -DataStore Logging -DBConnection $csLogging
Set-MonitorDBConnection -DBConnection $csSite
Set-MonitorDBConnection -DataStore Monitor -DBConnection $null
Set-MonitorDBConnection -DBConnection $null
Set-MonitorDBConnection -DBConnection $csSite
Set-MonitorDBConnection -DataStore Monitor -DBConnection $csMonitoring 

Nun setzen wir das Script auf dem ersten Delivery Controller ab.

Nachdem dies verfolgreich durchgeführt wurde wechseln wir wieder auf den nächsten Delivery Controller in unsere Site und führen das Script auch dort aus.

Abschliessend aktvieren wir wieder das Logging und das Monitoring und kontrollieren die Verfügbarkeit der Seite im Citrix Studio

Set-MonitorConfiguration -DataCollectionEnabled $true

Set-LogSite -State Enable

Ein Test im Studio über den Zustand der Site

Alternativer Test über die PowerShell

Get-AcctServiceStatus
Get-AdminServiceStatus
Get-BrokerServiceStatus
Get-ConfigServiceStatus
Get-EnvTestServiceStatus
Get-HypServiceStatus
Get-LogServiceStatus
Get-MonitorServiceStatus
Get-ProvServiceStatus
Get-SfServiceStatus
Get-AppLibServiceStatus 

Ich hoffen die Anleitung ist für euch Hilfreich und ihr könnt Sie evtl bei der nächsten Datenbank migration gebrauchen. Solltet ihr Fragen, Anregungen oder Kritik haben. Gerne in den Kommentaren oder per Mail. Bis zum nächsten Blogpost.

Kommentar hinterlassen

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

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.