hansdampf06
Goto Top

Migration von SQL Server auf MariaDB (oder MySQL)

Hallochen Gemeinde,

Ausgangspunkt ist eine Intranet-Webseite, die auf ASP.NET beruht und per IIS (als VM) gehostet wird. Die von der Webseite verwendeten Daten werden in einer MS-SQL-Server-Datenbank (als VM) vorgehalten. Der SQL Server läuft bereits seit mehreren Jahren als Linux-Version. Das SQL Server Management Studio ist auf einer Windows-VM installiert, so dass die Administration der Datenbank remote erfolgt.

Nunmehr soll die Datenbank nach MariaDB migriert werden. Diese Migration soll schritt-weise erfolgen, indem die relevanten Tabellen etc. sukzessive portiert werden. Die SQL-Server-Funktion „Linked Server“ bzw. „Externe Datenquelle“ soll dabei der naheliegende Ansatzpunkt sein, um über den SQL Server weiterhin auf die migrierten Tabellen etc. zuzugreifen und um dadurch die Webseite vorerst so weit wie möglich unangetastet zu lassen (deren Migration nach Linux ist ein späterer Schritt).

Ist jemand diesen Weg mit SQL Server (unter Linux) bereits gegangen und kann mir wertvolle Erfahrungswerte, Anregungen und Tipps geben, die unbedingt beachtet werden sollten?

Vielen Dank für Euren Input im Voraus und viele Grüße
HansDampf06

PS: Da MariaDB bekanntlich ein Fork von MySQL ist, erachte ich Informationen, die an-stelle von MariaDB auf MySQL abstellen, als gleichwertig und ebenso hilfreich.

Content-Key: 42558034074

Url: https://administrator.de/contentid/42558034074

Printed on: April 27, 2024 at 06:04 o'clock

Member: accessViolation
accessViolation Jan 09, 2024 at 17:52:29 (UTC)
Goto Top
Ist jemand diesen Weg mit SQL Server (unter Linux) bereits gegangen und kann mir wertvolle Erfahrungswerte, Anregungen und Tipps geben, die unbedingt beachtet werden sollten?

Schon eine ganze Weile her und kann mich nur noch dunkel daran erinnern.

Wir mussten unseren Code auf jeden Fall ändern, da mysql oder mariadb Probleme mit STRICT hatten. Ich weiß aber nicht mehr im Detail was da war. Vielleicht hilft es Dir ja (scheinst aus der Ecke zu kommen).

Gruß
Member: mbehrens
mbehrens Jan 09, 2024 at 19:24:39 (UTC)
Goto Top
Zitat von @HansDampf06:

Ausgangspunkt ist eine Intranet-Webseite, die auf ASP.NET beruht und per IIS (als VM) gehostet wird.

Das ist aber etwas sehr allgemein. Gibt es überhaupt einen Connector für das verwenete .NET Framework?

Wird schon ein DAL verwendet? Dann könnte man die Zugriffsschicht einfach tauschen.
Member: opsec2022
opsec2022 Jan 09, 2024 updated at 20:57:40 (UTC)
Goto Top
Hallo,

ASP.NET
MS-SQL-Server-Datenbank

welche Version und wie wird auf die Datenbank zugegriffen? Mit EF Core habe ich im Dev mit dem Connector von MySQL einfach das Schema auf die MariaDB migriert und einen Export eingespielt, dort dann getestet und mergen.

Gruß
Member: HansDampf06
HansDampf06 Jan 09, 2024 at 21:59:01 (UTC)
Goto Top
Zitat von @mbehrens:
Zitat von @HansDampf06:
Ausgangspunkt ist eine Intranet-Webseite, die auf ASP.NET beruht und per IIS (als VM) gehostet wird.
Das ist aber etwas sehr allgemein. Gibt es überhaupt einen Connector für das verwenete .NET Framework?
Es geht hier nicht um die Webseite und deren DB-Anbindung, sondern einzig und allein darum, die nach MariaDB migrierten Tabellen etc. während der Migrationsphase weiterhin für den SQL-Server verfügbar zu halten. Hierbei interessieren mich die datenbanktechnischen Aspekte dieses Migrationsweges. Beispielsweise solche Hinweise wie der auf Probleme mit STRICT stehen für mich im Fokus.
Die Erwähnung der Webseite diente hingegen nur der kursorischen Beschreibung der Anwendungssituation, weshalb diese Beschreibung aus meiner Sicht auch so allgemein bleiben kann. Darauf hatte ich auch explizit hingewiesen:
um dadurch die Webseite vorerst so weit wie möglich unangetastet zu lassen (deren Migration nach Linux ist ein späterer Schritt).

Dann könnte man die Zugriffsschicht einfach tauschen.
Ja so in etwa wird/soll das am Ende sein, dass vereinfacht ausgedrückt nach der Migration der Datenbank "nur" die Zugriffsschicht von SQL Server auf MariaDB gewechselt wird.


Zitat von @opsec2022:
MS-SQL-Server-Datenbank
welche Version
Datenbank = SQL Server for Linux 2019 (Version 15.0.4343)

