Importer une base de données MySQL dans un serveur MS SQL

89

J'ai un fichier .sql d'un vidage MySQL contenant des tables, des définitions et des données à insérer dans ces tables. Comment puis-je convertir cette base de données représentée dans le fichier de vidage en base de données MS SQL Server?

marionmaiden
la source
1
Avez-vous également accès à la base de données d'origine? Ou le fichier d'exportation est-il essentiellement tout ce que vous avez?
Whakkee
J'ai aussi accès à la DB d'origine. Je pensais juste que l'utilisation du dump pourrait être plus facile
marionmaiden

Réponses:

62

Utiliser l' assistant de migration SQL Server (SSMA)

En plus de MySQL, il prend en charge Oracle, Sybase et MS Access.

Il semble être assez intelligent et capable de gérer même les transferts non triviaux. Il a également une interface de ligne de commande (en plus de l'interface graphique) donc théoriquement, il peut être intégré dans un processus de chargement par lots.

Voici le lien de téléchargement actuel pour la version MySQL https://www.microsoft.com/en-us/download/details.aspx?id=54257

La version stable 6.0.1 actuelle (juin 2016) plante avec le pilote ODBC MySQL actuel (5.3.6) lors du transfert de données. Tout 64 bits. La version 5.3 avec le pilote ODBC 5.1.13 fonctionne correctement.

Zar Shardan
la source
9
Cet outil ne fonctionne que si vous pouvez installer un connecteur ODBC de votre PC vers votre base de données MySQL. Si vous avez juste un fichier de vidage .sql, vous ne pouvez pas utiliser SSMA.
Jake Munson
10
Le moteur MySQL est un logiciel gratuit, et il existe également une version pour Windows. L'installer et charger le vidage est un travail trivial. Si vous espérez trouver un outil (même un commercial, encore moins gratuit) qui convertira de manière fiable un script MySQL arbitraire en son équivalent SQL Server - eh bien, bonne chance avec cela.
Zar Shardan
1
Bon point. Et c'est ce que j'ai fini par faire hier. À moins d'écrire votre propre utilitaire de conversion personnalisé, installer MySQL semble être la meilleure option. SSMA était une douleur dans le cul à utiliser, mais je l'ai finalement réussi.
Jake Munson
2
SSMA est une excellente option, cela devrait être la réponse acceptée. Je n'ai pas du tout trouvé difficile à utiliser.
DonBecker
2
Il nécessite l'Agent SQL Server qui n'est pas fourni avec SQL Server Express.
Vinicius Rocha
18

Je vous suggère d'utiliser mysqldump comme ceci:

mysqldump --compatible=mssql

phpMyAdmin est toujours une application Web et pourrait potentiellement avoir des limitations pour les grandes bases de données (temps d'exécution du script, mémoire allouable, etc.).

deklin
la source
6
Hélas, cela me pose toutes sortes de problèmes de compatibilité. Le script contiendra des backticks autour des noms de colonnes, des types de données qui n'existent pas dans MSSQL, violeront la contrainte max-1000-inserts, les mots-clés auto_increment, etc. etc. Cette réponse est une suggestion logique, mais j'ai bien peur que ce ne soit pas le cas ça marche pas trop bien (du moins: ça n'a pas marché pour moi).
Jeroen
mysqldump --compatible = ansi "Produire une sortie plus compatible avec d'autres systèmes de base de données ou avec des serveurs MySQL plus anciens. La seule valeur autorisée pour cette option est ansi, qui a la même signification que l'option correspondante pour définir le mode SQL du serveur."
Thomas Taylor
14

J'ai trouvé un moyen pour ça sur le net

Cela demande un peu de travail, car il faut le faire table par table. Mais de toute façon, je pourrais copier les tables, les données et les contraintes dans une base de données MS SQL.

Voici le lien

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

marionmaiden
la source
1
C'est à ce moment que Mysql et SQL sont tous deux sur une seule machine ou connectés via un réseau. Ce n'est pas utile lorsqu'il existe deux machines différentes et que vous avez un fichier de vidage de mysql. droite?
Espanta
7

Si vous effectuez une exportation avec PhpMyAdmin , vous pouvez basculer le mode de compatibilité SQL sur «MSSQL». De cette façon, vous exécutez simplement le script exporté sur votre base de données MS SQL et vous avez terminé.

Si vous ne pouvez pas ou ne voulez pas utiliser PhpMyAdmin, il y a aussi une option de compatibilité dans mysqldump , mais personnellement je préfère que PhpMyAdmin le fasse pour moi.

Whakkee
la source
1
Cette réponse a fonctionné pour moi, avec des modifications minimes du script généré. Je l'ai introduit dans SQL Server 2012. Je n'avais pas vu le mode de compatibilité auparavant.
Kiel le
7

Voici mon approche pour importer des fichiers .sql vers MS SQL:

  1. Exporter la table depuis MySQL avec --compatible=mssqlet --extended-insert=FALSEoptions:

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

  2. Divisez le fichier exporté avec PowerShell par 300000 lignes par fichier:

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

  3. Exécutez chaque fichier dans MS SQL Server Management Studio

Il existe quelques astuces pour accélérer les inserts .

Une autre approche consiste à utiliser l' –whereoption mysqldump . En utilisant cette option, vous pouvez fractionner votre table sur n'importe quelle condition prise en charge par la whereclause sql.

Vladislav
la source
comment pouvons-nous exporter la base de données entière au lieu de table par table
MonsterMMORPG
essayez le --databases [db_name]mot-clé comme il est expliqué dans cette réponse: stackoverflow.com/a/26096339/155687
Vladislav
4

J'ai eu un problème très similaire aujourd'hui - j'avais besoin de copier une grande table (5 millions de lignes) de MySql dans MS SQL.

Voici les étapes que j'ai effectuées (sous Ubuntu Linux):

  1. Création d'une table dans MS SQL dont la structure correspond à la table source dans MySql.

  2. Ligne de commande MS SQL installée: https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-setup-tools#ubuntu

  3. Table sauvegardée de MySql dans un fichier:

mysqldump \
    --compact \
    - insertion-complète \
    --no-create-info \
    --compatible = mssql \
    --extended-insert = FALSE \
    --host "$ MYSQL_HOST" \
    --utilisateur "$ MYSQL_USER" \
    -p "$ MYSQL_PASS" \
    "$ MYSQL_DB" \
    "$ TABLE"> "$ FILENAME"
  1. Dans mon cas, le fichier de vidage était assez volumineux, j'ai donc décidé de le diviser en plusieurs petits morceaux (1000 lignes chacun) - split --lines=1000 "$FILENAME" part-

  2. Enfin, j'ai parcouru ces petits fichiers, effectué quelques remplacements de texte et exécuté les morceaux un par un contre le serveur MS SQL:

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

x = 0

pour fichier en partie- *
faire
  echo "Exportation du fichier [$ file] vers MS SQL. $ x mille (s) traité (s)"

  # remplace \ 'par' '
  sed -i "s / \\\ '/' '/ g" "$ fichier"

  # enleve tout "
  sed -i 's / "// g'" $ fichier "

  # permet d'insérer des enregistrements avec PK (id) spécifié
  sed -i "1s / ^ / SET IDENTITY_INSERT $ TABLE ON; \ n /" "$ fichier"

  "$ SQLCMD" -S "$ AZURE_SERVER" -d "$ AZURE_DB" -U "$ AZURE_USER" -P "$ AZURE_PASS" -i "$ fichier"
  écho ""
  écho ""

  x = $ ((x + 1))
terminé

echo "Terminé"

Bien sûr , vous aurez besoin de remplacer mes variables comme $AZURE_SERVER, $TABLE, etc avec le vôtre.

J'espère que cela pourra aider.

Vladimir Korobkov
la source
2

Pour moi, il était préférable d'exporter toutes les données avec cette commande:

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

--extended-insert = FALSE est nécessaire pour éviter la limite d'importation de 1 000 lignes de mssql.

J'ai créé mes tables avec mon outil de migration, donc je ne suis pas sûr que CREATE du fichier backup.sql fonctionnera.

Dans le SSMS de MSSQL, j'ai dû importer la table de données par table avec IDENTITY_INSERT ON pour écrire les champs 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 vous avez des relations, vous devez d'abord importer l'enfant et ensuite la table avec la clé étrangère.

Pingouin pingouin
la source
0

Courir:

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

Voulez-vous voir une barre de processus?

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