Mysql

將公共數據同步到多個 MySQL 數據庫

  • May 11, 2022

我的情況

我有 MySQL 數據庫,每個數據庫都有相同的模式(表結構和關係完全相同)。

在此處輸入圖像描述

Green 數據庫中的數據由其他三個共享。我有一個夜間程序,可以在 Green 數據庫中查找更改並將它們 UPSERT 到其他三個數據庫中。

將綠色數據庫視為由一個單獨的團隊更新的參考數據,但它有很多,而且每天都在變化。

在此處輸入圖像描述

最終結果是,藍色、紅色和紫色數據庫中的每一個都是其獨有的可更新記錄和綠色數據庫中可能被引用但不能修改的記錄的混合。

在此處輸入圖像描述

問題

自定義同步過程混亂且不可靠,對問題並不重要。

我的問題

有沒有更好的方法將共享(綠色)數據與其他數據庫結合起來?我希望對應用程序數據訪問層的影響最小,該訪問層專為通過夜間同步過程實現的交錯數據而設計。

考慮的想法

我考慮將綠色數據保留在自己的模式中(在同一個 MySQL 伺服器上)並為我的其他數據庫中的每個表創建一個視圖(用於查詢),以產生原始合併表的錯覺:

CREATE VIEW blue.vw_table001 AS
SELECT * FROM blue.table001 UNION 
SELECT * FROM blue.table001;

這將允許我簡單地將我的 Hibername 映射到原始表的映射替換為到相應視圖的映射。然後寫入將像今天一樣引用實際的表。

但是,這會產生兩個問題……

  1. 我必須消除所有外鍵,因為 Blue 數據庫中的記錄可以引用 Green 數據庫中的記錄。
  2. 我被告知以這種方式組合數據的性能不會很好。重要的是要知道有一些複雜的查詢會跨多個表連接,而這些表現在將跨視圖連接。

最後的想法

雖然最好不要將綠色數據複製到其他三個中(並且有一天可能會超過三個),但只要機制相對簡單可靠(我的 java 解決方案非常複雜),我就可以接受並且容易出錯)。

此外,您可能想知道在 Green 數據庫中創建的記錄與其他三個記錄之間的主鍵衝突。我們幾乎同步的邏輯將綠色記錄的原始 ID 記錄在一個特殊的列中,然後為記錄分配一個本地唯一的 ID。

在我看來,在這種情況下,基於行的複制(而不是基於語句和預設混合的複制)可能是一個合適的解決方案。

原生 mysql 複製,其實不需要主從端的表完全相同。唯一的要求是對於每個複制的 INSERT 從屬設備不應具有具有相同 PRIMARY/UNIQUE 鍵的行。反之亦然 - 對於每個 DELETE/UPDATE,相應的行應該存在。

基於行的複制按原樣直接傳播行更改。如果在 master 上刪除了包含 ID=xxxxxx 的行,則在 slave 上將刪除同一行。如果在主設備上插入了具有自動增量列的行,那麼將在從設備上插入具有相同 A/I 值的同一行,儘管從設備的自動增量計數器。

您需要一個多列主鍵:

hostID -- rowID -- col1 -- col2...

PRIMARY (hostID, rowID) with hostID=Green|Red|Blue|Purple… 將保證 PK 對於系統中的任何行都是唯一的。因此,來自主伺服器的複制事件永遠不會干擾從伺服器上的本地數據。您可以安全地操作與複製的主數據交錯的“本地”行,直到您限制為具有 local 的行hostID。此外,這種方法很容易擴展到任意數量的從站。

可能這不是一個最佳解決方案(需要大量程式碼修改),但它肯定會起作用。

引用自:https://dba.stackexchange.com/questions/312004