Mit EF Core habe ich im Dev mit dem Connector von MySQL einfach das Schema auf die MariaDB migriert und einen Export eingespielt, dort dann getestet und mergen.
Das würde doch aber laut der Übersichtsbeschreibung von EF Core bei Microsoft bedeuten, ich müsste auf der Ebene von ASP.NET bzw. der Webseite agieren. Und nach meinem Verständnis wird das eher nicht wirklich bei der Migration der Datenbank helfen, weil ein erheblicher Teil der Daten-Logik in der Datenbank selbst, unter anderem über Computed Column und Gespeicherte Prozeduren abgebildet ist. Gerade diese Daten-Logik soll ebenfalls zu MariaDB migriert werden. Immerhin hat MariaDB äquivalente Datenbankfunktionen implementiert.

Was könnte zudem EF Core, was nicht (viel zielgenauer) mit DBeaver möglich wäre? Immerhin sind für die Datenbankobjekte entweder explizite SQL-Script-Dateien vorhanden oder die SQL-Scripte können im SQL Studio ganz einfach generiert werden. Diese SQL-Scripte auf MariaDB anzupassen und dann für die Migration einzusetzen, dürfte doch naheliegender sein, oder? Hierbei darf nicht übersehen werden, dass in DBeaver gleichsam wie bisher in SQL Studio die SQL-Scripte relative einfach getestet werden können. Gerade bei gespeicherten Prozeduren ist das äußerst hilfreich.

Viele Grüße
HansDampf06
Member: mbehrens
mbehrens Jan 09, 2024 at 23:00:31 (UTC)
Goto Top
Zitat von @HansDampf06:

Das würde doch aber laut der Übersichtsbeschreibung von EF Core bei Microsoft bedeuten, ich müsste auf der Ebene von ASP.NET bzw. der Webseite agieren.

Ja, als DAL läge der Ansatz genau hier.

Und nach meinem Verständnis wird das eher nicht wirklich bei der Migration der Datenbank helfen, weil ein erheblicher Teil der Daten-Logik in der Datenbank selbst, unter anderem über Computed Column und Gespeicherte Prozeduren abgebildet ist. Gerade diese Daten-Logik soll ebenfalls zu MariaDB migriert werden. Immerhin hat MariaDB äquivalente Datenbankfunktionen implementiert.

Da die Business Logic dann ja in der DB liegt, scheidet die Änderung der Datenzugriffschicht innerhalb eines DAL dann aus. Es bleibt dann sicherlich nur die manuelle Migration. Linked Server lesen sich, gerade unter Linux, etwas abenteuerlich.

Was könnte zudem EF Core, was nicht (viel zielgenauer) mit DBeaver möglich wäre?

Nichts, da der Ansatz ja ein grundsätzlich anderer ist und somit auch die Business Logic an anderer Stelle liegt. Die Ansätze sind fundamental unterschiedlich. Damit jetzt noch anzufangen, halte ich für keine gute Idee.

Immerhin sind für die Datenbankobjekte entweder explizite SQL-Script-Dateien vorhanden oder die SQL-Scripte können im SQL Studio ganz einfach generiert werden. Diese SQL-Scripte auf MariaDB anzupassen und dann für die Migration einzusetzen, dürfte doch naheliegender sein, oder?

Für mich sieht das so aus.
Member: ukulele-7
ukulele-7 Jan 10, 2024 at 08:01:53 (UTC)
Goto Top
Darf man fragen warum MariaDB und nicht PostgreSQL? Erfahrung mit einer Migration kann ich für beide nicht anbieten aber ich halte PGSQL für potenter.

Ich nutze auch sehr viel Logik innerhalb von MSSQL, die kann man sicherlich nachbauen, dauert halt. Da du die DB unter Linux laufen hast greifst du vermutlich nicht aus der DB auf die CMD oder das Dateisystem zu oder dergleichen? Das wäre eventuell schwierig.

Linked Server sind von der Idee her ganz nett aber auch eine Bitch. Selbst zwischen MSSQL Servern kann das zu Problemen bei der Performance führen und, wenn ich mich recht erinnere, sollte man die eher lesend als schreibend benutzen. Die Umstellung Schrittweise zu machen könnte daher in sehr viel Arbeit ausarten. Wie wäre es, die Business Logik nachzubauen, die Daten einmal 1:1 zu kopieren (Kopierscripte anlegen) und dann mit der Anwendung jeden Schreibvorgang in der DB parallel in MSSQL und der Ziel-DB zu machen? Man kann dann später die Daten abgleichen und Notfalls noch mal von Vorne starten bis alles identisch ist.
Member: NordicMike
NordicMike Jan 10, 2024 at 08:22:12 (UTC)
Goto Top
Darf man fragen warum
Wie immer wird es an den Vorgaben oder Empfehlungen des Programmierers liegen ;)
Member: opsec2022
opsec2022 Jan 10, 2024 updated at 11:08:51 (UTC)
Goto Top
Hallo,

hilft alles wenig ohne mehr über die Anwendung und Art der Anbindung zu wissen.

Es geht hier nicht um die Webseite und deren DB-Anbindung

Doch irgendwie schon, Statements mit dem SqlClient und SqlCommands abzusetzen ist etwas ganz anderes als das agieren über ein ORM mit Datenbanktreiber. Für ersteres müsstest du z.B. die Bibliothek tauschen und wahrscheinlich sowieso den Code anpassen. In Raw Queries dann z.B. TOP durch LIMIT ersetzen und sonstige Syntaxunterschiede nachziehen. Je nach dem wie Anbindung und Integration aussehen, muss auch vorgegangen werden, da es je nach Szenario eben ggf. nicht genügt das Schema und die Daten zu migrieren.

