Importa database MySQL in un server MS SQL


89

Ho un file .sql da un dump MySQL contenente tabelle, definizioni e dati da inserire in queste tabelle. Come posso convertire questo database rappresentato nel file dump in un database MS SQL Server?


1
Hai accesso anche al database originale? O il file di esportazione è praticamente tutto ciò che hai?
Whakkee

Ho anche accesso al DB originale. Ho solo pensato che usare il dump potrebbe essere più facile
marionmaiden

Risposte:


62

Utilizzare SQL Server Migration Assistant (SSMA)

Oltre a MySQL supporta Oracle, Sybase e MS Access.

Sembra essere abbastanza intelligente e in grado di gestire anche trasferimenti non banali. Ha anche un'interfaccia a riga di comando (oltre alla GUI), quindi teoricamente può essere integrata in un processo di caricamento batch.

Questo è l'attuale collegamento per il download della versione di MySQL https://www.microsoft.com/en-us/download/details.aspx?id=54257

L'attuale versione stabile (giugno 2016) 6.0.1 si arresta in modo anomalo con l'attuale driver ODBC MySQL (5.3.6) durante il trasferimento dei dati. Tutto a 64 bit. La versione 5.3 con il driver ODBC 5.1.13 funziona bene.


9
Questo strumento funziona solo se puoi installare un connettore ODBC dal tuo PC al tuo database MySQL. Se hai solo un file di dump .sql non puoi usare SSMA.
Jake Munson

10
Il motore MySQL è un software gratuito e c'è anche una versione per Windows. Installarlo e caricare il dump è un lavoro banale. Se speri di trovare uno strumento (anche commerciale, figuriamoci gratuito) che converta in modo affidabile uno script MySQL arbitrario nel suo equivalente SQL Server, beh, buona fortuna.
Zar Shardan

1
Buon punto. Ed è quello che ho finito per fare ieri. A meno di scrivere la tua utility di conversione personalizzata, l'installazione di MySQL sembra essere l'opzione migliore. L'SSMA era una seccatura da usare, ma alla fine l'ho fatto funzionare.
Jake Munson

2
SSMA è un'ottima opzione, questa dovrebbe essere la risposta accettata. Non l'ho trovato affatto difficile da usare.
DonBecker

2
Richiede SQL Server Agent che non viene fornito con SQL Server Express.
Vinicius Rocha

18

Ti suggerisco di usare mysqldump in questo modo:

mysqldump --compatible=mssql

phpMyAdmin è ancora un'app Web e potrebbe potenzialmente avere alcune limitazioni per database di grandi dimensioni (tempo di esecuzione dello script, memoria allocabile e così via).


6
Ahimè, questo mi dà ogni sorta di problemi di compatibilità. Lo script conterrà i backtick intorno ai nomi delle colonne, i tipi di dati che non esistono in MSSQL, violeranno il vincolo max-1000-inserts, le parole chiave auto_increment, ecc. Ecc. Questa risposta è un suggerimento logico, ma temo che non lo sia non funziona troppo bene (almeno: non ha funzionato per me).
Jeroen

mysqldump --compatible = ansi "Produce un output più compatibile con altri sistemi di database o con server MySQL meno recenti. L'unico valore consentito per questa opzione è ansi, che ha lo stesso significato dell'opzione corrispondente per l'impostazione della modalità SQL del server."
Thomas Taylor,

14

Ho trovato un modo per questo in rete

Richiede un po 'di lavoro, perché deve essere fatto tavolo per tavolo. Ma comunque, potrei copiare le tabelle, i dati e i vincoli in un database MS SQL.

Ecco il link

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


1
Questo è quando sia Mysql che SQL sono in una macchina o sono collegati tramite una rete. Questo non è utile quando esistono due macchine diverse e hai un file Dump da mysql. giusto?
Espanta

7

