SQL Server Upgrade in Zeiten von Docker

Dass ich sehr interessiert an der Docker-Technologie bin hat der ein oder andere möglicherweise schon mitbekommen. Mein guter Freund und Kollege Tillmann Eitelberg challanged meiner Begeisterung öfters mit den Worten “Wozu braucht man das?” oder “Ich kann da jetzt keinen Vorteil sehen”. Eine sehr coole Möglichkeit, die man mit Docker hat, möchte ich an dieser Stelle einmal demonstrieren und zeigen warum ich Docker so cool finde. Das Szenario das ich hier beschreibe ist das Upgrade eines Docker Containers von SQL Server 2017 auf SQL Server 2019 CTP 2 – und das innerhalb von fünf Minuten oder weniger. Dieses Szenario haben Tillmann und ich auch auf dem PASS Summit 2018 in Seattle demonstriert.

Grundsätzlich ist es ja so, dass Docker Container flüchtig ist, d.h. in dem Moment in dem ich den Docker Container lösche ist alles, was im Docker Container enthalten ist, weg. Diese Flüchtigkeit ist natürlich nichts was man in einer Umgebung haben möchte in der man Datenbanken zur Verfügung stellt. Liegt eine Datenbank innerhalb eines Docker Container und löscht man diesen Container, so ist die Datenbank mit allen enthaltenen Daten unwiederbringbar verloren. Natürlich gibt es eine Möglichkeit wie man dies verhindern kann: man kann einen Docker Container so aufbauen, dass man ein Volume oder ein Bind Mount erstellt. Hierbei wird ein Verzeichnis oder ein Volume in das Dateisystem des Docker Containers gemountet, d.h. die eigentlichen Daten liegen außerhalb des Docker Containers, durch das mounten werden sie aber in den Docker Container eingebunden und sind dann innerhalb des Containers sichtbar.

Die Idee für ein Upgrade eines SQL Servers unter Docker sieht wie folgt aus: Man erstellt einen Docker Container mit einer SQL Server 2017 Version und mountet ein Docker Volume als Datenlaufwerk in den Container. Möchte man den SQL Server nun upgraden, so löscht man einfach den SQL Server 2017 Container und ersetzt ihn durch einen SQL Server 2019 Container, der dasselbe gemountete Volume einbindet und schon ist das Upgrade auf die neue SQL Server Version schon erledigt. Im Folgenden demonstriere ich diesen Prozess.

Zunächst einmal erstellen wir uns einen SQL Server 2017 mit einem eingebunden Docker Volume.

Im Beispiel lasse ich den Docker Container auf dem Image frankgeisler/mssql-server-linux-adventureworks2017 basieren, damit wir für das Beispiel einen SQL Server haben der bereits über eine eingebundene Demodatenbank – in diesem Fall die AdventureWorks Datenbank – verfügt. Wichtig ist in diesem Docker Befehl der Teil -v sqlvolume:/var/opt/mssql hier wird ein Docker Volume mit dem Namen sqlvolume an den Pfad /var/opt/mssql gemountet. Das sieht dann wie folgt aus

An dem ausgeführten Docker Container kann man sich per SQL Server Management Studio anmelden. Durch Eingabe des Befehls

wird die SQL Server Version ausgegeben. In unserem Fall ist das die Versionsnummer 14.0.3029, also SQL Server 2017. Man kann hier auch sehen, dass es sich um einen SQL Server unter Linux, und zwar genauer unter Ubuntu, handelt.

Was auf dem Screenshot auch zu sehen ist, ist dass die Datenbank AdventureWorks2017 dort vorhanden ist. Der nächste Schritt im Upgrade Prozess ist nun den vorhandenen Docker Container zu löschen. Dies kann man mit dem Befehl


erledigen. In unserem Demo-Fall nutze ich den Parameter -f, um ein Force Remove zu machen, Das löscht den Docker Container selbst dann wenn dieser noch ausgeführt wird.