während der Migrationsphase weiterhin für den SQL-Server verfügbar zu halten.

Die Applikation läuft - ob ORM oder nicht - im Prod weiter. Wenn diese einen Datenbankkontext und entsprechende Modellklassen hat, kannst du die einfach ins Dev o.ä. ziehen. Auch wenn nicht kannst du sie über einen Database-First Ansatz bzw. dbscaffold generieren lassen. Wenn du jetzt im Dev den EF Core Datenbanktreiber von MSSQL auf MySQL wechselst, und eine Migration ausführst, hast du auf der MariaDB das Schema.

Auch ohne ORM kannst du das in der Entwicklungsumgebung genau so - eben ohne Scaffold oder Migration testen.

Hierbei interessieren mich die datenbanktechnischen Aspekte dieses Migrationsweges

Datenmigration über die MySQL Workbench. Für mich stellt sich aber davor die Frage der Anbindung / Integration.

Probleme mit STRICT

stören mich mit ORM nicht, da Fehler abgefangen werden.

über Computed Column und Gespeicherte Prozeduren abgebildet ist. Gerade diese Daten-Logik soll ebenfalls zu MariaDB migriert werden. Immerhin hat MariaDB äquivalente Datenbankfunktionen implementiert.

Hatte ich noch nicht, kommt auch auf die Bibliotheksversion an, diese sollten aber mit ORM sowohl beim Database-First als auch beim Migrieren berücksichtigt und im ModelBuilder sowie den Klassen mit entsprechenden Attributen erstellt werden. Bei der Migration mit MySQL Workbench bin ich mir nicht sicher

Was könnte zudem EF Core, was nicht (viel zielgenauer) mit DBeaver möglich wäre? Immerhin sind für die Datenbankobjekte entweder explizite SQL-Script-Dateien vorhanden oder die SQL-Scripte können im SQL Studio ganz einfach generiert werden. Diese SQL-Scripte auf MariaDB anzupassen und dann für die Migration einzusetzen, dürfte doch naheliegender sein, oder? Hierbei darf nicht übersehen werden, dass in DBeaver gleichsam wie bisher in SQL Studio die SQL-Scripte relative einfach getestet werden können. Gerade bei gespeicherten Prozeduren ist das äußerst hilfreich.

Verstehe ich nicht ganz. EF Core ist eine ORM-Library und DBeaver eine Art DBMS. Inwiefern das in Frage kommt , kommt wieder auf die Anwendung an, aber du schlägst die Brücke zwischen Datenbank und Code, du integrierst die Datenbank in die objektorientierte Programmierung.

Datenbanktabellen werden im Database-First Ansatz aus einer bestehenden Datenbank automatisch in Klassen und deren Columns in Properties übersetzt. Andersherum kannst du die Klassen im Code-First Ansatz auch einfach anpassen und dann Änderungen aus deinem Code auf die Datenbank migrieren, ohne SQL-Skripte schreiben zu müssen.

Statements kannst du in LINQ o.ä. schreiben kannst und diese sind dann Datenbankunabhängig, weil die Übersetzung vom Datenbanktreiber übernommen wird. Besonders interessant waren für mich das DbContextPooling und das Cachen der Abfragen.

Gruß
Member: HansDampf06
HansDampf06 Jan 10, 2024 at 13:47:18 (UTC)
Goto Top
Zitat von @ambehrens:
Linked Server lesen sich, gerade unter Linux, etwas abenteuerlich.
Je nachdem wie man es nimmt. Augenscheinlich unterstützt die Linux-Version per SQL Studio das nur für einen anderen SQL Server als Datenquelle nativ. Jedoch kann per T-SQL ein solcher Linked Server auf MariaDB erstellt werden. Hier zeigt sich wieder einmal die Halbherzigkeit von Microsoft

Aktuell liegt das Problem eher darin, dass auf der Linux-Ebene der ODBC-Treiber von MariaDB zwar laut Beschreibung auf mariadb.com installiert und konfiguriert wurde, aber an der Linux-Konsole isql keine Verbindung aufbauen kann. Sobald dieses Problem überwunden ist, gibt aus meiner Sicht keinen wirklichen Grund, eine Linked-Server-Verbindung unter Linux als abenteuerlich zu bewerten. Es funktioniert ja dann wie technisch vorgesehen und ist keine krude Bastelei. Ein solche Verknüpfung von unterschiedlichen Datenquellen ist ja auch ein ganz normales Szenario.

Auch der Hinweis von @ukulele-7 auf mögliche Performanceprobleme erscheint mir nicht als tauglicher Grund für eine Abenteuerlichkeit, sondern liegt nach meinem Verständnis schlicht in der Natur der Sache. Denn eine solche Datenverbindung kann niemals so performant sein wie der Zugriff auf von SQL Server direkt gehostete Datenbankobjekte. Der Fernzugriff auf die andere Datenquelle muss immer zwingend mit Leistungseinbußen einhergehen, auch wenn sie nicht unbedingt spürbar werden müssen.

Oder was ist für Dich der Grund, dies als abenteuerlich einzuschätzen?

Nichts, da der Ansatz … fundamental unterschiedlich. Damit jetzt noch anzufangen, halte ich für keine gute Idee.
Darin stimmen wir überein.
Für mich sieht das so aus.
Bestens, dann stimmen wir auch hierin überein.

