Replication

基於語句的複制仍然給出重複的條目錯誤

  • November 28, 2018

複製的新手。我正在配置多主複製。我做了以下步驟:

  1. 做了一個奴隸。
  2. 給它配置了兩個master。

現在我正在執行以下場景:

  1. 斷開兩個主設備與該從設備的連接。(TEST_TABLE 最後一行的P_ID 為 30
  2. 取消連接後,在兩個 MASTERS上添加一個條目(到 TEST_TABLE)。(帶有 auto_incremeent 的主鍵條目變為 31)
  3. 將slave重新連接到master-1(它複製帶有P_ID 31的數據)
  4. 將 slave 重新連接到 master-2(這裡出現Duplicate Entry ERROR

如果我必鬚麵對這個問題,我無法弄清楚複製的目的是什麼?還是我錯過了一些太基本的東西?

我已經使用基於行的複制基於語句的複製完成了此操作,但同樣的錯誤。那麼 SBR 的意義何在?只記錄語句而不是行數據?或者如果它正在複製語句,為什麼要發出相同的 P_ID 而不僅僅是一般地執行命令並將 id 自動遞增到 32。

參考查詢可以是:**INSERT INTO TEST_TABLE ('firstname','lastname') VALUES('f_name_entry','l_name_entry')**

如果我真的把這一切都弄錯了,這是複制的確切行為,那麼解決方案是什麼?

整整一周都在為此頭疼。請詢問是否缺少任何東西,如果我無法解釋某些事情,請抱歉。提前感謝您承擔我。

複製的行為完全符合預期- 你寫了同一行(如,它在兩個主伺服器上具有相同的 id,即使數據不同),但多主伺服器設置不是一個緊密的集群——它只是重做副本上發生的事情與主伺服器上發生的事情相同,直到 ids。它不會自動處理衝突解決。

我了解您希望使用基於語句的複制來複製實際的 SQL(與 ROW 相比,它複製以前的舊行和新行),因此它會獲得一個新的、正確的 ID。雖然這正是發生的事情(它被寫入二進制日誌),但它還在內部儲存了 auto_increment id。這是因為如果稍後您執行 aDELETE或 anUPDATE或 anINSERT... SELECT它會影響錯誤的行。

一般來說,多源複製不像一個緊密的集群——你只想用它來整合來自不同表的數據,或者在幾個不同的副本集之間共享表。**如果您想要自動解決衝突並能夠寫入集合中的任何伺服器,則您需要像GaleraInnoDB Cluster**這樣的集群技術,當在多個主機上插入相同的數據時,這將使您的寫入失敗或以協調的方式工作。

從技術上講,可以按照您想要的設置進行工作 - 有一個名為(**auto_increment_increment**與所以你配置:auto_increment_offset``auto_increment

MASTER 1:
auto_increment_increment=2
auto_increment_offset=0

MASTER 2:
auto_increment_increment=2
auto_increment_offset=1

所以autoincs不會碰撞。還有其他多個選項,例如刪除或重命名副本上的 auto_increment 列或在其上創建觸發器,兩者都在使用STATEMENT基於複製時生成正確的程式碼。

但是,這兩個選項非常脆弱(例如 auto_increment_increment 僅適用於插入,不適用於更新或刪除),並且由於副作用而傾向於使複製中斷 - 加上當它中斷時,由於這種自定義設置很難修復它,所以我通常不推薦它。我建議避免使用不同的主伺服器和副本設置複製,除非它處於非常受控的環境(單獨的表或數據庫)中,而是嘗試使用集群技術。實際的決定將取決於您最終真正想要實現的目標,因為您的問題尚不完全清楚 - 所以我只是解釋了為什麼它不起作用以及人們如何使其正常工作。

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