首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL InnoDB 主從復制同步經驗總結:DRBD+Heartbeat 架構下的 1062 錯誤根治

     編輯:MySQL 綜合教學

MySQL InnoDB 主從復制同步經驗總結:DRBD+Heartbeat 雙主架構下的 1062 錯誤根治

在將電子商務核心系統從 MyISAM 遷移至 InnoDB、架構升級為 DRBD+Heartbeat 雙主一從的過程中,遭遇並解決了經典的 Error 1062 Duplicate entry 同步中斷問題。本文歸納核心經驗,供同類架構參考。

一、架構背景

  • 業務類型:電商交易(OLTP),涉及支付、訂單、庫存,強一致性要求。
  • 存儲引擎:全表 InnoDB(除系統表),支持事務、行鎖、外鍵、崩潰恢復。
  • 高可用架構:DRBD 雙主同步複制存儲層 + Heartbeat 漂移 VIP + MySQL 單實例掛載,一主一備一從。
  • 復制模式:Row-based Binlog (RBR),binlog_format=ROW。

二、核心認知糾偏

三、1062 錯誤根因與解決

現象

Last_SQL_Error: Error 'Duplicate entry 'd36ad91bff36308de540bbd9ae6f4279' for key 'PRIMARY'' 
on query: INSERT INTO `lee_sessions` ...

根因分析

  1. 初期使用 mysqldump --single-transaction 熱備份主庫快照建立從庫。
  2. --single-transaction 僅保證事務一致性,不鎖表、不記錄 Binlog 位點,導致備份完成時 Binlog 已推進,從庫啟動復制時位點偏早,重放已執行事務 → 主鍵衝突。
  3. InnoDB 表 lee_sessions 極高頻寫入,衝突概率極大。

解決方案:改用 --master-data=1 記錄精確位點

mysqldump -uroot -p --quick --flush-logs --master-data=1 --single-transaction myproject > myproject.sql
  • --master-data=1:導出文件包含 CHANGE MASTER TO MASTER_LOG_FILE='...', MASTER_LOG_POS=...; 可執行語句。
  • --master-data=2:位點語句被註釋,需手動提取。
  • 注意:--master-data 會隱式加 --lock-all-tables,不可與 --single-transaction 共用。此處去掉 --single-transaction,接受短暫全局鎖換取位點精確。

提取位點並配置從庫

grep "CHANGE MASTER" myproject.sql
# 輸出:CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000008', MASTER_LOG_POS=106;

# 從庫執行
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000008', MASTER_LOG_POS=106;
START SLAVE;

長期觀察結果

SHOW SLAVE STATUS\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
Last_SQL_Error: (空)
# 持續數週無 1062 復發

四、InnoDB 復制最佳實踐清單

  1. 備份建立從庫:優先 --master-data=1(鎖表)或 XtraBackup 物理熱備(無鎖、含位點),避免 --single-transaction 單獨使用。
  2. 主庫 sync_binlog=1、innodb_flush_log_at_trx_commit=1,雙 1 配置保證零數據丟失。
  3. 從庫 read_only=1、super_read_only=1(5.7+),防止誤寫導致分歧。
  4. 啟用 slave_parallel_workers > 0(5.6+),基於組提交並行回放,降低延遲。
  5. 監控 Seconds_Behind_Master、Relay_Log_Space、Last_SQL_Error,納入告警。
  6. 定期 pt-table-checksum 校驗主從一致性,發現不一致立即修復。
  7. DRBD 層面:protocol=C 同步寫入,al-extents 調大減少元數據 IO。

五、遷移 MyISAM → InnoDB 關鍵收益

  • 事務保障支付/扣款原子性,杜絕「扣款成功訂單失敗」類錯誤。
  • 行鎖支撐高併發寫入,MyISAM 表鎖導致寫入串行化。
  • 崩潰恢復時間從「小時級修復 MyISAM」降至「秒級 Redo Log 重放」。
  • DRBD 切換時 InnoDB 自動恢復無需人工干預,MyISAM 需 myisamchk -r 修復。

「備份位點精確化 + InnoDB 事務語義 + 並行回放 + 持續校驗」四位一體,是 MySQL InnoDB 主從復制穩定運行的核心秘訣。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
誤區正確認知
復制是同步的MySQL 復制本質是異步的,存在毫秒到秒級延遲;半同步需插件支持。
Slave 必須開啟 Binlog純從庫無需開啟 Binlog;僅當 Slave 同時作為其他實例的 Master(鏈式/雙主)時才開啟。
server-id 可重複拓撲內所有實例 server-id 必須全局唯一,否則報錯 Fatal error: equal MySQL server ids。