Zitat von @ukulele-7:
Darf man fragen warum MariaDB und nicht PostgreSQL?
Die Frage ist gar nicht so einfach zu beantworten, weil jedes Datenbanksystem seine Vor- und Nachteile hat – irgendwann muss man sich entscheiden. Die drei wichtigsten Entscheidungskriterien waren, dass erstens bereits praktisches Wissen / Erfahrung mit MySQL vorhanden ist. Zweitens ergab sich aus unterschiedlichen Vergleichsbewertungen von Dritten die eigene Einschätzung, dass der Fork MariaDB die zukunftsträchtigere Variante gegenüber MySQL zu sein scheint. Drittens soll der Wechsel des Datenbanksystems nicht vom „Regen in die Traufe“ führen, weil Oracle hier ähnlich destruktiv wie Microsoft eingeschätzt wird; unter anderem deswegen werden ja die Microsoft-Produkte so weit wie möglich ersetzt.

Ich nutze auch sehr viel Logik innerhalb von MSSQL, die kann man sicherlich nachbauen, dauert halt. Da du die DB unter Linux laufen hast greifst du vermutlich nicht aus der DB auf die CMD oder das Dateisystem zu oder dergleichen? Das wäre eventuell schwierig.
Nein, in Bezug auf Daten derzeit nicht. Ein Dateizugriff erfolgt bisher über die Logik der Webseite. Insoweit bezieht sich die Migration ausschließlich auf die Datenbank als solche.
Die SQL-Server-internen Wartungsfunktionen für die Datenbank, z.B. Backup und Indexpflege werden über die Steuerungslogik der Webseite mittels Backgroundworkern durch den dynamischen Aufruf von gespeicherten Prozeduren angestoßen. Die Backup-Dateien werden in der Verzeichnisstruktur der Datenbank in einem dedizierten Verzeichnis abgelegt. Gewiss werden diese Wartungsfunktionen eher nicht ohne weiteres übernehmbar sein, sondern wohl von Grund auf neu erstellt werden müssen. Aber das ist in Ordnung.

Linked Server sind von der Idee her ganz nett aber auch eine Bitch. Selbst zwischen MSSQL Servern kann das zu Problemen bei der Performance führen und, wenn ich mich recht erinnere, sollte man die eher lesend als schreibend benutzen. Die Umstellung Schrittweise zu machen könnte daher in sehr viel Arbeit ausarten.
Der eigentliche Gedanke ist, immer blockweise vorzugehen. Es werden zunächst die Tabellen migriert, die einen engeren thematischen Zusammenhang haben. Das wird zwangsläufig zur Anpassung der zugehörigen Sichten, Funktionen und Prozeduren auf dem SQL-Server führen (müssen), sofern deren gleichzeitige Migration nicht sinnvoller ist. Ist ein solcher Block abgeschlossen, muss in der Webseite lediglich das/die entsprechende(n) SQL-Statement(s) auf MariaDB angepasst werden. Das hält insgesamt den Arbeitsaufwand auf dem geringst möglichen, unumgänglichen Maß.

Ursprünglich war die Webseite mit einer Access-Datenbank gestartet und wurde dann auf SQL-Server umgestellt. Diese Umstellung war damals äußerst arbeitsintensiv, weil sich die gesamte Daten-Logik bei der Webseite befand – hierin wurde damals ein erhebliches Ärgernis gesehen. Die Überführung der Daten-Logik nach SQL Server war abermals erheblich arbeitsintensiv, aber führte zu einer spürbaren Leistungssteigerung. Daneben wurde die Voraussetzung geschaffen, dass die Daten-Logik für die Webseite weitestgehend transparent ist und die Migration der Webseite von IIS nach Linux (Apache / Nginx) nicht unbedingt an das Mono-Projekt gebunden ist. Zugleich wird so eine schrittweise Migration der Webseite wesentlich einfacher machbar sein.

Warum schrittweise? Eine 1:1-Hauruck-Umstellung hat den ganz großen Nachteil, dass in der Tat alles auf einmal und sofort erfolgen muss. Dass ist hier schon von den vorhandenen Ressourcen her nicht darstellbar. Außerdem müssen dann auch etwaige unerwartete Probleme sofort behoben werden. Sollte das nicht sofort gelingen, wäre das ebenfalls nicht vertretbar. Demgegenüber hat die schrittweise Umstellung den Vorteil, dass bei etwaigen nicht sofort lösbaren Problemen der problematischen Migrationsschritt einfach rückgängig gemacht werden kann. Die Webseite mit ihrem Zugriff auf den SQL Server funktioniert ja dann immer noch wie zuvor.

Aber vielleicht komme ich auch zu der Erkenntnis, dass die Umstellung der Datenbank nur in einer 1:1-Hauruck-Aktion vernünftig machbar ist. Das wird vor allem davon abhängen, was über die Linked-Server-Verbindung überhaupt unterstützt wird und was sinnvoll funktioniert. Das betrifft vor allem die gespeicherten Prozeduren und Funktionen. Hier stehe ich ja erst am Anfang des Vorhabens. Deswegen hast Du mit:
Wie wäre es, die Business Logik nachzubauen, die Daten einmal 1:1 zu kopieren (Kopierscripte anlegen) und dann mit der Anwendung jeden Schreibvorgang in der DB parallel in MSSQL und der Ziel-DB zu machen? Man kann dann später die Daten abgleichen und Notfalls noch mal von Vorne starten bis alles identisch ist.
völlig Recht. So ähnlich war das damals gelaufen: Zuerst mit einem Übertragungsassistenten von Access nach SQL Server die Tabellen und Abfragen übertragen. In der Webseite wurde ein parallel möglicher Datenbankzugriff eingerichtet. Der Erinnerung nach gab es noch eine direkte Datenverbindung von Access auf SQL Server vergleichbar mit dem Linked Server, um die Datenkonsistenz und -eindeutigkeit sicherzustellen. Sodann konnten in der Webseite die SQL-Statements auf die Syntax des SQL Servers und den Zugriff auf den SQL Server nacheinander umgestellt werden.