Als nächstes wird der Container neu erstellt, allerdings mit einem anderen Image und zwar mit dem Image

mcr.microsoft.com/mssql/server:vNext-CTP2.0-ubuntu. Hierbei handelt es sich um ein Image mit der SQL Server Version 2019 CTP 2.

Nachdem der Container erstellt wurde können wir uns nicht direkt mit dem SQL Server Management Studio anmelden, da der SQL Server noch die Systemdatenbanken auf die neue Version aktualisiert. Solange dieser Vorgang nicht abgeschlossen ist läuft der SQL Server im Single-User-Modus. Den Upgrade Prozess kann man mit Hilfe des folgenden Befehls überwachen


Im Screenshot kann man sehr schön sehen wie die Datenbank model auf die neue Version des SQL Servers geupdated wird. Ist der Upgrade Prozess abgeschlossen kann man sich wieder am SQL Server anmelden. Setzt man nun noch einmal den Befehl

ab, so sieht man nun, dass der SQL Server aktualisiert wurde.

Außerdem kann man sehen dass die Datenbank AdventureWorks2017, die unter der alten SQL Server Version auf dem Datenbankserver vorhanden war auch übernommen wurde.

Schaut man sich den Kompatibilitätslevel der Datenbank mit dem folgenden Befehl an

So sieht man, dass sich die Datenbank noch im Kompatibilitätslevel 140, also SQL Server 2017 befindet. Das ist auch ganz normal, da bei einem Inplace SQL Server Upgrade – und nichts anderes haben wir hier eigentlich gemacht, die Kompatibilitätslevel der Benutzerdatenbanken beibehalten werden.

Mit dem folgenden SQL Befehl können wir diese Datenbank in den Kompatibilitätslevel 150, also SQL Server 2019 heben:

Führen wir nun noch einmal den Befehl von oben aus, so erhalten wir die folgende Ausgabe.

Damit ist die Migration von SQL Server 2017 nach SQL Server 2019 CTP 2 vollständig abgeschlossen. In diesem Blogeintrag haben Sie gesehen wie man innerhalb kürzester Zeit einen SQL Server (der ganze Vorgang dauert nur wenige Minuten) der in einem Container ausgeführt hat auf eine neue Version upgraden kann. Ich hoffe, dass Tillmann nun aufgrund dieses Artikels zumindest einen Vorteil der Docker Technologie erkennen kann. Viele Grüße an dieser Stelle.

Das Image das ich für die SQL Server 2017 Datenbank verwendet habe kann man in meinem Docker Hub Repository finden. Die Scripte zur Migration (neben einigen anderen Scripten) findet man in einem github Repository das Tillmann und ich für unseren Vortrag auf dem PASS Summit 2018 in Seattle angelegt haben.

