Importar la base de datos MySQL a un servidor MS SQL

89

Tengo un archivo .sql de un volcado de MySQL que contiene tablas, definiciones y datos para insertar en estas tablas. ¿Cómo puedo convertir esta base de datos representada en el archivo de volcado en una base de datos de MS SQL Server?

marionmaiden
fuente
1
¿Tiene también acceso a la base de datos original? ¿O el archivo de exportación es básicamente todo lo que tienes?
Whakkee
También tengo acceso al DB original. Solo pensé que usar el vertedero podría ser más fácil
marionmaiden

Respuestas:

62

Usar el Asistente de migración de SQL Server (SSMA)

Además de MySQL, es compatible con Oracle, Sybase y MS Access.

Parece ser bastante inteligente y capaz de manejar transferencias no triviales. También tiene una interfaz de línea de comandos (además de la GUI), por lo que teóricamente se puede integrar en algún proceso de carga por lotes.

Este es el enlace de descarga actual para la versión de MySQL https://www.microsoft.com/en-us/download/details.aspx?id=54257

La versión estable actual (junio de 2016) 6.0.1 se bloquea con el controlador ODBC de MySQL actual (5.3.6) mientras se transfieren datos. Todo de 64 bits. La versión 5.3 con el controlador ODBC 5.1.13 funciona bien.

Zar Shardan
fuente
9
Esta herramienta solo funciona si puede instalar un conector ODBC desde su PC a su base de datos MySQL. Si solo tiene un archivo de volcado .sql, no puede usar SSMA.
Jake Munson
10
El motor MySQL es un software gratuito y también hay una versión para Windows. Instalarlo y cargar el volcado es un trabajo trivial. Si espera encontrar una herramienta (incluso una comercial, y mucho menos gratuita) que convierta de manera confiable un script MySQL arbitrario en su equivalente de SQL Server, bueno, buena suerte con eso.
Zar Shardan
1
Buen punto. Y eso es lo que terminé haciendo ayer. Aparte de escribir su propia utilidad de conversión personalizada, instalar MySQL parece ser la mejor opción. El uso de SSMA fue un dolor en el trasero, pero finalmente lo hice funcionar.
Jake Munson
2
SSMA es una gran opción, esta debería ser la respuesta aceptada. No me resultó difícil de usar en absoluto.
DonBecker
2
Requiere el Agente SQL Server que no viene con SQL Server Express.
Vinicius Rocha
18

Le sugiero que use mysqldump así:

mysqldump --compatible=mssql

phpMyAdmin sigue siendo una aplicación web y podría tener algunas limitaciones para bases de datos grandes (tiempo de ejecución del script, memoria asignable, etc.).

Deklin
fuente
6
Por desgracia, esto me da todo tipo de problemas de compatibilidad. El script contendrá comillas inversas alrededor de los nombres de las columnas, tipos de datos que no existen en MSSQL, violará la restricción max-1000-inserts, palabras clave auto_increment, etc. etc. Esta respuesta es una sugerencia lógica, pero me temo que no no funciona demasiado bien (al menos: no fue así para mí).
Jeroen
mysqldump --compatible = ansi "Produce una salida que es más compatible con otros sistemas de base de datos o con servidores MySQL más antiguos. El único valor permitido para esta opción es ansi, que tiene el mismo significado que la opción correspondiente para configurar el modo SQL del servidor".
Thomas Taylor
14

Encontré una manera de esto en la red

Requiere un poco de trabajo, porque hay que hacerlo mesa por mesa. Pero de todos modos, podría copiar las tablas, los datos y las restricciones en una base de datos MS SQL.

Aqui esta el link

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

marionmaiden
fuente
1
Eso es cuando tanto Mysql como SQL están en una máquina o están conectados a través de una red. Esto no es útil cuando existen dos máquinas diferentes y tiene un archivo Dump de mysql. ¿Derecha?
Espanta
7

Si realiza una exportación con PhpMyAdmin , puede cambiar el modo de compatibilidad de SQL a 'MSSQL'. De esa manera, simplemente ejecute el script exportado en su base de datos MS SQL y listo.

