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.

docker run --name sqlserverdocker -p 1433:1433 -v sqlvolume:/var/opt/mssql 
   -d  frankgeisler/mssql-server-linux-adventureworks2017

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

SELECT @@Version

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

docker container rm sqlserverdocker -f

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.
docker run --name sqlserverdocker -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=!demo54321" 
     -p 1433:1433 -v sqlvolume:/var/opt/mssql -d mcr.microsoft.com/mssql/server:vNext-CTP2.0-ubuntu

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

docker container logs sqlserverdocker

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
SELECT @@Version

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

SELECT compatibility_level
FROM sys.databases
WHERE name = 'AdventureWorks2017';
GO

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:

ALTER DATABASE AdventureWorks2017 SET COMPATIBILITY_LEVEL = 150;
GO

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.

Leave a Reply

Your email address will not be published. Required fields are marked *

%d bloggers like this: