主 - 主複製重複條目錯誤
我有一個主 - 主複製設置,它工作了幾天,但我不斷收到:幾天后重複輸入錯誤。
我的設置如下:荷蘭的一台伺服器和華盛頓特區的一台伺服器都執行 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
.