Cet article a été publié il y a 2 ans 1 mois 23 jours, il est donc possible qu’il ne soit plus à jour. Les informations proposées sont donc peut-être expirées.J’ai peu de temps en ce moment à consacrer au blog (très occupé entre mon travail et le changement de serveur dédié).
J’ai cependant eu besoin dans le cadre professionnel de lier un serveur Microsoft MSSQL en production à un serveur MySQL en développement.
Afin de pouvoir retrouver facilement comment j’ai procédé et de simplifier la vie à ceux qui souhaiteraient mettre en place une solution similaire, j’ai décidé de vous expliquer ici les différentes étapes qui m’ont permis de connecter avec succès ces deux serveur SQL issus de deux mondes que tout oppose.
Évidement les 3/4 des actions sont à réaliser sur le serveur Windows, je part du principe que le MySQL est déjà configuré et prêt à l’emploi.
Pour commencer nous avons besoin d’installer le connecteur ODBC pour MySQL (version windows) que vous pouvez télécharger à cette adresse : http://extensions.services.openoffice.org/project/mysql_connector
On exécute donc le package msi d’installation
mysql-connector-odbc-5.1.6-win32.msi
Ceci nous permet d’avoir le pilote disponible pour la création d’une source de donnée ODBC.
Pour la créer on utilise le raccourci [WIN] + R ou « Démarrer -> Exécuter »
odbcad32
La fenêtre « ODBC Data Source Administrator » s’ouvre, nous devons créer notre source de donnée dans l’onglet « System DSN » -> « Add »
Choisissez « MySQL ODBC 5.1 Driver » et cliquez sur « Finish »
Donnez un nom à votre source de donnée (exemple MySQL)
Et renseignez le reste comme sur la capture ci-dessous (en prenant soin bien sur de modifier l’adresse 172.19.0.30 par celle de votre serveur MySQL)
Vérifiez ensuite avec le bouton test que la connexion s’établit correctement.
Notre source de donnée ODBC est crée et prête à être utilisée pour relier le serveur MySQL au MSSQL.
Ouvrez SQL Enterprise Manager et parcourez le menu pour choisir :
« Security » -> « Linked Servers » [Clic Droit ] « New Linked Server »
Donnez un nom au serveur (assez simple car vous l’utiliserez dans vos futures requêtes) : exemple MySQL
Choisissez « Other data source » -> « Microsoft OLE DB Provider for ODBC Driver »
Et renseignez l’option « Provider String » comme suit : (remplacez IP_DU_MYSQL, BDD_MYSQL, PWD_ROOT)
Driver={MySQL ODBC 5.1 Driver};Server=IP_DU_MYSQL;Database=BDD_MYSQL;User=root; Password=PWD_ROOT;Option=3;
Validez puis vérifiez que les serveurs sont bien liés.
Pour requêter sur le MySQL depuis le MSSQL vous pouvez utiliser OPENQUERY de cette façon :
SELECT :
SELECT * FROM OPENQUERY (MYSQL,'SELECT * FROM MaTable')
INSERT :
INSERT OPENQUERY (MYSQL,'SELECT * FROM test.MaTable') SELECT * FROM DATABASE.dbo.MaTable
Il se peut que vous obteniez une erreur similaire à celle-ci
Server: Msg 7347, Level 16, State 1, Line 1 OLE DB provider 'MSDASQL' returned an unexpected data length for the fixed-length column '[MSDASQL].ALTPHONENUM2'. The expected data length is 16, while the returned data length is 0.
Pour pouvoir travailler avec des champs de longueur différentes vous devez utiliser la commande Transact-SQL DBCC et activer l’indicateur de trace n° 8765
DBCC TRACEON(8765) INSERT OPENQUERY (MYSQL,'SELECT * FROM test.MaTable') SELECT * FROM DATABASE.dbo.MaTable
Enfin si vous le souhaitez vous pouvez également mettre en place sur la table MaTable du serveur MSSQL un trigger d’insert (update et delete) afin que l’ajout (la mise à jour ou l’effacement) d’un enregistrement sur le MSSQL soit répliqué sur le MySQL.
CREATE TRIGGER MaTable_insert ON [dbo.MaTable] FOR INSERT AS SET XACT_ABORT ON INSERT INTO OPENQUERY(MYSQL, 'SELECT * FROM Matable') SELECT Champ1, Champ2, Champ3 FROM INSERTED GO CREATE TRIGGER MaTable_update ON [dbo.MaTable] FOR UPDATE AS SET XACT_ABORT ON DELETE FROM OPENQUERY(MYSQL, 'SELECT * FROM Matable') WHERE Champ1 IN (SELECT Champ1 FROM DELETED) INSERT INTO OPENQUERY(MYSQL, 'SELECT * FROM Matable') SELECT Champ1, Champ2, Champ3 FROM INSERTED GO CREATE TRIGGER MaTable_delete ON [dbo.MaTable] FOR DELETE AS SET XACT_ABORT ON DELETE FROM OPENQUERY(MYSQL, 'SELECT * FROM Matable') WHERE Champ1 IN (SELECT Champ1 FROM DELETED) GO



