基於語句的複制仍然給出重複的條目錯誤
複製的新手。我正在配置多主複製。我做了以下步驟:
- 做了一個奴隸。
- 給它配置了兩個master。
現在我正在執行以下場景:
- 斷開兩個主設備與該從設備的連接。(TEST_TABLE 最後一行的P_ID 為 30)
- 取消連接後,在兩個 MASTERS上添加一個條目(到 TEST_TABLE)。(帶有 auto_incremeent 的主鍵條目變為 31)
- 將slave重新連接到master-1(它複製帶有P_ID 31的數據)
- 將 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。這是因為如果稍後您執行 a
DELETE
或 anUPDATE
或 anINSERT... SELECT
它會影響錯誤的行。一般來說,多源複製不像一個緊密的集群——你只想用它來整合來自不同表的數據,或者在幾個不同的副本集之間共享表。**如果您想要自動解決衝突並能夠寫入集合中的任何伺服器,則您需要像Galera或InnoDB 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 僅適用於插入,不適用於更新或刪除),並且由於副作用而傾向於使複製中斷 - 加上當它中斷時,由於這種自定義設置很難修復它,所以我通常不推薦它。我建議避免使用不同的主伺服器和副本設置複製,除非它處於非常受控的環境(單獨的表或數據庫)中,而是嘗試使用集群技術。實際的決定將取決於您最終真正想要實現的目標,因為您的問題尚不完全清楚 - 所以我只是解釋了為什麼它不起作用以及人們如何使其正常工作。