2010-06-23 3 views
0

Nous avons 2 serveurs, dont l'un est client. Notre client nous fournit une URL d'exportation XML/JSON des informations de ses clients depuis son CMS et notre tâche est d'écrire des scripts d'import pour importer des données dans webapp, que nous développons.Synchronisation permanente à distance

J'ai toujours fait ça comme ça:

INSERT INTO customers (name,address) VALUES ('John Doe', 'NY') ON DUPLICATE KEY UPDATE name='John Doe', address='NY' 

Cette solution est la manière de permormace, pour autant que je sais ...

Mais cette solution ne résout pas la problème de la suppression des enregistrements. Que se passe-t-il si un client est supprimé de la base de données et n'est pas présent dans l'export - comment dois-je faire cela?

Dois-je d'abord TRUNCER l'ensemble de la table, puis la remplir à nouveau? Ou devrais-je remplir un tableau en PHP avec tous les enregistrements, puis le parcourir à nouveau et supprimer les enregistrements qui ne sont pas en XML/JSON?

Je pense qu'il doit y avoir une meilleure solution.

Je suis intéressé par la meilleure solution de la façon de performace, parce que nous devons importer des milliers de documents et le processus d'importation ensemble peut prendre beaucoup de temps.

Répondre

1

Je suis intéressé par la meilleure solution de la façon de performace

Si son mysql au client, utilisez la réplication MySQL - le client en tant que maître et votre finir comme l'esclave. Vous pouvez soit utiliser un flux direct (vous voudrez probablement exécuter ceci via un VPN), soit en mode déconnecté (ils vous envoient les logs de la poubelle pour avancer).

Notre client nous fournit une URL des exportations XML/JSON de ses clients des informations de son CMS

Ceci est une idée vraiment stupide - et sonne comme vous essayez de faire l'ajustement de la solution le problème (ce qui n'est pas le cas). HTTP n'est pas le moyen de transférer de gros fichiers de données sur Internet. Cela signifie également que le serveur distant doit faire beaucoup de travail uniquement pour rendre les données disponibles (en supposant qu'il peut même identifier quelles données doivent être répliquées - et comme vous le faites remarquer, cela ne fonctionne pas actuellement pour les enregistrements supprimés). Ce dernier point est vrai quel que soit le protocole réseau. Vous ne pouvez pas copier de grandes quantités de données directement à un niveau inférieur de la pile que la base de données (par exemple en essayant d'utiliser rsync pour répliquer des fichiers de données) car le miroir local sera presque toujours incohérent.

C.

0

En supposant que vous utilisez MySQL, le seul SQL Je sais que rien:

Est-il vrai que l'exportation de CMS de votre client contient toujours toutes ses données clients actuelles? Si c'est vrai, alors oui il vaut mieux laisser tomber ou tronquer la table 'clients'; c'est-à-dire jeter la table des clients d'hier et la reconstruire aujourd'hui dès le début.

Mais vous ne pouvez pas utiliser 'insert': il faudra ~ 28 heures par jour pour insérer des milliers de lignes client. Alors oubliez "insert". A la place, ajoutez des lignes dans 'clients' avec 'load data local infile': écrivez d'abord un fichier disque 'cust_data.txt' de toutes les données client, avec les données de colonne séparées d'une manière ou d'une autre (peut-être par des virgules), puis dire quelque chose comme:

load data local infile 'cust_data.txt' replace into table customers fields terminated by ',' lines terminated by '\n';

pouvez-vous structurer la requête de telle sorte que vous pouvez utiliser le fichier de sortie de votre client directement, sans première mise en scène dans « cust_data.txt »? Ce serait la réponse à la prière d'une jeune fille.

Il devrait être assez rapide pour vous: vous serez surpris!

ref: http://dev.mysql.com/doc/refman/5.0/en/load-data.html

+0

Mais il y aura quelques minutes disponibles des données incomplètes dans notre webapp juste après TRUNCATE ... :( Et je ne crois pas, que le remplacement des requêtes SQL normales d'importation de requête SQL peut sauver beaucoup de temps ... Ou peut-être Le processus lui-même peut, mais nous devons appeler beaucoup d'URL et récupérer XML/JSON à partir d'eux et cela prend vraiment beaucoup de temps.Ma priorité est aussi l'intégrité et l'exhaustivité des données –

+0

Tronquer la table à chaque fois signifie que vous risquez de perdre des données - – symcbean

+0

Juste demander, ne pas discuter: comment/où tronque la table à chaque fois risque de perte de données? Je dois croire que l'état «actuel» de l'info du client est toujours autour de quelque part , intacte et complète, chez le client de Radek, et est donc disponible pour reconstituer la table 'client' à tout moment. Merci! –

0

Si votre client peut exporter les données sous forme de fichier csv, vous pouvez utiliser SQL Data Examiner http://www.sqlaccessories.com/SQL_Data_Examiner mettre à jour les enregistrements dans la base de données cible (insertion/mise à jour/suppression) en utilisant le fichier csv en tant que source.