18/02/2010 at 11 h 55 min Permalink
Bonjour et tout d’abbord merci pour ce tuto très complet.
Dans un premier temps j’aurais une remarque à faire, je pense que la chaine à mettre dans le provider string doit commencer par :
Driver={MySQL ODBC 5.1 Driver};Server=IP_DU_MYSQL;Database=BDD_MYSQL;User=root; Password=PWD_ROOT;Option=3;
Ensuite j’ai un problème au niveau des triggers qui ne fonctionnent pas chez moi. Je pense que le problème vient du fait que l’on utilise une transaction distribuée. Y a t’il une configuration particulière à effectuer au niveau du serveur MySql ?
19/02/2010 at 2 h 01 min Permalink
Bonsoir Florian,
Merci pour avoir vu la faute de frappe sur la chaine de connexion.(je met l’article à jour, c’est étrange ça passe quand même sur mon MSSQL).
Concernant le soucis que tu rencontres avec les triggers, il faut savoir que les transactions distribuées ne sont pas activées par défaut sous Windows, tu as un processus msdtc.exe actif ou non ?
Sinon tu peux essayer d’ajouter « Enlist=False » à ta chaine de connexion pour explicitement les désactiver.
Quand tu dis que les triggers ne fonctionnent pas tu parles des 3 insert/delete/update ? Le système te renvoi t-il une erreur particulière qui pourrait indiquer l’origine de ce blocage ?
23/02/2010 at 12 h 28 min Permalink
Bonjour,
Le service MSDTC est effectivement lancé. J’ai essayé d’ajouter Enlist=False à la fin de ma chaine de connexion mais sans succès. Effectivement les 3 requêtes insert/delete/update ne fonctionne pas dans un trigger mais fonctionne parfaitement lorsque j’effectue des requêtes simples.
Voici le message retournée par MSSQL :
La transaction s’est terminée dans le déclencheur. Le lot a été abandonné.
23/02/2010 at 18 h 24 min Permalink
Bonjour Florian,
Coté MSSQL lorsque tu cliques sur le bouton « provider options » les options doivent être cochées comme sur la capture suivante.


Dans l’onglet « serveur option » comme sur la capture suivante
A ma connaissance c’est tout ce qu’il faut spécifier coté conf MSSQL et rien coté MySQL.(C’est en tout cas la conf qui fonctionne pour moi sur un MSSQL 2000).
24/02/2010 at 12 h 27 min Permalink
Merci pour toute tes informations, mais ça ne fonctionne toujours pas.
Je vais me passer des triggers et fonctionner avec des requêtes simples.
Bonne journée.
28/10/2010 at 20 h 18 min Permalink
Hello !
merci pour ton tuto !
PAr contre sais-tu si il est possible de faire l’inverse ? J’ai une base de données sous SQL Server et une autre sous MySQL, je voudrais lier des tables du SQLServer dans MySQL.
Je n’arrive pas a trouver de la doc la-dessus (possible ou pas ) ?
Merci d’avance
Olivier
28/10/2010 at 21 h 17 min Permalink
Hello !
En l’état je dirais que la création d’un serveur lié n’est possible que sous MSSQL mais une fois les serveurs liés ils « parlent ensemble » (que ce soit piloté depuis le MSSQL ou le MySQL).
La seule condition est d’être admin du serveur MSSQL (et j’imagine que c’est la contrainte pour toi ?).
Serait-il possible d’avoir plus d’infos sur le système que tu comptes mettre en place, cela aiderait pour te proposer une solution adaptée.
Jérôme
21/01/2011 at 16 h 27 min Permalink
Salut
Premièrement, merci, pour l’info a propos de DBCC TRACEON 8765
Deuxièmement, si ça peut aider ceux pour qui ça ne fonctionne pas, ça fonctionne avec MSSQL 2000, mais je n’ai pas encore trouvé la solution avec MSSQL 2k5 ou 2k8
27/01/2011 at 4 h 01 min Permalink
Bonjour Jean-Louis et merci pour ton commentaire.
Je n’ai pas testé avec MSSQL2k5 mais il semblerait que ça fonctionne aussi.