Lier un serveur MSSQL à un serveur MySQL

closeCet 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

MSSQL_MySQL

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)

MSSQL_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;

MSSQL_MySQL

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

Trackback URL

, , , ,

9 Comments on "Lier un serveur MSSQL à un serveur MySQL"

  1. Florian
    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 ?

  2. Jérôme
    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 ?

  3. Florian
    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é.

  4. Jérôme
    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.
    MSSQL_Link
    Dans l’onglet « serveur option » comme sur la capture suivante
    MSSQL_Link

    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).

  5. Florian
    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.

  6. Olivier
    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

  7. Jérôme
    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

  8. Jean-Louis
    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

  9. Jérôme
    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.

Hi Stranger, leave a comment:

ALLOWED XHTML TAGS:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Subscribe to Comments
Get Adobe Flash playerPlugin by wpburn.com wordpress themes