Mysql

Broken Slave MySQL:如何修復 Slave 中的 MySQL 複製 (BINLOG) 錯誤?

  • April 2, 2022

在我們開始之前,我可以提供一些關於版本的資訊,

Ubuntu - 14.04,MySQL - 5.5

我已經使用兩個 EC2 Ubuntu 實例成功配置了主從複製。我的 master 在 Ubuntu 14 中,slave 在 Ubuntu 18 中。複製成功,slave 正在復製過去 3-4 天的數據。但是,突然我的奴隸(Ubuntu 18)因查詢錯誤而停止複制。

錯誤消息: Last_SQL_Error:查詢時出現鍵“PRIMARY”的錯誤“重複條目“11379183”。預設數據庫:“測試”。查詢:‘INSERT INTO testTable (id,value1,value2,value3,value4,value5,value6) VALUES(22,“5”,“429438”,“1592499300”,“1”,“8”,“1”)’

Slave_IO_Running:是

Slave_SQL_Running:否

我試過了,

停止奴隸;

設置全域 SQL_SLAVE_SKIP_COUNTER=1;

啟動奴隸;

它幫助了我一段時間。但複製又被打破了。

我們如何解決這種複制錯誤?有沒有修復損壞的奴隸的自動化方法?

MySQL 5.5 是否可以進行基於 GTID 的複制?我認為 GTID 可從 MySQL 5.6 版獲得?

如何繞過所有重複的關鍵錯誤

有兩種方法可以繞過重複鍵錯誤

方法#1:配置它my.cnf

[mysqld]在組標題下添加此行my.cnf

[mysqld]
slave-skip-errors=1062

然後重啟mysql。

複製開始後,將繞過所有重複的密鑰錯誤。一旦Seconds_Behind_Master為0,你們都被趕上了。但是,Slave 上的數據與 Master 不同步。下一步你要怎麼做 ???

方法#2:使用自動化工具

我確定你沒有時間跑步

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

一遍又一遍地。如果自動化工具可以為您做到這一點,那不是很好嗎?嗯,這樣的工具是存在的。它被稱為pt-slave-restart

你會像這樣執行它:

pt-slave-restart --error-numbers 1062

把它放在一個 crontab 中,每分鐘關閉一次。

* * * * * pt-slave-restart --error-numbers 1062

更好的是,您可以創建一個伺服器守護程序而不使用 crontab

pt-slave-restart --error-numbers 1062 --daemonize

而且您不需要重新啟動mysqld。

無論哪種方式,pt-slave-restart都會一遍又一遍地跳過該錯誤,直到Seconds_Behind_Master為 0。當您完成從站被趕上時,停止使用pt-slave-restart.

但是,您仍然遇到與方法 #1相同的問題:Slave 上的數據與 Master 不同步。下一步你要怎麼做 ???

好的,你下一步做什麼???

您必須將 Slave 上的數據與您的 Master 同步。如果存在可以為您執行此操作的實用程序,那不是很好嗎?嗯,這樣的工具是存在的。事實上,有兩種工具。它們被稱為pt-table-checksumpt-table-sync

他們在做什麼 ???

您用於pt-table-checksum檢查 MySQL 複製的完整性。如果遇到 Master 和 Slave 之間校驗和不同的任何表,則 Slave 上的此類表是不同步的。

您用於pt-table-sync同步 MySQL 表數據。

你可以跑

pt-table-sync --print > sync_file.txt

看看會發生什麼變化(這就像真實事物的試執行)

然後你跑

pt-table-sync --execute

執行實際同步。

請閱讀 PERCONA 工具封包檔。

始終負責任地處理 PERCONA 工具包!

注意:遺憾的是,使用 MySQL 5.5 和 GTID 絕對無能為力。

如果主數據庫不是那麼大,我會重建它。您可以使用 mysqldump 之類的邏輯備份或 percona xbackup 之類的物理備份——使用時間點轉儲,這樣您就可以安全地將從站重新指向主站。

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