2010-06-23 40 views
0

我們有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的方式,因爲據我所知......

但這個解決方案不是解決刪除記錄的問題。如果某些客戶端從數據庫中刪除,而現在不在導出中,該怎麼辦?

首先我把整個表格填滿,然後再填充一遍? 或者我應該用PHP中的所有記錄填充一些數組,然後再次遍歷它並刪除不在XML/JSON中的記錄?

我認爲必須有更好的解決方案。

我很感興趣,在服務表現的方式最好的解決辦法,因爲我們要進口成千上萬的記錄和全進口的過程可能需要大量的時間

回答

1

我很感興趣,在服務表現的方式,最好的解決辦法

如果它在客戶端,使用MySQL複製MySQL的 - 客戶端的主機和您的結束爲奴隸。您可以使用直接饋送(您可能希望通過VPN運行此功能),也可以使用斷開連接模式(向您發送bin日誌以前滾)。

我們的客戶爲我們提供了客戶信息的XML/JSON出口的網址,從他的CMS

這是一個非常糟糕的主意 - 和聽起來像你想使溶液配合問題(它沒有)。 HTTP不是通過互聯網傳輸大型數據文件的媒介。這也意味着遠程服務器必須做很多工作才能使數據可用(假設它甚至可以識別需要複製的數據 - 正如您所指出的那樣,目前該功能無法爲刪除的記錄工作)。不管網絡協議如何,後一點都是如此。

因爲本地鏡像將幾乎總是不一致,所以您肯定無法直接在堆棧中的較低級別跨數據庫複製大量數據(例如嘗試使用rsync來複制數據文件)。

C.

0

假設你正在使用MySQL,我知道什麼是唯一SQL:

這是真的,你的客戶的CMS的出口總是包含了所有他目前的客戶數據?如果這是真的,那麼最好是刪除或截斷'客戶'表;也就是說,從一開始就扔掉昨天的客戶表並重新構建它。

但是,您不能使用'插入':每天需要花費大約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

+0

但是我們的webapp會有幾分鐘不完整的數據在TRUNCATE之後...... :( 而且我不相信,替換導入SQL查詢的正常SQL查詢可以節省那麼多時間......或者也許這個過程本身可以,但是我們必須調用更多的URL並從中獲取XML/JSON,這確實需要很多時間,我的優先級也是數據的完整性和完整性 – 2010-06-23 10:56:33

+0

每次截斷表意味着您可能會丟失數據 - 而不是爲了備份目的而想要做什麼 – symcbean 2010-06-23 11:37:44

+0

只要問,不要爭論:每當風險數據丟失時,如何/在哪裏截斷表格?我必須相信客戶信息的「當前」狀態總是在某處,完整和完整,在Radek的客戶端;因此可以隨時重新構建'客戶'表。我錯過了什麼?謝謝! – 2010-06-23 13:09:47