Viele Grüße
HansDampf06

PS: Ein alternativer Gedanke wäre, die Datenverbindung nicht vom SQL Server aus auf MariaDB zu erstellen, sondern umgekehrt von MariaDB aus. Das könnte mir vielleicht sogar besser gefallen, weil dann der SQL Server, sofern er nicht direkt von der Webseite angesprochen wird, eigentlich nur noch lesend zur Verfügung stehen müsste. Die neuen Daten werden dann ja schon in MariaDB gespeichert. Eine nähere Betrachtung ist das in jedem Fall wert.
Member: HansDampf06
HansDampf06 Jan 10, 2024 at 14:13:44 (UTC)
Goto Top
@opsec2022
Besten Dank für Deine vielfältigen Anregungen in Deinem letzten Kommentar. Diese werde ich gewiss näher berücksichtigen, wenn es der Webseite migrationsmäßig "an den Kragen geht". Jedoch muss ich das Vorgehen abschichten. Und der Schwerpunkt liegt zunächst auf der Datenbank.

Nur so viel an dieser Stelle: Du beschreibst verschiedene Techniken, wie seitens einer Webseite mit einer Datenbank umgegangen werden kann. Welche Technik gewählt wird, hängt zu einem großen Teil davon ab, wo welche Schwerpunkte der Daten-Logik liegen. Liegen diese wie ursprünglich bei der Webseite, stellt sich die Datenbank letztlich im Kern nur noch als das Vorhalten der Tabellen dar. Ist die Daten-Logik hingegen in die Datenbank integriert, so können dort alle Möglichkeiten eines modernen Datenbanksystems gehoben werden, was insbesondere der Leistung zugutekommen dürfte – z.B. das Wirken des Abfrageoptimierers. Freilich ist auch eine Mischform dazwischen möglich. Nach dem Wechsel von Access auf SQL Server ist damals die Entscheidung getroffen worden, die Daten-Logik gehört in die Datenbank und das wird wohl auch beibehalten werden. Denn die Webseite greift auf die Datenbank transparent zu.
Je nach Technikansatz besteht der Vorteil dieser Transparenz darin, dass sich der Programmieraufwand für die Webseite letztlich auf simple SQL-Statements mit einem Prozeduraufruf und Parameterübergabe beschränkt. Ist der Zugriff derart minimalistisch reduziert, dürften die Unterschiede zwischen den Techniken gegen Null tendieren. Dennoch wird bei der späteren Migration der Webseite zu prüfen sein, welche der Techniken den Vorzug verdient. Immerhin kommt es auch dabei auf die bestmögliche Leistung für einen schnellen Seitenaufbau an.

Viele Grüße
HansDampf06
Member: HansDampf06
HansDampf06 Jan 10, 2024 updated at 16:11:41 (UTC)
Goto Top
@ukulele-7:
Ich will doch noch einmal nachfragen, weil insoweit noch nichts in Stein gemeißelt ist:
Was wären für Dich die relevanten Aspekte, PostgreSQL gegenüber MariaDB(/MySQL) vorzuziehen?

Viele Grüße
HansDampf06

EDIT:
Dieser Vergleich macht plastisch deutlich, wie schwer es ist, eine Entscheidung zwischen PostgreSQL und MariaDB zu treffen. Gerade der Kostenaspekt, nämlich dass bestimmte Vorkenntnisse bereits vorhanden sind, dürfte wie geschehen das "Zünglein an der Waage" sein. Gleichwohl legt dieser Vergleich nahe, schlicht mit einem der beiden Datenbanksysteme bei der Migration zu beginnen. Sollten die dabei entstehenden Probleme als sehr groß einzuschätzen sein oder die Erwartungen nicht wie gewünscht erfüllt werden, kann eine Konkurrenzinstallation mit dem anderen System und ein konkreter Vergleich erfolgen. Vor allem dann wird sich das avisierte schrittweise Vorgehen als äußerst effektiv erweisen.
Member: HansDampf06
HansDampf06 Jan 10, 2024 updated at 18:18:37 (UTC)
Goto Top
Hinsichtlich des OBDC-Treiberproblems bin ich einen Schritt weiter. Ausweislich dieser und dieser Webseite kocht Microsoft wieder einmal sein eigenes Süppchen und bringt einen eigenen unixODBC-Treibermanager mit. Dann wundert es mich nicht, wenn der MariaDB-ODBC-Treiber trotz korrekter Installation nicht funktionieren will.

Zum SQL-Server-ODBC-Treiber von Microsoft gibt es wohl FreeTDS als Alternative. Mal sehen, ob es dann auch parallel mit MariaDB über ODBC klappt.

