Synchronisation MSSQL vers MYSQL

Eléphanteau du PHP | 39 Messages

21 avr. 2010, 09:54

Bonjour,

Je suis confronté à un problème ou je ne trouve pour l’instant pas de solution. Nous sommes hébergés chez Infomaniak et le temps d’exécution d’un script php ne doit pas dépasser les 10 secondes. Nous avons un serveur virtuel là-bas.

Il y a sur ce serveur une base de MYSQL qui doit être synchronisé avec un MSSQL hébergé dans nos locaux. Deux tables doivent être synchronisé toutes les 24H dont une qui contiendra plus de 100.000 records. La synchronisation s’effectue du MSSQL vers le MYSQL.

Au début, je pensais faire ça via un script PHP lancé par un Cronjob mais voilà la limite des 10 secondes…

Notez que je n’ai pas non plus accès direct depuis l’extérieur au MYSQL ce qui n’arrange pas mes affaires.

Quelqu’un aurait une idée ?

D’avance, merci.
Cerbère.

ViPHP
ViPHP | 5462 Messages

21 avr. 2010, 09:57

hello, avec un dump cvs et apres un coup de LOAD DATA , a voir...

Mammouth du PHP | 568 Messages

21 avr. 2010, 09:59

Tu peux faire une synchronisation par paquet via le cron...

Le but est d'exécuter ton cron toutes les n minutes qui va exporter par paquets de 1000 par exemple (avec un tri sur l'ID en croissant ou bien une date), de stocké le dernier ID (ou la date) traité puis ton traitement reprend à partir de cette donnée juqu'a arrivé à la fin de la table.

Eléphanteau du PHP | 39 Messages

21 avr. 2010, 10:16

Le but est d'exécuter ton cron toutes les n minutes qui va exporter par paquets de 1000 par exemple (avec un tri sur l'ID en croissant ou bien une date), de stocké le dernier ID (ou la date) traité puis ton traitement reprend à partir de cette donnée juqu'a arrivé à la fin de la table.
Effectivement, c'est d'une évidence... J'ai bien fait de poser la question... Merci à toi.

Par contre, le cron, je ne peux que le faire que toutes les 15 minutes. Je dois donc monter au moins à 1500 ou 2000 records par paquet pour faire ça en plus ou moins 16H45 ou 12h30 pour 100.000 records. Ça ne sera pas pour tout de suite mais je préfère prévoir. Au début, on aura peut être qu'à 10.000 records.

ViPHP
ViPHP | 5462 Messages

21 avr. 2010, 10:27

avec LOAD_DATA tout sera fait d'un seul coup

Mammouth du PHP | 568 Messages

21 avr. 2010, 10:28

Le but est d'exécuter ton cron toutes les n minutes qui va exporter par paquets de 1000 par exemple (avec un tri sur l'ID en croissant ou bien une date), de stocké le dernier ID (ou la date) traité puis ton traitement reprend à partir de cette donnée juqu'a arrivé à la fin de la table.
Effectivement, c'est d'une évidence... J'ai bien fait de poser la question... Merci à toi.

Par contre, le cron, je ne peux que le faire que toutes les 15 minutes. Je dois donc monter au moins à 1500 ou 2000 records par paquet pour faire ça en plus ou moins 16H45 ou 12h30 pour 100.000 records. Ça ne sera pas pour tout de suite mais je préfère prévoir. Au début, on aura peut être qu'à 10.000 records.
Sinon essaye de voir la solution de stealth35, ça me parait pas mal aussi, me je dirais rien ne vaut des tests...

Bon courage.

Eléphanteau du PHP | 39 Messages

21 avr. 2010, 10:48

avec LOAD_DATA tout sera fait d'un seul coup
Oui faut que je regarde dans MSSQL comment on fait pour faire une exportation csv automatique. Si je trouve ça, je pourrais faire un petit agent qui envoi le fichier sur le ftp du serveur web.

Ensuite, Il restera à faire le LOAD DATA via le script qui sera lancé a X heure par Cronjob.

Je vais bosser sur tout ça, merci pour vos idées. :)

Eléphanteau du PHP | 39 Messages

21 avr. 2010, 14:32

Bonne rencontre,

Après quelques tests, je vais partir sur LOAD DATA sans découpe pour le moment. Si c'est nécessaire plus tard, je m'occuperais de ça.

Si ça intéresse quelqu'un ou si quelqu'un rencontre le même travail.

En gros, j'exporte mes enregistrement MSSQL dans un fichier CSV.

Exemple :
BCP "SELECT clients.mail FROM Test..clients" queryout e:\AutoBackupcsv\clients.txt -c -t; -T -S "servername"
BCP est un outil fournit avec MSSQL qui permet de faire ce genre de chose.

Ensuite, je le load dans le MYSQL.

Après bien entendu, il faut automatiser tout ça mais il y a moyen de lancer des job dans MSSQL ou de lancer directement un batch qui fera le boulot.

Merci pour votre aide les gars. ;)