SQL Server Management mit PowerShell und dbatools (Part1): Installation und Datenbank-Migration

cover image of blog article 'SQL Server Management mit PowerShell und dbatools (Part1): Installation und Datenbank-Migration'

dbatools ist ein praktisches OpenSource PowerShell Modul, mit dem administrative Aufgaben des Microsoft SQL Server Managements bequem aus der PowerShell erledigt werden können. Mit den mehr als 500 Befehlen, die dbatools beherrscht, ist der Einsatz für eine Vielzahl von Aufgaben und Szenarien denkbar.

In diesem ersten Artikel unserer mehrteiligen Reihe durchlaufen wir die Installation der dbatools und untersuchen einige der Befehle, die für eine vollständige Server-Migration unverzichtbar sind. Im Fokus stehen vor allem das Migrieren der Konfigurationseinstellungen, Logins sowie von Datenbanken.

Folgender Vergleich aus dem offiziellen GitHub der dbatools beschreibt die Funktionalität sehr passend:
think of it like a command-line SQL Server Management Studio”.

Aufbau unserer Umgebung

In unserem Szenario laufen zwei Virtuelle Maschinen (VMs) OPWin22Sql17 sowie OPWin22Sql19 auf einem privaten Cloud Cluster. Sie befinden sich in derselben Domäne. Arbeitsumgebung von der administriert wird ist eine weitere VM, die sich ebenfalls in dem Cluster-Netzwerk befindet. Alle Befehle werden von dort aus in der PowerShell ausgeführt.

Auf der VM OPWin22Sql17 läuft ein SQL 2017 Server mit einer AdventureWorks2017 Beispieldatenbank und diversen Logins. Diesen Server migrieren wir auf den frisch eingerichteten SQL 2019 Server der OPWin22Sql19 VM. Beide SQL Server sind über Windows Authentication gesichert.

Installation der dbatools

Die ersten beiden Schritte müssen nur ausgeführt werden, falls in der Vergangenheit noch kein PowerShell Modul aus der PowerShellGallery, der zentralen Repository für PowerShell-Inhalte, installiert wurde.

Zunächst müssen wir sichergehen, dass wir remote signierte Zertifikate ausführen können. Dazu ändern wir die ExecutionPolicy in der PowerShell folgendermaßen.

Set-ExecutionPolicy -Scope CurrentUser RemoteSigned

Und bestätigen mit A. Nun haben wir die Berechtigung remote signierte Skripte vertrauenswürdigen Herausgeber, sowie unsere eigenen lokalen Skripte auszuführen.

Als nächstes erlauben wir Installationen aus der PowerShell Gallery.

Set-PSRepository -Name PSGallery -InstallationPolicy Trusted

Nun zur eigentlichen Installation. Wir installieren das Modul mit dem install-Module Befehl:

Install-Module dbatools

und bestätigen anschließend in der Eingabeaufforderung mit A, sodass wir dbatools als Publisher immer vertrauen. Nun können wir mit dem Ausführen von dbatools Befehlen beginnen.

Für eine detailliertere Schritt-für-Schritt Installation unter Windows empfehlen wir diesen offiziellen Artikel von dbatools.

Verbindung testen (Optional)

Nachdem dbatools eingerichtet ist, möchten wir uns zunächst Informationen über die Verbindung zur SQL Instanz ausgeben lassen. Das geht mit dem Test-DbaInstance. Gleichzeit stellen wir sicher, dass wir mit der PowerShell remote Ausführungsrechte auf den Servern haben. Um den Befehl auszuführen, setzen wir die beiden Namen unserer SQL Server hinter den -SqlInstance Parameter in dem Test-DbaInstance Befehl.

Test-DbaConnection -SqlInstance OPWIN22SQL17, OPWin22Sql19

Nach dem Ausführen erhalten wir folgende Ausgabe:

Test-DbaConnection PowerShell Ausgabe
Test-DbaConnection PowerShell Ausgabe

Bei diesem dbatools Befehl ist besonderes Augenmerk auf den [-SqlInstance] Parameter zu richten. Er ist fast immer ein Pflichtparameter und wird uns noch häufiger über den Weg laufen. In diesem Beispiel übergeben wir in einem einzigen Befehl sogar zwei verschiedene SQL Server in den Parametern. Damit wird einer der Gründe deutlich, wieso dbatools so nützlich ist, denn mit fast jedem dbatools Befehl lassen sich mehrere SQL Instanzen gleichzeitig ansprechen!