Si no puede o no quiere usar PhpMyAdmin, también hay una opción de compatibilidad en mysqldump , pero personalmente prefiero que PhpMyAdmin lo haga por mí.

Whakkee
fuente
1
Esta respuesta funcionó para mí, con modificaciones mínimas en el script generado. Lo incorporé a SQL Server 2012. No vi el modo de compatibilidad antes.
Kiel
7

Aquí está mi enfoque para importar archivos .sql a MS SQL:

  1. Exportar tabla de MySQL con --compatible=mssqly --extended-insert=FALSEopciones:

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

  2. Divida el archivo exportado con PowerShell en 300000 líneas por archivo:

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

  3. Ejecute cada archivo en MS SQL Server Management Studio

Hay algunos consejos sobre cómo acelerar las inserciones .

Otro enfoque es usar la –whereopción mysqldump . Al usar esta opción, puede dividir su tabla en cualquier condición que sea compatible con la wherecláusula sql.

Vladislav
fuente
¿Cómo podemos exportar toda la base de datos en lugar de tabla por tabla?
MonsterMMORPG
pruebe la --databases [db_name]palabra clave como se explica en esta respuesta: stackoverflow.com/a/26096339/155687
Vladislav
4

Hoy tuve un problema muy similar: necesitaba copiar una tabla grande (5 millones de filas) de MySql en MS SQL.

Estos son los pasos que he realizado (en Ubuntu Linux):

  1. Creó una tabla en MS SQL cuya estructura coincide con la tabla de origen en MySql.

  2. Línea de comando MS SQL instalada: https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-setup-tools#ubuntu

  3. Tabla volcada de MySql a un archivo:

mysqldump \
    --compacto \
    - inserción-completa \
    --no-crear-información \
    --compatible = mssql \
    --extended-insert = FALSE \
    --host "$ MYSQL_HOST" \
    --usuario "$ MYSQL_USER" \
    -p "$ MYSQL_PASS" \
    "$ MYSQL_DB" \
    "$ TABLE"> "$ FILENAME"
  1. En mi caso, el archivo de volcado era bastante grande, así que decidí dividirlo en varias partes pequeñas (1000 líneas cada una): split --lines=1000 "$FILENAME" part-

  2. Finalmente, itere sobre estos pequeños archivos, hice algunos reemplazos de texto y ejecuté las piezas una por una contra el servidor MS SQL:

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

x = 0

para archivo en parte- *
hacer
  echo "Exportando archivo [$ file] a MS SQL. $ x mil (s) procesados"

  # reemplaza \ 'con' '
  sed -i "s / \\\ '/' '/ g" "$ archivo"

  # elimina todo "
  sed -i 's / "// g'" $ archivo "

  # permite insertar registros con PK (id) especificado
  sed -i "1s / ^ / SET IDENTITY_INSERT $ TABLE ON; \ n /" "$ archivo"

  "$ SQLCMD" -S "$ AZURE_SERVER" -d "$ AZURE_DB" -U "$ AZURE_USER" -P "$ AZURE_PASS" -i "$ archivo"
  eco ""
  eco ""

  x = $ ((x + 1))
hecho

echo "Hecho"

Por supuesto que tendrá que reemplazar mis variables como $AZURE_SERVER, $TABLE, etc con la suya.

Espero que ayude.

Vladimir Korobkov
fuente
2

Para mí, funcionó mejor para exportar todos los datos con este comando:

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

--extended-insert = FALSE es necesario para evitar el límite de importación de 1000 filas de mssql.

Creé mis tablas con mi herramienta de migración, así que no estoy seguro de si el archivo CREAR del archivo backup.sql funcionará.

En el SSMS de MSSQL tuve que importar la tabla de datos por tabla con IDENTITY_INSERT ON para escribir los campos de 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 

Si tiene relaciones, primero debe importar el hijo y luego la tabla con la clave externa.

Pinguin Pinguin
fuente
0

Correr:

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

¿Quieres ver una barra de proceso?

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