代码之家  ›  专栏  ›  技术社区  ›  Radek Simko

远程永久同步

  •  0
  • Radek Simko  · 技术社区  · 14 年前

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

    据我所知,这个解决方案最好是用置换法。。。

    我应该先把整张桌子截断,然后再填一次吗? 或者我应该在PHP中用所有记录填充一些数组,然后再次遍历并删除XML/JSON中没有的记录?

    我想一定有更好的解决办法。

    我对这本书很感兴趣 因为我们要导入成千上万的记录 整个进口过程可能需要很多时间 .

    3 回复  |  直到 14 年前
        1
  •  1
  •   symcbean    14 年前

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

    如果它的mysql在客户端,使用mysql复制-客户端作为主服务器,您的端作为从服务器。您可以使用直接feed(您可能希望通过VPN运行此功能)或在断开连接的模式下(它们将bin日志发送给您以进行前滚)。

    我们的客户向我们提供了一个从CMS导出客户信息的XML/JSON URL

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

    当然,不能在堆栈中比数据库低的级别直接复制大量数据(例如,尝试使用rsync复制数据文件),因为本地镜像几乎总是不一致的。

        2
  •  0
  •   Pete Wilson    14 年前

    假设您使用的是MySQL,那么我唯一了解的SQL是:

    您的客户的CMS的导出是否总是包含他当前的所有客户数据?如果是真的,那么是的,最好删除或截断'customers'表;也就是说,扔掉昨天的customer表,从今天开始重新构建它。

    但是您不能使用“insert”:每天大约需要28小时才能插入数千个客户行。所以忘了“插入”吧。

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

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

    您是否可以构造查询,以便直接使用客户机的输出文件,而不必先将其转移到“cust\u data.txt”中?这就是少女祈祷的答案。

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

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

        3
  •  0
  •   SQLDev    14 年前

    如果您的客户可以将数据导出为csv文件,则可以使用SQL数据检查器 http://www.sqlaccessories.com/SQL_Data_Examiner 使用csv文件作为源更新目标数据库中的记录(插入/更新/删除)。