Bevor wir mit der Migration loslegen, ist es eine gute Idee zu überprüfen, ob wir uns mit unseren SQL Servern verbinden können. Das Prinzip des Verbindungsaufbaus ist das gleiche wie bei SSMS. Wir benutzen dazu den Connect-DbaInstance Befehl.

Connect-DbaInstance -SqlInstance OPWin22Sql19,OPWIN22SQL17

Verbindungen lassen sich auch auf Instanzen mit vom Standard abweichenden Port Nummern herstellen. Ebenso ist es möglich sich mit SQL Server Authentication, Azure Active Directory (AAD) oder Azure SQL Database zu verbinden, und das sogar bei Nutzung von Multifactor authentication (MFA). Für diese Szenarien schaut man gegebenenfalls in die offizielle Dokumentation.

An dieser Stelle bietet sich noch ein Datenbank-Check zum Beispiel mit CheckDB an, um die Integrität unserer Datenbank zu überprüfen. Wie man CheckDB richtig verwendet und Datenbanken gegebenenfalls reparieren kann in diesem Artikel nachlesen.

Migration der Datenbank

1. SQL SERVER Konfigurationseinstellungen überprüfen und kopieren

Um sicherzugehen, dass unser Zielserver korrekt konfiguriert ist, möchten wir uns die SQL Server Konfigurationseinstellungen des Ursprungservers ausgeben lassen und gegebenenfalls mit denen des Zielservers vergleichen.

Dazu nutzen wir den Get-DbaSpConfigure Befehl, der uns die Konfigurationseinstellungen aus der Configuration.Properties Eigenschaft des SQL Server Management Objekts (SMO) ausliest.

Get-DbaSpConfigure -SqlInstance OPWIN22SQL17

Die Konfigurationseinstellungen vom OPWIN22SQL17 werden uns in der Kommandozeile ausgegeben.

Get-DbaSpConfigure PowerShell Ausgabe
Get-DbaSpConfigure PowerShell Ausgabe

Praktischer können wir uns diese Ausgaben auch direkt in eine Datei speichern lassen. Dazu benutzen wir den Redirection Operator > und übergeben damit die Ausgabe von Get-DbaSpConfigurean eine Textdatei.

Get-DbaSpConfigure -SqlInstance OPWIN22SQL17 > „C:/temp/SqlServer17Config.txt”

Den selben Befehl lassen wir für unseren Ziel Server OPWin22Sql19 laufen.

Get-DbaSpConfigure -SqlInstance OPWin22Sql19 > „C:/temp/SqlServer19Config.txt”

Nun können wir bequem die Konfigurationsdateien mit dem Texteditor unserer Wahl vergleichen. Da wäre das kleine Opensource Tool WinMerge zu erwähnen, das speziell zu Zwecken der Differenzierung von Textdateien entwickelt wurde.

Konfigurationseinstellungen kopieren

Sollten wir nach der Prüfung feststellen, dass wir die Konfigurationsdatei auf den neuen SQL Server kopieren möchten, können wir dies mit dem Copy-DbaSpConfigure Befehl tun.

Copy-DbaSpConfigure migriert Konfigurationseinstellungen von einem SQL Server auf den anderen.

Copy-DbaSpConfigure -Source OPWIN22SQL17 -Destination OPWin22Sql19
Copy-DbaSpConfigure PowerShell Ausgabe
Copy-DbaSpConfigure PowerShell Ausgabe

Damit alle Konfigurationseinstellungen vom SQL Server übernommen werden machen wir einen Neustart mit dem Restart-DbaService Befehl.

Restart-DbaService -ComputerName OPWin22Sql19
Restart-DbaService PowerShell Ausgabe
Restart-DbaService PowerShell Ausgabe

2. Logins übertragen

Ebenfalls notwendig bei unserer Migration ist es, Logins zu übertragen. Hierbei hilft uns der CopyDbaLogin Befehl.

Bevor wir unsere Logins migrieren, möchten wir einen Blick auf diese werfen. Mit dem dbatools Befehls Get-DbaLogin lassen sich die Logins eines SQL Servers ausgeben. Um die Ausgabe des Get-DbaLogin in einem Fenster zu betrachten, benutzen wir den Pipe Befehl | der PowerShell, sowie Out-GridView in Kombination mit -Passthru. Damit lassen sich die Logins in einem Tabellenfenster ausgeben und bequem inspizieren. Dieser Schritt ist natürlich optional.