3 thoughts on “SQL Server Upgrade in Zeiten von Docker

  • Hallo Frank, vielleicht kann ich dich auch ein wenig challengen 😉

    Kannst du mir bitte den finanziellen Aspekt von Docker näher bringen?
    Ab wie vielen SQL Servern in welcher Größe lohnt sich ein Umstieg für den Kunden?
    Deiner Meinung nach, was braucht man für einen Umstieg von beispielsweise für 5 SQL Server StdEdt. (4vCPU,8GB,250GB Daten) Hardware oder VM in einer produktiven Umgebung? Lohnt sich das? Ab wann lohnt sich das? Gerne auch per Mail oder neuen Blogbeitrag 😉

    Ich finde die Technologie auch stark und würde das gerne vermehrt nutzen, aber irgendwie mache ich vielleicht einen (Gedanken-)Fehler, denn ich scheitere an den finanziellen Aspekten…

    DANKE

    • Hallo Björn!

      Vielen Dank für Deine Frage. Grundsätzlich ist die Lizensierung von SQL Server in Docker eine sehr spannende Frage. Klar ist, dass natürlich eine Lizenz benötigt wird. Wie genau die aussieht, bzw. wie viele Lizenzen Du benötigst weiß ich auch nicht, da wäre mal ein Statement von einem unserer Microsoft Kontakte hilfreich. Grundsätzlich ist ein Docker Container ja nur ein Prozess der auf einem Rechner läuft. Mit einem einzelnen Docker Container ist das noch einfach, da brauchst Du eine Core Lizenz die die Kerne im Docker Host abdeckt. Wie das aber aussieht wenn Du mehr als einen Docker Container mit SQL Server auf einem Rechner betreibst weiß ich nicht. Spekulativ würde ich meinen (macht irgendwie in meinen Augen Sinn), dass man mit einer SQL Server Lizenz mehrere SQL Server Docker Container auf einem Dockerhost bertreiben können sollte. Für mich “fühlt” sich SQL Server auf einem Docker Container eher an wie eine Instanz als wie eine SQL Server Installation auf einer VM. Aber das ist, wie gesagt, nur Spekulation.
      Was Du für eine Hardware brauchst kann man so pauschal nicht beantworten, da es ja sehr stark davon abhängt was die fünf SQL Server Std. Ed so machen. Wenn die viel Last haben brauchst Du mehr Hardware als wenn die nur vor sich rumideln. Wenn Du SQL Server auf einem Linux Container ausführen möchtest würde ich eher Hardware als VM empfehlen, da der zugrundeliegende Server ja in diesem Fall Hyper-V können muss (wegen Linux) und Virtualisierung innerhalb von Virtualisierung performancetechnisch eh keine so gute Idee ist. Sollte die physikalische Maschine mal crashen ist das auch kein Problem. Mit Docker bist Du schnell wieder online weil Du nur auf einer anderen Maschine die Container neu erzeugen musst. Die Datenbanken hast Du natürlich extern liegen (so wie in unserem Upgrade Beispiel) und außerdem gehe ich davon aus dass Du natürlich auch ein Backup der Datenbanken hast. Ich hoffe ich konnte Dir etwas weiterhelfen. Wegen der Lizensierung spreche ich mal mit Microsoft.

  • Hallo Björn!

    Ich habe jetzt mal mit den Kollegen von Microsoft (vielen Dank an dieser Stelle an Volker, Patrick und Jürgen) über die Lizensierung vom SQL Server in Docker gesprochen. Bei dem Gespräch ist folgendes herausgekommen:
    Grundsätzlich gibt es natürlich die Möglichkeit den SQL Server entweder per Core oder per Benutzer/Device (gilt nur für SQL Server Standard) zu lizensieren. Die Standard Benutzer/Device Lizensierung ist denke ich klar: Du brauchst eine Server-Lizenz und dann für jeden User oder für jedes Device was zugreifen soll eine Client Access Lizenz. So weit so einfach – geht aber wie gesagt nur für die Standard-Edition.
    Wenn Du eine Core-Lizensierung machen möchtest gibt es auch zwei Möglichkeiten. Zum einen kannst Du einen SQL Server für den Docker Container lizensieren in dem dieser läuft. Hierbei musst Du natürlich alle Kerne lizensieren die dem Docker Container zugewiesen sind. Meiner Meinung nach sinnvoller ist es aber, wenn Du alle Kerne des Dockerhosts lizensierst, weil Du dann n Container mit SQL Server auf dem Host deployen kannst und Du damit dem Gedanken der flüchtigen Container eher gerecht wirst als wenn Du pro Container lizensierst. Ich hoffe ich bzw. wir konnten Dir hiermit weiterhelfen. In dem folgenden Dokument https://download.microsoft.com/download/7/8/C/78CDF005-97C1-4129-926B-CE4A6FE92CF5/SQL_Server_2017_Licensing_guide.pdf ist das Ganze noch mal ab Seite 20 in allen Details beschrieben.

    Viele Grüße

    Frank

Schreibe einen Kommentar

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

%d Bloggern gefällt das: