MySQL8主從數據庫複製故障

檢查從庫的狀態,發現 Slave_IO_Running :Yes ,Slave_SQL_Running :No
報錯信息如下:

Coordinator stopped because there were error(s) in the worker(s). … Worker 1 failed executing transaction …

SQL 線程在回放事務時遇到異常,複製被自動掛起。 MySQL 8 並行複製(slave_parallel_workers > 0)最常見的報錯樣式。

一、定位分析錯誤
  1. 登錄從庫
mysql> SELECT * FROM performance_schema.replication_applier_status_by_worker;

最後一行會出現類似:

1146 Worker 1 failed executing transaction ‘d841e3f6-8e07-11f0-aad4-00d861733003:15155609’ at master log mybinlog.000334, end_log_pos 11343248; Error executing row event: ‘Table ‘db.ts_list’ doesn’t exist’

  1. 可以直接看錯誤日誌
grep -A5 "d841e3f6-8e07-11f0-aad4-00d861733003:15155609" mysqld.err

日誌裏會打印 具體 SQL / 事件類型errno

3.處理方式:
在主庫上找到 表 ts_list 的創建表語句,在從庫上執行創建表;

mysql> stop slave ;
mysql> start slave;
mysql> show slave status;
mysql> show processlist;

停止同步,啓動同步,檢查狀態,看是否
Slave_IO_Running :Yes
Slave_SQL_Running :Yes
檢查同步進程是否運行。

二、另外常見錯誤

場景

日誌典型片段

出現原因

處理方案

1. 主鍵/唯一鍵衝突

Duplicate entry 'xxx' for key 'PRIMARY'

主從數據已不一致:主庫 insert 時從庫已有該行

pt-table-checksum / table-sync 確認是否只有這一行差異;

僅差異一行:SET GLOBAL sql_slave_skip_counter=1; START SLAVE;SKIP_TRANSACTION

差異很多:重建從庫或在線修復。

2. 行找不到(1032)

Could not execute Delete_rows / Update_rows … Can't find record

主庫 delete/update 時從庫已無該行

同上,用 pt-table-sync 修復後再次啓動 SQL 線程;

臨時應急可 sql_slave_skip_counter=1

3. 外鍵約束失敗(1452)

Cannot add or update a child row: a foreign key constraint fails

從庫外鍵檢查嚴格(slave_skip_errors 未忽略 1452)且數據缺失父行

① 確認 foreign_key_checks=1 導致;

② 先修復父表數據;

③ 或臨時 SET GLOBAL foreign_key_checks=OFF; START SLAVE; 再補齊數據。

4. 列不存在或類型不符

Unknown column 'col_new' … / Incorrect integer value

主庫已 DDL(加列/改列),從庫未執行或執行失敗

① 手動在從庫補跑缺失 DDL;

② 確保 log_slave_updates=ON 且 DDL 在 binlog 裏;

③ 若 GTID 連續可 STOP/START SLAVE 重新拉取。


三、MySQL 8 推薦修復步驟(GTID 環境)
  1. 找到錯誤號
mysql> SELECT LAST_ERROR_NUMBER, LAST_ERROR_MESSAGE
FROM performance_schema.replication_applier_status_by_worker
WHERE WORKER_ID=1;
  1. 若確定只有 單事務 有問題,可 注入空事務跳過(無需重啓):
-- 在主庫執行
SET GTID_NEXT='d841e3f6-8e07-11f0-aad4-00d861733003:15155609';
BEGIN; COMMIT;
SET GTID_NEXT='AUTOMATIC';

然後從庫自動繼續。

四、預防配置建議
[mysqld]
slave_parallel_workers=4              # 並行複製
slave_parallel_type=LOGICAL_CLOCK
slave_preserve_commit_order=ON
binlog_transaction_dependency_tracking=WRITESET
slave_skip_errors=0                   # 除非確定要忽略指定錯誤碼
log_slave_updates=ON                  # 級聯/故障切換必備
gtid_mode=ON                          # 方便跳過事務
五、總結

報錯是複製掛起,真正原因要去 replication_applier_status_by_worker 或錯誤日誌裏看 errno/消息
大部分的錯誤可能是 **數據不一致 → 主鍵衝突/1032/1452 ,按錯誤號,對於處理方法解決。