首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 主從復制原理深度解析:從配置到線程模型、文件機制、故障處理全景圖

     編輯:MySQL 資料庫相關知識

核心配置速覽

Master 端

[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
gtid_mode = ON
enforce_gtid_consistency = ON

Slave 端

[mysqld]
server-id = 2
relay_log = mysql-relay-bin
log-slave-updates = 1
read_only = 1
gtid_mode = ON
enforce_gtid_consistency = ON
# CHANGE MASTER TO ... (動態配置,不寫死 my.cnf)

驗證命令

-- Master
SHOW MASTER STATUS;

-- Slave
SHOW SLAVE STATUS\G
-- 關鍵指標:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

復制核心原理:三線程協作模型

主從復制架構圖

線程位置職責關鍵文件
Binlog Dump (IO)Master讀取 Binlog 發送給 Slave IO 線程mysql-bin.xxxxxx
IO ThreadSlave接收 Binlog 事件 → 寫入 Relay Log → 更新 master.infoRelay Log, master.info
SQL ThreadSlave讀取 Relay Log → 解析為 SQL → 執行 → 更新 relay-log.infoRelay Log, relay-log.info

關鍵文件詳解

1. master.info(IO 線程維護)

行號  內容
1     行數
2     Master_Log_File
3     Read_Master_Log_Pos
4     Master_Host
5     Master_User
6     Password (加密)
7     Master_Port
8     Connect_Retry
9-14  SSL 相關參數

作用:Slave 重啟後知曉從哪個 Binlog 位置繼續拉取。

2. relay-log.info(SQL 線程維護)

1  Relay_Log_File
2  Relay_Log_Pos
3  Relay_Master_Log_File
4  Exec_Master_Log_Pos

作用:記錄 SQL 線程執行進度,用於崩潰恢復定位。

3. Relay Log(中繼日志)

  • 格式同 Binlog,可用 mysqlbinlog 解析
  • 命名:host_name-relay-bin.nnnnnn
  • SQL 線程執行完畢自動刪除,FLUSH LOGS 可手動輪轉

啟動位點確定邏輯(關鍵)

  1. 啟動時讀取 master.info → 若存在,完全忽略 my.cnf/命令行參數
  2. 若不存在 → 使用配置文件/命令行參數
  3. 若需強制覆蓋 → 刪除 master.info + 重啟 或運行時 CHANGE MASTER TO

⚠️ 大坑:修改 my.cnf 的 master-host/master-user 等參數後重啟不生效,因為 master.info 優先級最高!

常見故障與處理

1. 跳過錯誤事件

STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = N;  -- N=1 普通語句, N=2 涉及 AUTO_INCREMENT
START SLAVE;

2. 關鍵參數:log-slave-updates

  • 啟用後,Slave 將執行的 SQL 寫入自身 Binlog
  • 支撐 A → B → C 鏈式復制
  • 必須配合 log-bin 使用

3. 關鍵參數:slave-skip-errors

[mysqld]
slave-skip-errors = 1062,1032  -- 指定錯誤碼
# 或(極度不推薦)
slave-skip-errors = all

警告:會導致主從數據不一致且難以發現,僅限極端場景臨時使用。

無停機搭建 Slave 最佳實踐

方法一:熱備份 + Binlog 位點(推薦)

  1. Master:FLUSH TABLES WITH READ LOCK;
  2. 記錄 SHOW MASTER STATUS 位點
  3. 備份數據目錄:tar czf /backup/mysql.tar.gz /var/lib/mysql
  4. UNLOCK TABLES;
  5. Slave 解壓備份 → 配置 CHANGE MASTER TO MASTER_LOG_FILE=..., MASTER_LOG_POS=... → START SLAVE

方法二:mysqldump --master-data(較慢)

mysqldump --master-data=2 --single-transaction --all-databases > dump.sql
# 導入 Slave 後自動包含 CHANGE MASTER TO 信息

方法三:LOAD DATA FROM MASTER(已棄用,僅 MyISAM)

Slave 斷開重連機制

  • 默認 60 秒重試一次(master-connect-retry)
  • 網絡斷開、Master 重啟均會自動重連
  • Master 無感知 Slave 數量/狀態

備份 Slave 時必備文件

  1. 數據目錄
  2. master.info
  3. relay-log.info
  4. Relay Log 文件
  5. 若有 LOAD DATA INFILE:SQL_LOAD-* 臨時文件

恢復時:
有 Relay Log → 直接啟動
無 Relay Log 但有 relay-log.info → 用 CHANGE MASTER TO MASTER_LOG_FILE=..., MASTER_LOG_POS=... 定位

總結:復制鏈路可靠性三要素

  1. 配置規範:GTID + ROW + 唯一 server-id + 專用賬號 + log-slave-updates
  2. 監控全覆蓋:IO/SQL 線程狀態、Seconds_Behind_Master、Binlog/Relay Log 磁碟佔用
  3. 故障預案:跳過計數器使用規範、GTID 定位切換、定期 pt-table-checksum 校驗

理解三線程模型與四大文件機制,是排查 90% 復制疑難雜癥的鑰匙。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved