Linux, Container oder Windows? Wann SQL Server wo hingehört
Die Frage kommt meist von außen. Die IT stellt auf Linux um, das Entwicklungsteam liefert alles als Container, oder der nächste Datenbankserver soll ohne Windows auskommen. SQL Server kann das seit 2017. Ob es für Ihre Anwendung passt, entscheidet sich aber selten an der Datenbank-Engine. Es entscheidet sich an drei Fragen: Welche Funktionen nutzt die Anwendung? Wer betreibt den Server? Und wie soll er ausfallsicher werden?
Diese Seite geht die drei Fragen durch, fasst sie in einer Entscheidungstabelle zusammen und endet mit einer Prüfabfrage für Ihre bestehende Instanz.
In 60 Sekunden
- Die Lizenz ist dieselbe. Microsoft lizenziert SQL Server für Windows und Linux gleich. Kosten ändern sich höchstens beim Betriebssystem, und für Produktion empfiehlt Microsoft Distributionen mit Supportvertrag.
- Für Entwicklung und CI ist der Container meist die bessere Wahl. Er startet in Sekunden, hat eine feste Version und lässt sich wegwerfen.
- Für Produktion entscheidet zuerst die Funktionsliste. Agent-Jobs mit PowerShell oder SSIS, FILESTREAM, Merge-Replikation oder Linked Server zu Oracle erzwingen einen Umbau oder sprechen gegen Linux.
- Hochverfügbarkeit geht, aber anders. Statt Windows-Failovercluster übernimmt Pacemaker. Das ist ein anderes Werkzeug mit anderem Betriebswissen.
- Container in Produktion sind unterstützt, unter Bedingungen. Microsoft knüpft den Support an seine Images und an dieselbe Distribution in Container und Host. Dazu kommen die Fallstricke aus Teil 3.
Drei Einsatzbilder
Entwicklung und CI im Container
Hier ist der Nutzen am größten und das Risiko am kleinsten. Ein Container mit der Developer Edition startete in unserem Lab in 7 bis 14 Sekunden, jede Version und jedes Update ist ein eigener Image-Tag, und nach dem Testlauf ist der Container wieder weg. Die Developer Edition ist kostenlos, aber nur für Entwicklung und Test lizenziert. Worauf Sie achten sollten, damit Tests reproduzierbar laufen, steht in Teil 3: festen CU-Tag statt latest, auf eine erfolgreiche Abfrage warten statt auf den laufenden Container, und für Tests gegen Standard bei SQL Server 2025 MSSQL_PID=StandardDeveloper setzen.
Produktion auf einem Linux-Server oder einer Linux-VM
Der klassische Betrieb, nur auf einer anderen Plattform. SQL Server wird als Paket der Distribution installiert und aktualisiert, mit mssql-conf eingestellt und mit systemctl gesteuert. Je Rechner gibt es genau eine Instanz. Dieser Weg passt, wenn Ihr Betrieb Linux-Server ohnehin patcht, überwacht und sichert und die Anwendung keine der fehlenden Funktionen braucht.
Produktion im Container oder in Kubernetes
Microsoft unterstützt SQL Server im Container auf Docker, Kubernetes und OpenShift, laut Support-Policy aber unter Bedingungen:
- Offizielle Images. Unterstützt sind die Images von Microsoft und eigene, die darauf aufbauen und nichts unter
/opt/mssqlverändern; ganz selbst gebaute Images nur auf einer unterstützten Distribution. Im Supportfall kann Microsoft verlangen, das Problem auf dem offiziellen Image nachzustellen. - Gleiche Distribution in Container und Host. Distribution und Hauptversion des Images müssen zu denen des Hosts passen. Ein Image auf Basis von Ubuntu 22.04 auf einem Host mit Ubuntu 24.04 fällt nach dieser Regel heraus.
- Probleme der Container-Laufzeit klären Sie mit deren Hersteller, nicht mit Microsoft.
- Funktionen, die am Azure-Arc-Agenten hängen, etwa die Anmeldung über Microsoft Entra, gibt es im Container nicht.
Für Kubernetes empfiehlt Microsoft ein StatefulSet mit einem SQL-Server-Container je Pod und für Produktion die Dienstgüte „Guaranteed“, also gleiche Werte für angeforderte und begrenzte Ressourcen.
Was für Linux spricht
- Der Betrieb kennt Linux. Wenn Patchen, Überwachung, Sicherung und Automatisierung schon über Linux-Werkzeuge laufen, fügt sich SQL Server dort ein, statt eine Windows-Insel zu bleiben.
- Die Plattform ist ohnehin ein Container-Cluster. Dann ist SQL Server im Container der Weg mit den wenigsten Sonderregeln, vorausgesetzt, die Bedingungen oben sind erfüllt.
- Viele kleine Instanzen. Für Test, Schulung und Entwicklung sind Container einfacher als benannte Instanzen auf einem Windows-Server.
- Betriebssystemkosten. Windows Server entfällt, dafür kommt für Produktion meist ein Supportvertrag für die Distribution. Ob das günstiger ist, hängt an Ihren Verträgen; die SQL-Server-Lizenz ändert sich nicht.
Was dagegen spricht
- Die Anwendung nutzt Funktionen, die fehlen. Die vollständige Liste steht in der Übersicht. Die Prüfabfrage unten findet die häufigsten Fälle auf Ihrer Instanz.
- Hochverfügbarkeit verlangt neues Wissen. Availability Groups mit automatischem Failover brauchen unter Linux Pacemaker. Der Listener ist eine IP-Adresse mit DNS-Eintrag, verteilte Transaktionen über MSDTC sind in Availability Groups unter Linux nicht unterstützt. Bei einer Failover Cluster Instance gibt es keinen virtuellen Netzwerknamen; den DNS-Eintrag legen Sie selbst an.
- Windows-Anmeldungen kosten Einrichtung. Der Host muss ins Active Directory, SQL Server braucht ein Keytab mit SPNs, und Clients verbinden sich über den vollständigen Hostnamen. Domänenlokale Gruppen werden nicht unterstützt.
- Gewohnte Werkzeuge fehlen. Kein Configuration Manager, keine Wartungspläne aus SSMS, keine Agent-Schritte für PowerShell. Skripte, die per PowerShell oder WMI auf den Datenbankserver zugreifen, müssen neu gebaut werden.
- Der Hersteller entscheidet mit. Bei Standardsoftware zählt die Freigabe des Herstellers. Unterstützt er SQL Server nur unter Windows, hilft die technische Machbarkeit wenig.
Entscheidungstabelle
| Anforderung | Linux-Server oder -VM | Container | Hinweis |
|---|---|---|---|
| Anwendung mit SQL-Anmeldungen, Agent-Jobs nur in T-SQL | geht | geht | – |
| Windows-Anmeldungen aus dem Active Directory | mit Aufwand | nicht geprüft | Keytab, SPNs, Verbindung über den vollständigen Hostnamen |
| Agent-Jobs mit PowerShell, CmdExec oder SSIS | fehlt | fehlt | Jobs auf T-SQL umstellen oder außerhalb von SQL Server planen |
| Warnungen (Alerts) | fehlt | fehlt | Überwachung außerhalb von SQL Server |
| FILESTREAM oder FileTables | fehlt | fehlt | Ablage der Dateien neu entwerfen |
| Merge-Replikation | fehlt | fehlt | – |
| Linked Server zu Oracle, ODBC oder Excel | fehlt | fehlt | Microsoft verweist auf PolyBase |
| Reporting oder Analysis Services auf demselben Server | fehlt | fehlt | Reporting Services unter Windows, der Katalog darf auf Linux liegen |
| Mehrere Instanzen auf einem Rechner | fehlt | geht | ein Container je Instanz, eigener Port |
| Automatischer Failover | mit Aufwand | nicht geprüft | Pacemaker; ein Neustart des Pods durch Kubernetes ist kein Failover auf eine zweite Datenkopie |
| Verteilte Transaktionen (MSDTC) | prüfen | prüfen | in Availability Groups unter Linux nicht unterstützt |
| Viele kurzlebige Test- und CI-Instanzen | umständlich | geht | Developer Edition, fester CU-Tag |
„Nicht geprüft“ heißt: Die gelesenen Quellen beantworten es für Container nicht eindeutig, und wir haben es nicht im Lab aufgebaut.
Container in Produktion: was dazugehört
Wer SQL Server produktiv im Container betreibt, braucht neben den Support-Bedingungen ein paar feste Regeln. Die Messungen dazu stehen in Teil 3.
- Sauber herunterfahren. Bei SQL Server 2022 und 2025 beendet
docker stopdie Instanz in den heutigen Images nicht geordnet. Bis Microsoft das Startskript korrigiert, gehört ein Schritt dazu, der das Stoppsignal direkt an den SQL-Server-Prozess schickt, in Kubernetes etwa alspreStop. - Grenzen selbst setzen. Speicher über
MSSQL_MEMORY_LIMIT_MBmit Kopfraum unter der Container-Grenze, CPUs über feste CPUs oder MAXDOP. Auf eine CPU-Quote allein reagiert SQL Server nicht. - Daten auf dauerhaften Volumes mit XFS oder ext4, nicht im Dateisystem des Containers.
- Updates als neues Image mit festem CU-Tag, eingespielt durch einen neuen Container auf denselben Volumes.
Prüfabfrage: Was nutzt meine Instanz, das unter Linux fehlt?
Die Abfrage läuft auf Ihrer bestehenden Instanz, in der Regel unter Windows, und prüft 20 Punkte aus Microsofts Liste der unter Linux fehlenden Funktionen: Instanzeinstellungen, Anmeldungen und Endpunkte, Agent-Jobs, Warnungen und Wartungspläne in msdb und je Datenbank FILESTREAM, FileTables, CLR-Assemblies und Secure Enclaves. Das Ergebnis hat eine Zeile je Prüfung, Treffer zuerst. Die Spalte einordnung sagt, was ein Treffer bedeutet:
- fehlt unter Linux: muss vor einem Umzug umgebaut werden.
- mit Aufwand: geht unter Linux, braucht aber Einrichtung, etwa Zertifikate statt Windows-Authentifizierung für Endpunkte.
- prüfen: hängt davon ab, wofür die Einstellung genutzt wird.
Abfrage: Was fehlt unter Linux?
/* PSG Stack · SQL Server unter Linux und Docker · Abfrage 1 Was nutzt diese Instanz, das unter Linux fehlt oder Umbau braucht? Gedacht für die bestehende Instanz, bevor Sie über einen Umzug nach Linux oder in einen Container entscheiden. Ergebnis: eine Zeile je Prüfung, Treffer zuerst. !!! WARNUNG — bitte vor dem Ausführen lesen !!! - Nur lesend. Die Abfrage ändert keine Daten und keine Einstellung; sie legt nur drei temporäre Tabellen in tempdb an. - Rechte: am einfachsten als sysadmin. Sonst VIEW SERVER STATE, VIEW ANY DEFINITION, Leserechte in msdb (db_datareader) und Zugriff auf die Datenbanken. Ohne VIEW ANY DEFINITION blendet SQL Server fremde Anmeldungen, Endpunkte und Linked Server aus; die Spalte hinweis meldet das, ebenso alles, was nicht lesbar war. - MAXDOP 1: Jede Teilabfrage läuft seriell. - Sie durchläuft alle Datenbanken, die online sind und auf die Sie Zugriff haben. Bei sehr vielen Datenbanken außerhalb der Hauptlastzeit ausführen. - Grundlage: Microsofts Liste der unter Linux nicht verfügbaren Funktionen für SQL Server 2022 und 2025 (gelesen am 11. und 12.11.2026). Kein Ersatz für einen Test der Anwendung; MSDTC, Managed Backup, Analysis und Reporting Services prüft sie nicht. - Ab SQL Server 2017. Geprüft im PSG-Lab auf 2017, 2019, 2022 und 2025 in Linux-Containern, mit Testobjekten, soweit Linux sie anlegen lässt (12.11.2026). Unter Windows, wo sie vor einem Umzug laufen wird, nicht geprüft; sie liest nur Katalogsichten, die es dort ebenso gibt.*/SET NOCOUNT ON;SET QUOTED_IDENTIFIER ON; -- sqlcmd startet ohne; die XML-Methoden unten brauchen es IF OBJECT_ID(N'tempdb..#pruefung') IS NOT NULL DROP TABLE #pruefung;IF OBJECT_ID(N'tempdb..#treffer') IS NOT NULL DROP TABLE #treffer;IF OBJECT_ID(N'tempdb..#db') IS NOT NULL DROP TABLE #db;CREATE TABLE #pruefung (nr int PRIMARY KEY, bereich nvarchar(30), pruefung nvarchar(120), einordnung nvarchar(30), hinweis nvarchar(200) NULL);CREATE TABLE #treffer (nr int, objekt nvarchar(300));CREATE TABLE #db (name sysname, geprueft bit); INSERT #pruefung (nr, bereich, pruefung, einordnung) VALUES ( 1, N'Instanz', N'Benannte Instanz (Linux: eine Standardinstanz je Host)', N'mit Aufwand'), ( 2, N'Instanz', N'xp_cmdshell eingeschaltet', N'fehlt unter Linux'), ( 3, N'Instanz', N'Eigene Extended Stored Procedures', N'fehlt unter Linux'), ( 4, N'Instanz', N'Buffer Pool Extension aktiv', N'fehlt unter Linux'), ( 5, N'Instanz', N'Linked Server zu anderen Quellen als SQL Server', N'fehlt unter Linux'), ( 6, N'Instanz', N'Ad Hoc Distributed Queries eingeschaltet', N'prüfen'), ( 7, N'Sicherheit', N'Windows-Anmeldungen und -Gruppen', N'mit Aufwand'), ( 8, N'Sicherheit', N'Endpunkte mit Windows-Authentifizierung', N'mit Aufwand'), ( 9, N'Sicherheit', N'EKM-Anbieter (Linux: nur Azure Key Vault ab 2022 CU12)', N'prüfen'), (10, N'HA', N'Database Mirroring', N'fehlt unter Linux'), (11, N'Agent', N'Jobschritte CmdExec, PowerShell, SSIS, SSAS, Queue Reader', N'fehlt unter Linux'), (12, N'Agent', N'Warnungen (Alerts)', N'fehlt unter Linux'), (13, N'Agent', N'Wartungspläne', N'fehlt unter Linux'), (14, N'Dienste', N'SSIS-Katalog (SSISDB) vorhanden', N'prüfen'), (15, N'Datenbanken', N'Merge-Replikation (veröffentlicht)', N'fehlt unter Linux'), (16, N'Datenbanken', N'Stretch Database', N'fehlt unter Linux'), (17, N'Datenbanken', N'FILESTREAM-Dateigruppen', N'fehlt unter Linux'), (18, N'Datenbanken', N'FileTables', N'fehlt unter Linux'), (19, N'Datenbanken', N'CLR-Assemblies mit EXTERNAL_ACCESS oder UNSAFE', N'fehlt unter Linux'), (20, N'Datenbanken', N'Always Encrypted mit Secure Enclaves', N'fehlt unter Linux'); /* Ohne VIEW ANY DEFINITION zeigen die Katalogsichten nur einen Teil der Objekte */IF HAS_PERMS_BY_NAME(NULL, NULL, 'VIEW ANY DEFINITION') = 0 UPDATE #pruefung SET hinweis = N'unvollständig: ohne VIEW ANY DEFINITION nur teilweise sichtbar' WHERE nr IN (3, 5, 7, 8, 9, 19); /* 1 · Instanz und Sicherheit */INSERT #treffer SELECT 1, CONVERT(nvarchar(300), SERVERPROPERTY('InstanceName')) WHERE SERVERPROPERTY('InstanceName') IS NOT NULL;INSERT #treffer SELECT 2, N'xp_cmdshell = 1' FROM sys.configurations WHERE name = N'xp_cmdshell' AND CONVERT(int, value_in_use) = 1 OPTION (MAXDOP 1);INSERT #treffer SELECT 3, name FROM master.sys.extended_procedures WHERE is_ms_shipped = 0 OPTION (MAXDOP 1);BEGIN TRY INSERT #treffer SELECT 4, path FROM sys.dm_os_buffer_pool_extension_configuration WHERE state <> 0 OPTION (MAXDOP 1);END TRY BEGIN CATCH UPDATE #pruefung SET hinweis = N'nicht lesbar: ' + ERROR_MESSAGE() WHERE nr = 4; END CATCH;INSERT #treffer SELECT 5, name + N' (' + provider + N')' FROM sys.servers WHERE is_linked = 1 AND NOT (product = N'SQL Server' OR provider LIKE N'SQLNCLI%' OR provider LIKE N'MSOLEDBSQL%' OR provider = N'SQLOLEDB') OPTION (MAXDOP 1);INSERT #treffer SELECT 6, N'Ad Hoc Distributed Queries = 1' FROM sys.configurations WHERE name = N'Ad Hoc Distributed Queries' AND CONVERT(int, value_in_use) = 1 OPTION (MAXDOP 1);INSERT #treffer SELECT 7, name FROM sys.server_principals WHERE type IN ('U', 'G') AND name NOT LIKE N'NT SERVICE\%' AND name NOT LIKE N'NT AUTHORITY\%' AND name NOT LIKE N'BUILTIN\%' OPTION (MAXDOP 1);INSERT #treffer SELECT 8, name + N' (' + connection_auth_desc + N')' FROM sys.database_mirroring_endpoints WHERE connection_auth_desc LIKE N'%NTLM%' OR connection_auth_desc LIKE N'%KERBEROS%' OR connection_auth_desc LIKE N'%NEGOTIATE%' OPTION (MAXDOP 1);INSERT #treffer SELECT 9, name FROM sys.cryptographic_providers OPTION (MAXDOP 1);INSERT #treffer SELECT 10, DB_NAME(database_id) FROM sys.database_mirroring WHERE mirroring_guid IS NOT NULL OPTION (MAXDOP 1);INSERT #treffer SELECT 14, name FROM sys.databases WHERE name = N'SSISDB' OPTION (MAXDOP 1);INSERT #treffer SELECT 15, name FROM sys.databases WHERE is_merge_published = 1 OPTION (MAXDOP 1);IF EXISTS (SELECT 1 FROM sys.all_columns WHERE object_id = OBJECT_ID(N'sys.databases') AND name = N'is_remote_data_archive_enabled') EXEC (N'INSERT #treffer SELECT 16, name FROM sys.databases WHERE is_remote_data_archive_enabled = 1 OPTION (MAXDOP 1);'); /* 2 · SQL Server Agent und Wartungspläne in msdb */BEGIN TRY INSERT #treffer SELECT 11, j.name + N' / ' + s.step_name + N' (' + s.subsystem + N')' FROM msdb.dbo.sysjobsteps AS s JOIN msdb.dbo.sysjobs AS j ON j.job_id = s.job_id WHERE s.subsystem IN (N'CmdExec', N'PowerShell', N'SSIS', N'ANALYSISQUERY', N'ANALYSISCOMMAND', N'QueueReader') OPTION (MAXDOP 1);END TRY BEGIN CATCH UPDATE #pruefung SET hinweis = N'nicht lesbar: ' + ERROR_MESSAGE() WHERE nr = 11; END CATCH;BEGIN TRY INSERT #treffer SELECT 12, name FROM msdb.dbo.sysalerts OPTION (MAXDOP 1);END TRY BEGIN CATCH UPDATE #pruefung SET hinweis = N'nicht lesbar: ' + ERROR_MESSAGE() WHERE nr = 12; END CATCH;BEGIN TRY INSERT #treffer SELECT 13, name FROM msdb.dbo.sysmaintplan_plans OPTION (MAXDOP 1);END TRY BEGIN CATCH UPDATE #pruefung SET hinweis = N'nicht lesbar: ' + ERROR_MESSAGE() WHERE nr = 13; END CATCH; /* 3 · Je Datenbank: FILESTREAM, FileTables, CLR, Secure Enclaves */DECLARE @db sysname, @sql nvarchar(max), @enklave bit = CASE WHEN EXISTS (SELECT 1 FROM sys.all_columns WHERE object_id = OBJECT_ID(N'sys.column_master_keys') AND name = N'allow_enclave_computations') THEN 1 ELSE 0 END;INSERT #db SELECT name, 0 FROM sys.databases WHERE database_id <> 2 OPTION (MAXDOP 1);DECLARE dbs CURSOR LOCAL FAST_FORWARD FOR SELECT name FROM sys.databases WHERE database_id <> 2 AND state = 0 AND HAS_DBACCESS(name) = 1;OPEN dbs; FETCH NEXT FROM dbs INTO @db;WHILE @@FETCH_STATUS = 0BEGIN SET @sql = N'USE ' + QUOTENAME(@db) + N'; INSERT #treffer SELECT 17, DB_NAME() + N'': '' + name FROM sys.database_files WHERE type = 2 OPTION (MAXDOP 1); INSERT #treffer SELECT 18, DB_NAME() + N'': '' + name FROM sys.tables WHERE is_filetable = 1 OPTION (MAXDOP 1); INSERT #treffer SELECT 19, DB_NAME() + N'': '' + name + N'' ('' + permission_set_desc + N'')'' FROM sys.assemblies WHERE is_user_defined = 1 AND permission_set > 1 OPTION (MAXDOP 1);' + CASE WHEN @enklave = 1 THEN N' INSERT #treffer SELECT 20, DB_NAME() + N'': '' + name FROM sys.column_master_keys WHERE allow_enclave_computations = 1 OPTION (MAXDOP 1);' ELSE N'' END; BEGIN TRY EXEC sys.sp_executesql @sql; UPDATE #db SET geprueft = 1 WHERE name = @db; END TRY BEGIN CATCH END CATCH; FETCH NEXT FROM dbs INTO @db;END;CLOSE dbs; DEALLOCATE dbs;UPDATE #pruefung SET hinweis = ISNULL(hinweis + N'; ', N'') + CONVERT(nvarchar(10), (SELECT COUNT(*) FROM #db WHERE geprueft = 1)) + N' Datenbanken geprüft' + ISNULL(N', nicht geprüft (offline oder kein Zugriff): ' + STUFF((SELECT N', ' + name FROM #db WHERE geprueft = 0 FOR XML PATH(''), TYPE).value('.', 'nvarchar(max)'), 1, 2, N''), N'')WHERE nr BETWEEN 17 AND 20; /* Ergebnis: Treffer zuerst, je Prüfung höchstens fünf Beispiele */SELECT p.nr, p.bereich, p.pruefung, COUNT(t.objekt) AS anzahl, CASE WHEN COUNT(t.objekt) = 0 THEN N'-' ELSE p.einordnung END AS einordnung, ISNULL(STUFF((SELECT TOP (5) N', ' + t2.objekt FROM #treffer AS t2 WHERE t2.nr = p.nr ORDER BY t2.objekt FOR XML PATH(''), TYPE).value('.', 'nvarchar(max)'), 1, 2, N''), N'') AS beispiele, ISNULL(p.hinweis, N'') AS hinweisFROM #pruefung AS p LEFT JOIN #treffer AS t ON t.nr = p.nrGROUP BY p.nr, p.bereich, p.pruefung, p.einordnung, p.hinweisORDER BY CASE WHEN COUNT(t.objekt) > 0 THEN 0 ELSE 1 END, p.nrOPTION (MAXDOP 1);Beispielausgabe
Aus dem Lab: SQL Server 2025 CU10 im Container, mit Testobjekten, ausgeführt mit den empfohlenen Mindestrechten. Die Spalte hinweis ist weggelassen, von den Zeilen ohne Treffer stehen nur die ersten drei hier:
nr bereich pruefung anzahl einordnung beispiele
-- ----------- --------------------------------------------------------- ------ ----------------- ------------------------------------------------
6 Instanz Ad Hoc Distributed Queries eingeschaltet 1 prüfen Ad Hoc Distributed Queries = 1
8 Sicherheit Endpunkte mit Windows-Authentifizierung 1 mit Aufwand lx_hadr (NEGOTIATE)
11 Agent Jobschritte CmdExec, PowerShell, SSIS, SSAS, Queue Reader 2 fehlt unter Linux lx_job / cmd (CmdExec), lx_job / ps (PowerShell)
12 Agent Warnungen (Alerts) 1 fehlt unter Linux lx_alert
20 Datenbanken Always Encrypted mit Secure Enclaves 1 fehlt unter Linux lx_app: lx_cmk
1 Instanz Benannte Instanz (Linux: eine Standardinstanz je Host) 0 -
2 Instanz xp_cmdshell eingeschaltet 0 -
3 Instanz Eigene Extended Stored Procedures 0 -
…So lesen Sie das: Die beiden Jobschritte und die Warnung müssen vor einem Umzug ersetzt werden, der Endpunkt braucht Zertifikate, und der Spaltenhauptschlüssel für Secure Enclaves zeigt, dass eine Datenbank Always Encrypted mit Enclaves nutzt, das unter Linux fehlt.
Bemerkenswert war im Lab, was SQL Server unter Linux beim Anlegen zulässt: Den CmdExec- und den PowerShell-Jobschritt, die Warnung und den Endpunkt mit Windows-Authentifizierung nahmen alle vier Versionen an. xp_cmdshell, FILESTREAM und einen Linked Server über ODBC lehnten sie dagegen sofort ab. Was sich anlegen lässt, funktioniert also nicht unbedingt, und ein Umzug per Skript kann solche Objekte stillschweigend mitnehmen.
Ein Ergebnis ohne Treffer heißt nicht, dass die Anwendung unter Linux läuft. Die Abfrage sieht nicht, was die Anwendung selbst tut, etwa Windows-Pfade im Code oder Windows-Anmeldungen der Clients. MSDTC, Managed Backup sowie Analysis und Reporting Services prüft sie nicht. Steht in der Spalte hinweis „unvollständig“ oder „nicht lesbar“, fehlen dem ausführenden Login Rechte.
Methode und Grenzen
Die Aussagen zu Lizenz, Plattformen, Funktionen, Support-Policy, Kubernetes und Hochverfügbarkeit stammen aus Microsoft Learn (gelesen am 11. und 12.11.2026). Die Funktionsliste haben wir für SQL Server 2022 und 2025 gelesen, nicht getrennt für 2017 und 2019. Die Prüfabfrage haben wir am 12.11.2026 auf SQL Server 2017 CU31, 2019 CU32, 2022 CU27 und 2025 CU10 in Linux-Containern geprüft: auf einer leeren Instanz, mit Testobjekten und mit drei Rechtestufen. Grenzen:
- Unter Windows, wo die Abfrage vor einem Umzug meist laufen wird, haben wir sie nicht ausgeführt. Sie liest nur Katalogsichten, die es dort ebenso gibt.
- Mehrere Prüfungen ließen sich unter Linux nicht mit echten Objekten auslösen, weil sich FILESTREAM, Merge-Replikation, Mirroring, benannte Instanzen oder Windows-Anmeldungen dort nicht anlegen lassen. Diese Zweige liefen nur ohne Treffer.
- Pacemaker, Active Directory und Kubernetes haben wir nicht im Lab aufgebaut. Ob angelegte, aber nicht unterstützte Objekte zur Laufzeit scheitern, haben wir nicht gemessen.
Weiterlesen
- Microsoft Learn: „Editions and supported features of SQL Server 2025 on Linux“, „SQL Server on Linux frequently asked questions“, „Support policy for SQL Server“ (Abschnitt zu Containern), „Deploy SQL Server Linux containers on Kubernetes with StatefulSets“.
- Microsoft Learn: „Availability groups for SQL Server on Linux“ und das Tutorial zur Active-Directory-Anmeldung für SQL Server on Linux.
- In dieser Reihe: Übersicht, Teil 3: Was im Container schiefgeht.
- Bei PSG: FCI vs. Availability Groups.
Vor der Entscheidung
Ein Umzug auf Linux ist selten ein reines Infrastrukturprojekt. Lassen Sie Abfrage 1 auf der heutigen Instanz laufen, klären Sie mit dem Hersteller der Anwendung die Freigabe und entscheiden Sie Hochverfügbarkeit und Anmeldung, bevor Sie Server bestellen. Diese Prüfung machen wir gern gemeinsam mit Ihnen, bevor es an Planung und Umzug geht.