Mysql

MySQL主主複製,可以安全地刪除兩個主控上的行嗎?

  • September 21, 2020

我們有一個 MySQL (v5.1.61) 集群,有兩個 master(和兩個 slave)。我們有一個logs帶有主鍵列的表logID。這個日誌表變得相當大,我們想從中刪除數據。所以我寫了一個腳本來做到這一點。— 在兩個 master 上執行這個腳本是否安全?它只刪除數據。我想知道的是,如果要刪除的行已經被刪除,MySQL 複製模組會做什麼?複製是否會中斷,或者刪除兩個 master 上的行是否安全?我們使用基於行的複制還是基於語句的複制有關係嗎?

範例:日誌數據刪除腳本刪除 Master A 上的第 123 行。同時,該腳本刪除了 Master B 上的同一行。然後 Master B 讀取其中繼日誌,看到:“我應該刪除第 123 行,因為它是” 在Master A上刪除,我是它的奴隸。讓我們刪除它…………但它已經消失了!” ——現在B大師會怎麼做?它會停止複制,就好像存在重複鍵錯誤一樣?或者它會認為*“好吧,我什麼都不用做”*,一切都好。

你的問題已經有了答案的關鍵。它確實依賴於基於行或基於語句的複制。

基於語句的複制

如果您執行DELETE FROM tblname WHERE blahblahblah;並且匹配的行blahblahblah不存在,那沒什麼大不了的。複製將繼續進行。如果存在細微差別,您將需要更長的時間才能在從站(或者在您的情況下,在您的情況下為任一主站)實現您的數據草稿。

基於行的複制

如果您執行DELETE FROM tblname WHERE blahblahblah;並且匹配的行blahblahblah不存在,則可能會中斷複製,因為確切的行資訊嵌入在從屬伺服器的中繼日誌中。預計該行將存在以進行刪除。它有一個錯誤程式碼:

sh-4.1# perror 1032
MySQL error code 1032 (ER_KEY_NOT_FOUND): Can't find record in '%-.192s'

您可能會看到如下錯誤日誌消息:

2014-02-27 22:03:00 4070

$$ ERROR $$從屬 SQL:無法在表 mydb.mytable 上執行 Update_rows 事件;在 ‘mytable’ 中找不到記錄,Error_code: 1032; 處理程序錯誤 HA_ERR_KEY_NOT_FOUND;事件的主日誌 mysql-bin.000166, end_log_pos 93114177, Error_code: 1032 2014-03-17 10:50:15 11596

$$ ERROR $$從屬 SQL:無法在表 mydb.mytable 上執行 Delete_rows 事件;在 ‘mytable’ 中找不到記錄,Error_code: 1032; 處理程序錯誤 HA_ERR_KEY_NOT_FOUND;事件的主日誌 mysql-bin.000337, end_log_pos 427881, Error_code: 1032

以下是討論此問題的其他連結

有關更多見解,請閱讀MySQL 文件中的基於語句和基於行的複制的優點和缺點。

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