Mysql

主 - 主複製重複條目錯誤

  • November 24, 2016

我有一個主 - 主複製設置,它工作了幾天,但我不斷收到:幾天后重複輸入錯誤。

我的設置如下:荷蘭的一台伺服器和華盛頓特區的一台伺服器都執行 Windows Server 2012 R2 和 MySQL 5.6.15 X64。

我已經按照這個教程

我的my.ini文件包含以下內容:

荷蘭伺服器

server-id = 1
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1
log_bin=mysql-bin
log_error=mysql-bin.err
binlog_do_db=joomlatest
binlog_do_db=sapp
binlog_do_db=tcadmin
binlog_do_db=whmcs

華盛頓特區伺服器

server-id = 2
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 2
log_bin=mysql-bin
log_error=mysql-bin.err
binlog_do_db=joomlatest
binlog_do_db=sapp
binlog_do_db=tcadmin
binlog_do_db=whmcs

兩台伺服器都在停止從伺服器,並且都報告相同的:重複輸入錯誤。例如:

查詢時出現鍵 ‘PRIMARY’ 的重複條目 ‘4353’ 錯誤。

我怎樣才能防止這種情況發生?

恐怕您連結到的教程非常樂觀。它忘記註意它只涵蓋自動生成的情況AUTO_INCREMENT PRIMARY KEY

它建議的方法不涵蓋 a 的一般情況UNIQUE KEY,當然包括一般情況PRIMARY KEY

文章確實提到*“複製最常見的問題是主鍵衝突”*。然後它完全沒有提到所有其他問題……

因此,無論如何,任何UNIQUE KEY衝突都會導致您的複制中斷,可能是雙向的。

是哪個表使您的複制失敗?那是一張帶有AUTO_INCREMENT PRIMARY KEY“一般”還是“一般”的表格PRIMARY KEY(即在非AUTO_ICNREMENT列上)?

要解決唯一鍵的一般情況,您的應用程序必須非常清楚其位置(荷蘭或華盛頓特區),並且必須避免寫入可能導致衝突的數據。或者,它可能想要使用一些同步/鎖定機制;這當然會導致延遲,因為數據必須跨越大西洋。

我是否還建議使用binlog_do_db也是幼稚和危險的。您確定不想複製mysql架構嗎?添加新模式時會發生什麼?一般正確的解決方案是在沒有過濾的情況下進行完全複製,或者很好地解釋為什麼不這樣做。

最後,我強烈反對使用主動-主動主-主複製。我過去有客戶使用它。由於這種設置,他們陷入了很多麻煩,儘管我提出了反對建議,但還是導致了許多周末和假期的破壞。

您可能想查看Galera replication。這是一個同步的主複製解決方案,我聽說它可以通過 WAN 工作。這將使您的應用程序保持無知。注意網路故障,因為您的集群的一部分將變成不可變的。

如果您不想重做完整的過程,一個很好的解決方法是使用

STOP SLAVE;    
SET GLOBAL sql_slave_skip_counter=1;
START SLAVE;

如果此類錯誤太多,一個好主意是使用 bash 腳本將其自動化。

參考: 修復重複輸入錯誤

為避免伺服器之間潛在的不一致,請不要在不執行pt-table-checksum.

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