Get-DbaLogin -SqlInstance OPWIN22SQL17 | Out-GridView -Passthru

In dem neuen Fenster werden alle Logins unseres Server dargestellt.

Get-DbaLogin GridView Ausgabe
Get-DbaLogin GridView Ausgabe

Nachdem wir uns einen Überblick über die Logins verschafft haben, schauen wir uns zunächst den Copy-DbaLogin Befehl, den wir für das Migrieren der Logins verwenden werden, an.

Copy-DbaLogin -Source OPWIN22SQL17 -Destination OPWin22Sql19 -Force -KillActiveConnection

Pflichtparameter sind erwartungsgemäß [-Source] und [-Destination].

Von Interesse für uns sind die beiden optionalen Parameter [-Force]und [-KillActiveConnection].

Wird der Parameter [-Force] gesetzt, werden Logins, die auf dem Zielserver bereits existieren, gelöscht und dann neu angelegt. Logins, die Agent Jobs besitzen, können allerdings nicht gelöscht werden.

Mit [-KillActiveConnection] werden alle aktiven Verbindungen und Sessions auf der Zielinstanz gestoppt. Das kann z.B. beim Kopieren von Logins wichtig sein, da Logins nicht gelöscht werden können, solange sie in einer Session verwendet werden.

Um sicherzugehen, dass wir auf der Zielinstanz bereits vorhandene Logins überschreiben, benutzen wir die beiden erwähnten Parameter [-Force] und [-KillActiveConnection].

Copy-DbaLogins PowerShell Ausgabe
Copy-DbaLogins PowerShell Ausgabe

Zu beachten ist, dass der Login Algorithmus seit der SQL Server 2012 Version nicht mehr rückwärtskompatibel ist. Das migrieren der Logins auf ältere SQL Server ist hiermit also nicht möglich.

Der Copy-DbaLogin hat noch weitere spezifische Parameter. Für eine detaillierte Beschreibung des Befehls und aller Parameter empfehlen wir einen Blick in die Dokumentation.

3. Datenbank kopieren

Nun bleibt uns noch, die Datenbank selbst zu kopieren. Dabei gibt es mehrere Möglichkeiten, wir haben uns dafür entschieden, den Copy-DbaDatabase zu verwenden.

Schließlich bleibt uns noch die Datenbank selbst zu kopieren. Zum einen gibt es die Möglichkeit, ein Backup von OPWIN22SQL17 zu erstellen und dann über den Restore-DbaDatabase auf OPWin22Sql19 wiederherzustellen.

Mit dem Copy-DbaDatabase Befehl erfolgt das Kopieren über Backup / Restore sogar in einem Schritt. dbatools erstellt für uns ein Backup, welches automatisch auf dem Zielserver wiederhergestellt wird. Dazu müssen wir nur -BackupRestore sowie den -SharedPath Parameter zusammen mit einem Pfad, auf den beide Server zugreifen können, übergeben.

Copy-DbaDatabase -Source OPWIN22SQL17 -Destination OPWin22Sql19 -Database AdventureWorks2017 -BackupRestore -SharedPath \\terminalpc\Share\migration
Copy-DbaDatabase PowerShell Ausgabe
Copy-DbaDatabase PowerShell Ausgabe

Alternativ lässt sich auch mit Detach / Attach die Datenbank kopieren.

Statt von -BackupRestore muss hierzu der -DetachAttach Parameter gesetzt werden. Wieso wir uns für -BackupRestore entschieden haben erläutern wir in den nächsten Teilen unserer Artikelreihe.

Fazit

Wir hoffen wir konnten Sie von der Mächtigkeit des kleinen Tools überzeugen und Ihnen die Installation der dbatools näherbringen. Im nächsten Teil unserer Artikelreihe machen wir weiter mit der Migration von Server Agent Jobs und zeigen dann, wie man Cluster mit AlwaysOn High Availability Groups migriert und das alles selbstverständlich mithilfe der dbatools.

Noch offene Fragen? Unsere Expert:innen helfen Ihnen gerne weiter! Kontaktieren Sie uns gerne einfach über das Kontaktformular.