EDIT:
Das Problem ist beseitigt. Für MariaDB wurde zunächst der ODBC-Treiber Version 3.1.20 von mariadb.com heruntergeladen und installiert. Indes fehlten dieser Version mehrere Abhängigkeiten. Bei der Lösungssuche bin ich darauf gestoßen, dass es im offiziellen Ubuntu-20.04-Repository das Paket odbc-mariadb gibt, welches die Version 3.1.4 hat. Nachdem dieses Paket installiert worden ist, klappte es auch parallel zum Microsoft-ODBC17-Treiber mit dem parallelen Zugriff durch isql.

Viele Grüße
HansDampf06
Member: HansDampf06
HansDampf06 Jan 11, 2024 at 08:08:42 (UTC)
Goto Top
Folgende Erkenntnis, die die bereits mitgeteilte Aussage von dritter Seite bestätigt:
Bei der Linux-Version von SQL Server ist eine Linked-Server-Verbindung nur zu einem anderen SQL Server möglich. Der von dritter Seite vorgeschlagene Provider SQLNCLI lässt nichts anderes zu. Wird ein anderer Provider wie in odbcinst.ini hinterlegt verwendet, gibt es eine Fehlermeldung, die auf die Ausschließlichkeit für diese Linux-Version hinweist.

Somit ist die Funktion Linked Server in der Linux-Version nicht abenteuerlich, sondern vielmehr schlicht unmöglich, soweit es andere Datenbankquellen betrifft als SQL Server.

Hierdurch ist die Entscheidung über den einzuschlagenden Migrationspfad von Microsoft für die Linux-Version vorentschieden worden. Und zwar erfolgt die Migration aus MariaDB heraus, indem über die CONNECT Engine auf die von SQL Server gehaltenen Daten zugegriffen wird. Ohnehin soll wohl die CONNECT Engine einige Vorteile gegenüber der Funktion Linked Server bieten, wie ich verschiedentlich gelesen habe.

Es wird dadurch jetzt neu zu überlegen sein, in welchen konkreten Schritten die Migration der Datenbankobjekte zu verwirklichen ist.

Viele Grüße
HansDampf06
Member: ukulele-7
ukulele-7 Jan 11, 2024 at 08:33:54 (UTC)
Goto Top
Zitat von @HansDampf06:

Auch der Hinweis von @ukulele-7 auf mögliche Performanceprobleme erscheint mir nicht als tauglicher Grund für eine Abenteuerlichkeit, sondern liegt nach meinem Verständnis schlicht in der Natur der Sache. Denn eine solche Datenverbindung kann niemals so performant sein wie der Zugriff auf von SQL Server direkt gehostete Datenbankobjekte. Der Fernzugriff auf die andere Datenquelle muss immer zwingend mit Leistungseinbußen einhergehen, auch wenn sie nicht unbedingt spürbar werden müssen.
Jein. Meine Erfahrungen sind hier zugegeben begrenzt aber ich hatte neulich ein Bastelprojekt. Ich habe Daten in zwei Fremdsystemen (MSSQL), in einem bin ich nur lesend berechtigt, sehr eingeschränkt. Ich will diese Daten auswerten und, weil es um Zeiterfassung geht, das eigentlich möglichst live tun. Daher hatte ich recht komplexe Abfragen gebaut die mir das Wunschergebnis liefern aber leider atemberaubend langsam sind.

Ich habe also ein bisschen gegraben auch wenn ich jetzt nicht oft Performance Analyse mache. Lange Rede kurzer Sinn: Der Optimizer auf dem Quell-System macht irgendetwas anders über ODBC im Vergleich zu lokal. Was genau habe ich nicht abschließen heraus gefunden oder verstanden.
https://www.datenbankforum.com/threads/performance-totalausfall-durch-fi ...

Mein Fazit daher: Wenn Linked Server läuft ist es, abgesehen vom Netzwerk dazwischen, eben nicht das Gleiche, auch nicht zwischen zwei MSSQL Servern.

Darüber hinaus fallen mir auch weitere Einschränkungen je länger ich nachdenke: XML Spalten z.B..

Zitat von @ukulele-7:
Darf man fragen warum MariaDB und nicht PostgreSQL?
Die Frage ist gar nicht so einfach zu beantworten, weil jedes Datenbanksystem seine Vor- und Nachteile hat – irgendwann muss man sich entscheiden. Die drei wichtigsten Entscheidungskriterien waren, dass erstens bereits praktisches Wissen / Erfahrung mit MySQL vorhanden ist. Zweitens ergab sich aus unterschiedlichen Vergleichsbewertungen von Dritten die eigene Einschätzung, dass der Fork MariaDB die zukunftsträchtigere Variante gegenüber MySQL zu sein scheint. Drittens soll der Wechsel des Datenbanksystems nicht vom „Regen in die Traufe“ führen, weil Oracle hier ähnlich destruktiv wie Microsoft eingeschätzt wird; unter anderem deswegen werden ja die Microsoft-Produkte so weit wie möglich ersetzt.
Also das MySQL keine gute Wahl wäre darin sind wir uns wohl einig. MariaDB scheint mir ganz brauchbar, daher will ich das keinem ausreden nachher bin ich Schuld face-smile MySQL und MariaDB haben einen starken Vorteil: Sie werden im Web bei sehr vielen Systemen bereits eingesetzt, also klassische CMS für Webseiten und so, daher gehe ich mal davon aus das hier viele Leute damit gut fahren weil es einfach viel Knowhow dazu gibt.