Se esegui un'esportazione con PhpMyAdmin , puoi cambiare la modalità di compatibilità sql su "MSSQL". In questo modo devi solo eseguire lo script esportato sul tuo database MS SQL e il gioco è fatto.

Se non puoi o non vuoi usare PhpMyAdmin, c'è anche un'opzione di compatibilità in mysqldump , ma personalmente preferirei che PhpMyAdmin lo facesse per me.


1
Questa risposta ha funzionato per me, con modifiche minime allo script generato. Portato in SQL Server 2012. Non vedevo prima la modalità di compatibilità.
Kiel

7

Ecco il mio approccio per importare file .sql in MS SQL:

  1. Esporta tabella da MySQL con --compatible=mssqle --extended-insert=FALSEopzioni:

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

  2. Dividi il file esportato con PowerShell di 300000 righe per file:

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

  3. Esegui ogni file in MS SQL Server Management Studio

Ci sono alcuni suggerimenti su come velocizzare gli inserti .

Un altro approccio consiste nell'usare l' –whereopzione mysqldump . Usando questa opzione puoi dividere la tua tabella in qualsiasi condizione supportata dalla whereclausola sql.


come possiamo esportare l'intero database invece di tabella per tabella
MonsterMMORPG

prova la --databases [db_name]parola chiave come spiegato in questa risposta: stackoverflow.com/a/26096339/155687
Vladislav

4

Oggi ho avuto un problema molto simile: avevo bisogno di copiare una grande tabella (5 milioni di righe) da MySql a MS SQL.

Ecco i passaggi che ho eseguito (con Ubuntu Linux):

  1. Creata una tabella in MS SQL la cui struttura corrisponde alla tabella di origine in MySql.

  2. Riga di comando MS SQL installata: https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-setup-tools#ubuntu

  3. Tabella scaricata da MySql a un file:

mysqldump \
    --compatto \
    --complete-insert \
    --no-create-info \
    --compatibile = mssql \
    --extended-insert = FALSE \
    --host "$ MYSQL_HOST" \
    --user "$ MYSQL_USER" \
    -p "$ MYSQL_PASS" \
    "$ MYSQL_DB" \
    "$ TABLE"> "$ FILENAME"
  1. Nel mio caso il file di dump era piuttosto grande, quindi ho deciso di dividerlo in un numero di piccoli pezzi (1000 righe ciascuno) - split --lines=1000 "$FILENAME" part-

  2. Alla fine ho iterato su questi piccoli file, ho fatto alcune sostituzioni di testo ed eseguito i pezzi uno per uno sul server MS SQL:

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

x = 0

per file in parte- *
fare
  echo "Esportazione del file [$ file] in MS SQL. $ x mille (s) elaborati"

  # sostituisce \ "con" "
  sed -i "s / \\\ '/' '/ g" "$ file"

  # rimuove tutto "
  sed -i 's / "// g'" $ file "

  # consente di inserire record con PK (id) specificato
  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"
  eco ""
  eco ""

  x = $ ((x + 1))
fatto

echo "Fatto"

Naturalmente avrete bisogno di sostituire il mio variabili come $AZURE_SERVER, $TABLE, ecc con la vostra.

Spero che aiuti.


2

Per me ha funzionato meglio esportare tutti i dati con questo comando:

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

--extended-insert = FALSE è necessario per evitare il limite di importazione di 1000 righe di mssql.

Ho creato le mie tabelle con il mio strumento di migrazione, quindi non sono sicuro che CREATE dal file backup.sql funzionerà.

Nell'SSMS di MSSQL ho dovuto importare la tabella dei dati per tabella con IDENTITY_INSERT ON per scrivere i campi ID:

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 

Se hai relazioni devi prima importare il figlio e poi la tabella con la chiave esterna.



0

Correre:

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

Vuoi vedere una barra dei processi?

pv mysqldump -u root -p your_target_DB --compatible=mssql > MSSQL_Compatible_Data.sql
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.