Importieren Sie die MySQL-Datenbank in einen MS SQL Server

89

Ich habe eine .sql-Datei aus einem MySQL-Dump, die Tabellen, Definitionen und Daten enthält, die in diese Tabellen eingefügt werden sollen. Wie kann ich diese in der Dump-Datei dargestellte Datenbank in eine MS SQL Server-Datenbank konvertieren?

Marionmaiden
quelle
1
Haben Sie auch Zugriff auf die ursprüngliche Datenbank? Oder ist die Exportdatei im Grunde alles, was Sie haben?
Whakkee
Ich habe auch Zugriff auf die ursprüngliche DB. Ich dachte nur, dass die Verwendung der Müllkippe einfacher sein könnte
Marionmaiden

Antworten:

62

Verwenden Sie den SQL Server-Migrationsassistenten (SSMA).

Zusätzlich zu MySQL unterstützt es Oracle, Sybase und MS Access.

Es scheint ziemlich klug zu sein und auch nicht triviale Übertragungen verarbeiten zu können. Es hat auch eine Befehlszeilenschnittstelle (zusätzlich zur GUI), so dass es theoretisch in einen Batch-Ladeprozess integriert werden kann.

Dies ist der aktuelle Download-Link für die MySQL-Version https://www.microsoft.com/en-us/download/details.aspx?id=54257

Die aktuelle (Juni 2016) stabile Version 6.0.1 stürzt beim Übertragen von Daten mit dem aktuellen (5.3.6) MySQL ODBC-Treiber ab. Alles 64 Bit. Die Version 5.3 mit dem ODBC-Treiber 5.1.13 funktioniert einwandfrei.

Zar Shardan
quelle
9
Dieses Tool funktioniert nur, wenn Sie einen ODBC-Connector von Ihrem PC auf Ihrer MySQL-Datenbank installieren können. Wenn Sie nur eine SQL-Dump-Datei haben, können Sie SSMA nicht verwenden.
Jake Munson
10
MySQL Engine ist freie Software und es gibt auch eine Version für Windows. Das Installieren und Laden des Dumps ist eine triviale Aufgabe. Wenn Sie hoffen, ein Tool zu finden (sogar ein kommerzielles, geschweige denn ein kostenloses), das ein beliebiges MySQL-Skript zuverlässig in sein SQL Server-Äquivalent konvertiert - nun, viel Glück damit.
Zar Shardan
1
Guter Punkt. Und genau das habe ich gestern gemacht. Die Installation von MySQL scheint die beste Option zu sein, ohne ein eigenes benutzerdefiniertes Konvertierungsprogramm zu schreiben. SSMA war ein Schmerz im Hintern, aber ich brachte es schließlich zum Laufen.
Jake Munson
2
SSMA ist eine großartige Option, dies sollte die akzeptierte Antwort sein. Ich fand es überhaupt nicht schwer zu benutzen.
DonBecker
2
Es erfordert den SQL Server-Agenten, der nicht mit SQL Server Express geliefert wird.
Vinicius Rocha
18

Ich schlage vor, dass Sie mysqldump wie folgt verwenden :

mysqldump --compatible=mssql

phpMyAdmin ist immer noch eine Web-App und kann möglicherweise einige Einschränkungen für große Datenbanken aufweisen (Skriptausführungszeit, zuweisbarer Speicher usw.).

deklin
quelle
5
Leider gibt mir dies alle möglichen Kompatibilitätsprobleme. Das Skript enthält Backticks zu Spaltennamen, Datentypen, die in MSSQL nicht vorhanden sind, verstößt gegen die Max-1000-Inserts-Einschränkung, Auto_Increment-Schlüsselwörter usw. usw. Diese Antwort ist ein logischer Vorschlag, aber ich fürchte, dies ist nicht der Fall funktioniert nicht so gut (zumindest: es war nicht für mich).
Jeroen
mysqldump --compatible = ansi "Erzeugt eine Ausgabe, die besser mit anderen Datenbanksystemen oder älteren MySQL-Servern kompatibel ist. Der einzige zulässige Wert für diese Option ist ansi, der dieselbe Bedeutung hat wie die entsprechende Option zum Festlegen des Server-SQL-Modus."
Thomas Taylor
14

Ich habe im Netz einen Weg dafür gefunden

Es erfordert ein wenig Arbeit, weil es Tisch für Tisch erledigt werden muss. Trotzdem konnte ich die Tabellen, Daten und Einschränkungen in eine MS SQL-Datenbank kopieren.

Hier ist der Link

http://www.codeproject.com/KB/database/migrate-mysql-to-mssql.aspx

Marionmaiden
quelle
1
In diesem Fall befinden sich sowohl MySQL als auch SQL auf einem Computer oder sind über ein Netzwerk verbunden. Dies ist nicht sinnvoll, wenn zwei verschiedene Computer vorhanden sind und Sie eine Dump-Datei von MySQL haben. richtig?
Espanta
7

Wenn Sie einen Export mit PhpMyAdmin durchführen , können Sie den SQL-Kompatibilitätsmodus auf "MSSQL" umschalten. Auf diese Weise führen Sie das exportierte Skript einfach für Ihre MS SQL-Datenbank aus und sind fertig.

Wenn Sie PhpMyAdmin nicht verwenden können oder möchten, gibt es auch eine Kompatibilitätsoption in mysqldump , aber ich persönlich möchte, dass PhpMyAdmin dies für mich erledigt.

