簡體   English   中英

如何進行跨庫信息同步?

[英]How to do cross-database information syncing?

我正在設計一個目錄,其中多個源中的數據在更改或更新時必須覆蓋其他源中的數據。 一些數據庫是 MySQL、SQL 服務器和一些信息將是 AD/LDAP。

我的問題是:這種類型的數據庫傳播是否有設計模式,以減少流量並防止錯誤? 這個項目也將在 PHP 中,所以如果有人知道我可以適應的類似開源項目,那也很好。 一些數據庫之間可能必須有一些邏輯。

您需要一些方法來標記要同步的記錄。 我們使用這樣的系統,其中每個要同步的表都有一個保持同步狀態的列。 修改記錄時,它也會修改其 state(在觸發器中),並且同步工具每隔幾分鍾查詢一次修改的記錄。

缺點是您需要大量代碼才能正確處理此問題,尤其是因為您無法直接刪除記錄。 同步工具首先需要知道並且需要執行實際的刪除。 除此之外,這種方式很難建立一個好的隊列,所以如果記錄在他們的父母之前同步,你會得到一個錯誤。 每個必須同步的表都需要一個額外的列。

所以現在有一個新的解決方案即將實施。 此解決方案為隊列使用單獨的表。 隊列包含指向其他表中記錄的指針(主鍵值和對表名/字段名的引用)。 該隊列現在是唯一監控更改的表,因此表需要做的就是實現一個觸發器,將修改的記錄標記為隊列中的已修改。 因為它是單獨表中的單個隊列,這增加了我前面提到的問題的解決方案:

  • 記錄可以立即刪除。 同步工具在隊列中找到一個 id,驗證它不再存在,因此它也將它從另一個數據庫中刪除
  • 自動解決子父依賴關系。 新的父級將在其子級之前在隊列中,而已刪除的父級將在其子級之后。 您可能會在交叉鏈接記錄中發現唯一的問題,盡管延遲提交可能是解決此問題的方法。
  • 所有表中都不需要額外的列。 只有一個隊列、一些輔助表和一個觸發器,其中包含對要同步的每個表的單個 function 調用。

不幸的是,我們還沒有完全實現這個解決方案,所以我不能告訴你它是否會更好地工作,盡管測試肯定會這樣。

請注意,該系統會進行一對一的記錄副本。 我認為這也是最好的方法。 復制數據,然后(之后)在目標服務器上處理它。 我認為在復制數據時處理數據不是一個好主意。 如果出現任何問題,您將不得不進行調試和恢復/重新計算數據的工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM