远程永久同步

时间:2010-06-23 09:27:57

标签: php sql mysql import

我们有2台服务器,其中一台是客户服务器。我们的客户正在为我们提供他的CMS中客户信息的XML / JSON导出URL,我们的任务是编写一些导入脚本,用于将数据导入到我们正在开发的webapp中。

我一直这样做:

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

据我所知,这种解决方案在permormace方面是最好的......

但是这个解决方案并没有解决删除记录的问题。如果从数据库中删除了某个客户端并且现在不在导出中,该怎么办?

Shoud我首先将整个表格TRUNCATE然后再填充它? 或者我应该在PHP中填充一些包含所有记录的数组,然后再次遍历它并删除不在XML / JSON中的记录?

我认为必须有更好的解决方案。

我对性能最佳解决方案感兴趣,因为我们必须导入数千条记录,而整个导入的过程可能需要很长时间< /强>

3 个答案:

答案 0 :(得分:1)

  

我对性能方面的最佳解决方案感兴趣

如果它的mysql在客户端,使用mysql复制 - 客户端作为主服务器,你的终端作为从服务器。您可以使用直接订阅源(您可能希望通过VPN运行)或处于断开连接模式(它们会向您发送垃圾箱日志以进行前滚)。

  

我们的客户正在向我们提供其CMS中客户信息的XML / JSON导出URL

这是一个非常愚蠢的想法 - 听起来你正试图使解决方案适合问题(它没有)。 HTTP不是通过Internet传输大型数据文件的媒介。这也意味着远程服务器必须做很多工作才能使数据可用(假设它甚至可以识别需要复制的数据 - 并且正如您所指出的那样,目前无法对已删除的记录起作用)。无论网络协议如何,后一点都是正确的。

您肯定无法直接在堆栈中的较低级别复制大量数据而不是数据库(例如,尝试使用rsync复制数据文件),因为本地镜像几乎总是不一致。

下进行。

答案 1 :(得分:0)

假设您使用的是MySQL,我唯一知道的SQL:

客户CMS的导出是否始终包含他当前的所有客户数据?如果是真的,那么最好是放弃或截断'客户'表;就是说,扔掉昨天的客户表并从头开始重建它。

但是你不能使用'insert':每天需要大约28个小时来插入数千个客户行。所以忘记'插入'。

相反,使用'load data local infile'将行添加到'customers'中:首先写入所有客户数据的临时磁盘文件'cust_data.txt',以某种方式(可能用逗号分隔)分隔列数据,然后说类似的东西:

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

您是否可以构建查询,以便您可以直接使用客户端的输出文件,而无需先将其转换为“cust_data.txt”?这将是少女祈祷的答案。

对你来说应该足够快:你会惊讶的!

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

答案 2 :(得分:0)

如果您的客户可以将数据导出为csv文件,则可以使用SQL Data Examiner {c}使用csv文件作为源更新目标数据库中的记录(插入/更新/删除)。