Whakkee
quelle
1
Diese Antwort funktionierte für mich mit minimalen Änderungen am generierten Skript. Brachte es in SQL Server 2012. Der Kompatibilitätsmodus wurde zuvor nicht angezeigt.
Kiel
7

Hier ist mein Ansatz zum Importieren von SQL-Dateien in MS SQL:

  1. Exportieren Sie eine Tabelle aus MySQL mit --compatible=mssqlund --extended-insert=FALSEOptionen:

    mysqldump -u [username] -p --compatible=mssql --extended-insert=FALSE db_name table_name > table_backup.sql

  2. Teilen Sie die exportierte Datei mit PowerShell durch 300000 Zeilen pro Datei:

    $i=0; Get-Content exported.sql -ReadCount 300000 | %{$i++; $_ | Out-File out_$i.sql}

  3. Führen Sie jede Datei in MS SQL Server Management Studio aus

Es gibt nur wenige Tipps, wie Sie die Einsätze beschleunigen können .

Ein anderer Ansatz ist die Verwendung der –whereOption mysqldump . Mit dieser Option können Sie Ihre Tabelle unter allen Bedingungen whereaufteilen, die von der SQL-Klausel unterstützt werden .

Vladislav
quelle
Wie können wir die gesamte Datenbank anstelle von Tabelle für Tabelle
exportieren
Versuchen Sie das --databases [db_name]Schlüsselwort, wie es in dieser Antwort erklärt wurde: stackoverflow.com/a/26096339/155687
Vladislav
4

Ich hatte heute ein sehr ähnliches Problem - ich musste eine große Tabelle (5 Millionen Zeilen) von MySql in MS SQL kopieren.

Hier sind die Schritte, die ich gemacht habe (unter Ubuntu Linux):

  1. Erstellt eine Tabelle in MS SQL, deren Struktur mit der Quelltabelle in MySql übereinstimmt.

  2. Installierte MS SQL-Befehlszeile: https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-setup-tools#ubuntu

  3. Tabelle von MySql in eine Datei geschrieben:

mysqldump \
    --kompakt \
    --complete-insert \
    --no-create-info \
    --compatible = mssql \
    --extended-insert = FALSE \
    --host "$ MYSQL_HOST" \
    --user "$ MYSQL_USER" \
    -p "$ MYSQL_PASS" \
    "$ MYSQL_DB" \
    "$ TABLE"> "$ FILENAME"
  1. In meinem Fall war die Dump-Datei ziemlich groß, daher habe ich beschlossen, sie in mehrere kleine Teile (jeweils 1000 Zeilen) aufzuteilen. split --lines=1000 "$FILENAME" part-

  2. Schließlich habe ich diese kleinen Dateien durchlaufen, einige Texte ersetzt und die Teile einzeln gegen MS SQL Server ausgeführt:

export SQLCMD = / opt / mssql-tools / bin / sqlcmd

x = 0

für Datei in Teil- *
machen
  echo "Exportieren der Datei [$ file] in MS SQL. $ x Tausend (e) verarbeitet"

  # ersetzt \ 'durch' '
  sed -i "s / \\\ '/' '/ g" "$ file"

  # entfernt alle "
  sed -i 's / "// g'" $ file "

  # ermöglicht das Einfügen von Datensätzen mit der angegebenen PK (ID)
  sed -i "1s / ^ / SET IDENTITY_INSERT $ TABLE ON; \ n /" "$ file"

  "$ SQLCMD" -S - $ AZURE_SERVER "-d" $ AZURE_DB "-U" $ AZURE_USER "-P" $ AZURE_PASS "-i" $ file "
  Echo ""
  Echo ""

  x = $ ((x + 1))
getan

Echo "Fertig"

Natürlich müssen Sie meine Variablen ersetzen , wie $AZURE_SERVER, $TABLEusw. mit Ihnen.

Hoffentlich hilft das.

Vladimir Korobkov
quelle
2

Für mich hat es am besten funktioniert, alle Daten mit diesem Befehl zu exportieren:

mysqldump -u USERNAME -p --all-databases --complete-insert --extended-insert=FALSE --compatible=mssql > backup.sql

--extended-insert = FALSE wird benötigt, um das Importlimit für 1000 mssql-Zeilen zu vermeiden.

Ich habe meine Tabellen mit meinem Migrationstool erstellt, daher bin ich mir nicht sicher, ob CREATE aus der Datei backup.sql funktioniert.

In MSSQLs SSMS musste ich die Daten Tabelle für Tabelle mit der IDENTITY_INSERT ON importieren, um die ID-Felder zu schreiben:

SET IDENTITY_INSERT dbo.app_warehouse ON;
GO 
INSERT INTO "app_warehouse" ("id", "Name", "Standort", "Laenge", "Breite", "Notiz") VALUES (1,'01','Bremen',250,120,'');
SET IDENTITY_INSERT dbo.app_warehouse OFF;
GO 

Wenn Sie Beziehungen haben, müssen Sie zuerst das untergeordnete Element und dann die Tabelle mit dem Fremdschlüssel importieren.

Pinguin Pinguin
quelle
0

Lauf:

mysqldump -u root -p your_target_DB --compatible=mssql > MSSQL_Compatible_Data.sql

Möchten Sie eine Prozessleiste sehen?

pv mysqldump -u root -p your_target_DB --compatible=mssql > MSSQL_Compatible_Data.sql
Francesco Mantovani
quelle