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.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 42558034074
Url: https://administrator.de/contentid/42558034074
Ausgedruckt am: 21.11.2024 um 15:11 Uhr
19 Kommentare
Neuester Kommentar
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ß
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.
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.
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.
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.
Hallo,
hilft alles wenig ohne mehr über die Anwendung und Art der Anbindung zu wissen.
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.
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.
Datenmigration über die MySQL Workbench. Für mich stellt sich aber davor die Frage der Anbindung / Integration.
stören mich mit ORM nicht, da Fehler abgefangen werden.
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
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ß
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ß
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.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.
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..
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 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),.
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.
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.