我遇到輕微問題。故事如下:從客戶端到主服務器同步mysql表數據
我有一個文件存檔系統(用PHP編寫),運行在多個客戶端(目前有23個)。在他們的系統上他們只有他們的文件。每天晚上,他們都需要「同步」到現場的主數據庫(中央服務器)。我可以從中央服務器訪問每個MySQL數據庫,因此連接到它們是沒有問題的。
我有一個連接到客戶端數據庫的腳本,選擇從同步列='0000-00-00 00:00:00'(默認表示它沒有同步)的表中的所有條目。然後,我會遍歷每條記錄,將其插入到中央服務器,並將客戶端數據庫記錄上的同步時間設置爲執行腳本的時間。這種方式很有效,但顯然在多個查詢中有很大的開銷,我現在剛剛注意到了這些問題。
每個客戶端每天可以生成多達2000 - 3000個奇數文檔。有了這些大數字,它會花費太長時間(1秒/ 2文檔)。
有沒有更好的解決我的問題?最好是一個PHP腳本解決方案,因爲我需要做日誌來檢查一切是否成功。
感謝
編輯: 我現在的流程是:
- 選擇所有未同步數據
- BEGIN TRANSACTION
- 插入記錄到中央數據庫服務器
- 選擇來自客戶端的文檔記錄
- 將文檔到中央數據庫服務器
- 更新同步列在客戶端
- 更新同步列在服務器上
- 提交交易
這是中央服務器上運行的腳本。 現在我想到了,我可以刪除第7步並將其作爲第5步的一部分,但這不會大大減少處理時間。
這個ID不是問題。那些不需要同步。我通過其他各欄獲得正確的記錄。我只是使用ID將docarch_printout(關於文檔的所有細節)錶鏈接到docarch_printout_docs表(1 - 1僅包含文檔)。另一個問題是我們沒有永久連接到客戶端。有些撥打按需ISDN線路。由於這一點,我不認爲聯邦表會起作用。不錯的想法壽,從來不知道MySQL有這樣的選擇。 – Skippy 2010-08-19 11:25:05
好吧,我想你可以在程序中存儲聯邦表的create sql。然後,當您連接到客戶端時,運行創建腳本。然後在完成後放下它(所以它只在主動同步時使用連接)... – ircmaxell 2010-08-19 11:32:58
正確。我非常喜歡這個想法。 Everythng似乎很棒,但是,我需要同步由id字段引用的2個表(1-1關係)。一個是細節,另一個是實際文檔。簡單地說,它只是一張桌子。對此有任何進一步的想法?謝謝。 – Skippy 2010-08-19 12:29:50