MySQL Replication 的 Slave 突然停止,要如何找到問題並解決呢?
MySQL Replication 遇到 1062 錯誤解法
MySQL Slave 停止的話,可以從 show slave status \G 看問題,就可以找到是錯誤代號:1062 造成的
1062 的錯誤是 Table 裡面有 Duplicate Key (重複的 Primay key) 造成,解法這兩篇都有:
1062 發生的主因是 MySQL Slave 有一筆資料(PK id: 100),Master 沒有,但是 Master 寫入了一筆 (PK id: 100),然後 Master Log 寫入到 Slave,Slave 發現 Primary Key 重複,於是就卡住停止(理論上不該發生這種事)
通常解法就是跳過這筆,或者將 Slave 那筆資料刪除即可,跳過那筆的作法:
- STOP SLAVE SQL_THREAD;
- SET GLOBAL sql_slave_skip_counter = 1;
- START SLAVE SQL_THREAD;
現在 Linux 系統很多錯誤訊息都跟以往位置不太一樣,紀錄其它地方的 Log:
MySQL 遇到的錯誤訊息,現在在 /var/log/syslog
- less /var/log/syslog # 搜尋:[ERROR]
- Dec 12 01:11:01 mysqld[231995]: 2025-12-12T01:11:01.672990+08:00
- [ERROR] Slave SQL for channel '': Worker 4 failed executing transaction 'ANONYMOUS' at master log mysql-bin.009016, end_log_pos 64252921;
- Could not execute Write_rows event on table user;
- Duplicate entry '42698053' for key 'PRIMARY', Error_code: 1062;
- handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.009016, end_log_pos 64252921, Error_code: 1062
上述錯誤訊息要注意的就是:mysql-bin.009016, end_log_pos 64252921;,要找到發生事情的語法:
- ssh master
- mysqlbinlog --no-defaults --base64-output=DECODE-ROWS -vv mysql-bin.009016 --start-position=64252921 --stop-position=64253050 # 但是這邊只看到 commit 的語法
- 上述語法得往回去看的話,直接 mysqlbinlog --no-defaults --base64-output=DECODE-ROWS -vv mysql-bin.009016 | less # 搜尋 64252921 後再往上拉即可