Jetzt habe ich bei dir nicht den Eindruck das deine Webseite aus irgendeinem Baukasten CMS kommt, sonst wärst du wohl auch nicht bei MSSQL gelandet. Daher würde ich sagen hast du eine recht freie Wahl. Wenn du mit MariaDB zurecht kommst, wirst du vermutlich auch mit Postgres zurecht kommen, meine Vermutung. Am Ende wird beides vermutlich klappen.

Ich selbst habe wenig Postgres Erfahrung (nutze MSSQL), habe aber generell den Eindruck das MariaDB eher als Ersatz für MySQL entwickelt wird. Postgres hingegen scheint mir am ambitioniertesten, wirklich was neues entwickeln zu wollen was besser funktioniert. Das ist meine subjektive Einschätzung als Außenstehender (weil MSSQL),.
Member: HansDampf06
HansDampf06 Jan 11, 2024 at 10:47:46 (UTC)
Goto Top
@ukulele-7:
Besten Dank für Deine ausführliche Antwort.

Du hast Recht, die Webseite ist kein Baukastenableger, sondern eine gewachsene Eigenentwicklung. Schon immer ging es um die Datenbank - die Webseite war von Anfang an "nur" als plattformunabhängige Bedienungsoberfläche für diese Datenbank gedacht. Deswegen wurde nach dem ersten Datenbankwechsel die Daten-Logik schließlich in die Datenbank verlagert, weil das mittels der gespeicherten Prozeduren und Funktionen überhaupt erst möglich wurde. Zugleich ist das der Grund, warum die Daten-Logik aus heutiger Sicht auch in Zukunft in der Datenbank verbleiben wird.

Hinsichtlich der von Dir verlinkten Forumsdiskussion kann ich Dir noch (m)einen Erfahrungstipp geben, den ich Dir per PN sende.

Viele Grüße
HansDampf06
Member: HansDampf06
HansDampf06 Jan 12, 2024 at 09:07:22 (UTC)
Goto Top
Ein kurzes Update:
Der Zugriff von MariaDB auf den SQL Server über die CONNECT Engine klappt seit vorgestern Abend bestens. Es muss nach meinem aktuellen Kenntnisstand für jede Tabelle des SQL Servers eine Tabelle bei MariaDB deklariert werden, die eine Art Platzhalter für den Remotezugriff darstellt. Entweder lässt man dabei die Spalten automatisch übernehmen oder gibt sie explizit an. Bei letzterem kann dann sogar ein Primärindex mit angelegt werden. Ebenso dürften im Nachhinein noch Indizes zu diesen Platzhaltertabellen hinzugefügt werden können.

Weil beide Datenbanken auf der selben VM installiert sind, ist der Datenaustausch augenscheinlich außerordentlich schnell.

DBeaver scheint daneben nicht nur für MariaDB, sondern auch für SQL Server ein brauchbares Instrument zu sein (anstelle von SQL Studio). Jedenfalls kann so die unvermeidliche Handarbeit der Migration in einer Oberfläche bei gleichzeitigem Zugriff auf beide Datenbanken erfolgen. Auf diese Art und Weise können die bei DBeaver als DDL bezeichneten SQL-Scripte für die zu migrierenden Datenbankobjekte jeweils entnommen und gleich bei der Erstellung des neuen künftigen migrierten Objekts in MariaDB weiterverwendet werden. Freilich muss vor dem Speichern des migrierten Objekts die Scriptsyntax noch überarbeitet werden.

Die Hauptlast der Handarbeit für die Migration wird sowieso in der Syntaxanpassung und dem Ausgleich von in SQL Server genutzten, aber in MariaDB fehlenden Funktionalitäten liegen. So kennt MariaDB beispielsweise keine zur Laufzeit deklarierten Tabellenvariablen, sondern nur temporäre Tabellen, die obendrein auch noch eine sitzungsbezogene Lebenszeit haben und keine bloß prozedurbezogene Lebenszeit. Also müssen auch die bisherigen konzeptionellen Ansätze überdacht werden, damit während der Laufzeit bei einem mehrfachen parallelen Aufruf von Prozeduren etc. keine wechselseitigen Behinderungen und Datenverfälschungen entstehen ...

Viele Grüße
HansDampf06
Member: HansDampf06
HansDampf06 Jan 17, 2024 at 19:39:19 (UTC)
Goto Top
Ein neues kurzes Update:
Der erste Block der alten Datenbank, zu dem sechs Tabellen und drei gespeicherte Prozeduren gehören, ist migriert. Das heißt, es sind die Verknüpfungen für die einzelnen Tabellen zur alten Datenbank eingerichtet, die sechs Tabellen in der neuen Datenbank angelegt und die gespeicherten Prozeduren syntaktisch umgeschrieben. Somit könnte die neue Datenbank mit diesem Block theoretisch der Webseite im vollen Umfang zur Verfügung stehen. Hierfür fehlt aber noch die Etablierung der entsprechenden Connection auf die neue Datenbank in der Webseite und die dortige Anpassung des jeweiligen Datenzugriffs auf diese neue Connection.

