2009-03-09 7 views
2

Nous avons une base de données MySQL (pour la plupart en lecture seule, donc les tables MyISAM) vivant dans le centre de données qui parle à une base de données SQL Server vivant sur site. Il y a une latence significative dans le WAN (plus de 100ms); Dans environ 6 mois, le SGBD SQL Server sera déplacé vers le centre de données (par exemple le même réseau LAN gigabit).Mise à jour efficace de la table MySQL à partir de SQL Server

Dans la base de données MySQL, j'ai plusieurs milliers de lignes à mettre à jour à partir des résultats de la base de données SQL Server. La base de données MySQL est attachée à une application rails fonctionnant sous Linux, donc je garderais la logique de migrer les données autant que possible dans des scripts shell ou des tâches rake/ruby ​​ (nous ne sommes pas des développeurs d'applications Windows donc Win32 applications et autres sont sortie!).

C'est un processus assez simple. En pseudocode:

SELECT id 
    , amount 
    FROM bank_account.on_SQL_Server 
WHERE (some logic) 

FOREACH ROW: 
    UPDATE bank_account.on_MySQL 
    SET amount = $some_amount 
    WHERE id  = $some_id 

Supposons qu'il ya plusieurs milliers de lignes qui ont besoin mis à jour et fait si souvent (toutes les 5 minutes). Supposons également que je n'ai aucun moyen de savoir quelles lignes dans SQL Server ont un changement de quantité (malheureusement!) Je ne peux donc pas le limiter à des lignes modifiées - Je dois les envoyer partout (beurk, mais la base de données SQL Server est une application tierce qui ne peut pas être modifiée edit: nous avons le contrôle sur le SGBD, donc nous pourrions faire une légère modification, comme un déclencheur sur la table ou une nouvelle procédure stockée - aucun schéma de table ne change ajouter, par exemple, une colonne mise à jour en dernier - mais je voudrais enregistrer cette option en dernier recours).

Comment optimiser ce processus de mise à jour en minimisant l'exécution? Ce processus devra s'exécuter toutes les quelques minutes (le plus tôt sera le mieux) et l'émission de doubles connexions à SQL Server et MySQL à partir de Ruby est trop lente. Il peut s'agir de verrous de table d'écriture émis par le moteur MyISAM mais la conversion vers Innodb ne semble pas plus rapide (le système est en test et donc pas facile de simuler le même type de charge que la production recevrait, ce qui me conduit à croire que ce n'est pas lié à un verrou). Je suis actuellement penché vers BCP'ing un VIEW (qui correspond à l'instruction SQL Server ci-dessus) à un fichier, FTP 'sur le serveur Linux, puis en utilisant Ruby pour foreach le fichier (et exécuter beaucoup de instructions SQL sérialisées), mais je dois imaginer qu'il existe de meilleurs moyens.

Répondre

1

Vous pouvez ajouter MySQL en tant que serveur lié à SQL Server suivant these instructions

De là, vous pouvez faire quelque chose comme faire une jointure entre votre table mysql et votre table de MSSQL où les montants ne sont pas égaux et les mettre à jour en conséquence. Vous pouvez ensuite l'exécuter en tant que tâche SQL pour maintenir la synchronisation de la base de données toutes les 5 minutes.

par ex.

SELECT * FROM mysql.dbo.bank_account myb 
INNER JOIN bank_account sqlb 
ON myb.id = sqlb.id 
AND sqlb.amount <> myb.amount 

Il peut être plus intelligent façons de déterminer quelles données ont changé une fois que vous pouvez interroger la table mysql à l'intérieur de SQL Server qui utilisera moins de ressources, mais cela est un début.

+0

c'est joli rad.Faut-il copier-coller le sol'n au cas où la source disparaîtrait? Je ne me souviens pas de l'étiquette –

+0

Je ne pense pas que la source va disparaître de sitôt. Peut-être son autre bon SO: Instructions pour une requête liée à SQL Server –

0

Vous pouvez ajouter une autre table au côté MSSQL pour que vous ne trouviez pas les lignes mises à jour en mettant en cache les anciennes valeurs ou via triggers (yuck).

Orthogonal à cela, vous pourriez voir s'il y a un moteur MySQL qui donne une vue à distance d'une base de données MSSQL comme le fait federated engine pour MySQL.

+0

Ah, alors peut-on ajouter un serveur lié qui est MySQL, puis mettre à jour la table directement à partir de SQL Server? –

Questions connexes