Bevor der Zugriff durch die Webseite überhaupt losgehen kann, müssen ersteinmal die Daten zwischen den Datenbanken transferiert werden. Dabei zeigt sich, dass die Verknüpfung von der neuen zur alten Datenbank durchaus keinen Leistungspreis gewinnen wird. Während beispielsweise die Abfrage der Anzahl der Datensätze einer Tabelle sowohl in der einen als auch in der anderen Datenbank relativ flott geschieht, benötigt die Abfrage über die Verknüpfung doch einiges mehr an Zeit. Das wird insbesondere bei der einen Tabelle relevant, die aktuell immerhin knapp 72,5 Mio Datensätze hat ...
Außerdem werden nach dem Datentransfer noch die logische Fehlerfreiheit und die Ergebnisgleichheit der umgeschriebenen Prozeduren zu testen sein, bevor dieser Block produktiv nutzbar wird.

Ein erstes Credo der bisherigen Migration: Es ist wegen der unumgänglichen Handarbeit teilweise sehr mühselig. Die kleinen Syntaxunterschiede sind teilweise eigentlich nur kosmetisch, aber dennoch zwingend und nervig. Zudem sind die Fehlermeldungen der neuen Datenbank, dass ein Syntaxfehler vorliegt, durchgehend wenig hilfreich - hier scheint SQL Server doch komfortabler zu sein. Also ist viel zu googeln, um sich die neue Syntax und deren Eigenheiten umfassend zu erschließen. Natürlich ist mit fortschreitendem Kenntnis- und Erfahrungsschatz eine Beschleunigung gut spürbar. Auch kristallieren sich erste neue Lösungsmuster heraus, die konstante Arbeitsergebnisse sicherstellen ...

Relevante Themen sind unter anderem:
(1.) Wie bereits erwähnt keine Tabellenvariablen möglich, so dass mit temporären Tabellen gearbeitet werden muss.
(2.) Sind wohl nicht alle bei SQL Server eingebauten Funktionen unter MariaDB verfügbar, so dass diese als gespeicherte Funktion / Prozedure selbst erstellt werden müssen. Hier müssen konzeptionelle Überlegungen auf lange Sicht angestellt werden.

Viele Grüße
HansDampf06
Member: HansDampf06
HansDampf06 Jan 26, 2024 at 13:08:16 (UTC)
Goto Top
So, meine Lieben!

Der zweite Migrationsschritt ist insoweit vollbracht, als nunmehr in der Webseite der Zugriff auf MariaDB integriert ist (siehe IIS und ASP.NET: MariaDB als Dataprovider verwenden). Damit muss nur noch die DoWork-Routine des einen Backgroundworkers angepasst werden und der erste Migrationsblock kann in die funktionale Testphase gehen.

Wie ich bereits skizziert hatte, wurde die Webseite vor langer Zeit von MS Access auf MS SQL Server umgestellt. Aufgrund der damals integrierten (und seither belassenen) besonderen Codestruktur, um die Webseite sukzessive auf die neue Datenbank umstellen zu können, brauchte ich jetzt lediglich die neueste Datenbankverbindung dem betreffenden Connection-Array hinzuzufügen und die beiden Routinen für das Öffnen und Schließen der Datenbankverbindungen zu ergänzen.
Würden SQL Server und MariaDB syntaktisch identisch sein (z.B. nicht "CALL" anstelle von "EXECUTE" für das Ausführen von gespeicherten Prozeduren), wäre damit quasi die Umstellung der Webseite bereits vollzogen. Allein der Indexparameter für das genannte Array müsste dann noch an der jeweiligen Stelle im Code geändert werden, sobald die zugehörigen Tabellen / Prozeduren etc. in die neue Datenbank migriert sind.

Der bereits erwähnte Leistungsunterschied einmal in Zahlen:
Führe ich auf beiden Datenbanken folgenden SQL-Code
SELECT MAX(ID). COUNT(ID) FROM Tabelle;
für die beschriebene Tabelle mit den sehr vielen Datensätzen (aktuell ca. 89 Mio.) aus, dann benötigt SQL Server ca. 1 Minute 35 Sekunden (in DBeaver; in SQL Studio ebenso), während MariaDB mit nur ca. 40 Sekunden signifikant schneller ist. Führe ich den Befehl über die CONNECT-Datenverbindung aus, dann dauert das Ganze sogar ca. 26 bis 30 Minuten (mindestens, meist länger). Wohlgemerkt: Beide DB-Server laufen auf derselben VM und die beiden Datenbanken liegen auf derselben VDisk, so dass der objektive Rahmen identisch ist.

Bestünde denn eigentlich Interesse an meinen weiteren Erfahrungen bei dieser Migration? Sollte ich diese vielleicht in einer Beitragsserie teilen?

Viele Grüße
HansDampf06
Member: ukulele-7
ukulele-7 Feb 08, 2024 at 14:22:31 (UTC)
Goto Top
Interessant ist sowas schon, so lange ich aber nicht vor einer Vergleichbaren Aufgabe stehe habe ich leider nicht wirklich die Zeit mich damit zu befassen.

Für einen Leistungsvergleich fehlt aber irgendwie noch eine Hardware Auslastung während der Abfrage und so grundlegende Angaben. Auch kann nach meinem Wissen eine neu angelegte Tabelle in MSSQL schneller sein als eine Tabelle die über Jahre gewachsen ist, ich würde da eher ein Script bauen das Tabelle, Daten, Indexe etc. identlisch erzeugt damit alles wirklich gut vergleichbar ist.