# MySQL主從復制重點知識整理
## 一、主從復制概述
### 1.1 基本概念
MySQL主從復制(Replication)是指將一個MySQL數據庫服務器(主庫Master)的數據復制到另一個或多個MySQL服務器(從庫Slave)的過程。主要特點包括:
- **異步復制**:默認工作模式,主庫不等待從庫確認
- **單向復制**:數據只能從主庫流向從庫
- **級聯復制**:Slave可以作為其他Slave的Master
### 1.2 核心應用場景
- **讀寫分離**:主庫寫,從庫讀
- **數據備份**:實時熱備份方案
- **高可用基礎**:故障轉移的基礎架構
- **負載均衡**:分散讀請求壓力
- **數據分析**:在從庫執行不影響業務的統計查詢
## 二、復制原理與架構
### 2.1 三線程模型
| 線程類型 | 所屬服務器 | 職責描述 |
|---------|-----------|---------|
| Binlog Dump | Master | 讀取主庫binlog并發送給Slave |
| I/O Thread | Slave | 接收Master的binlog并寫入relay log |
| SQL Thread | Slave | 讀取relay log并重放事件 |
### 2.2 數據流轉過程
1. 主庫將變更記錄到二進制日志(binlog)
2. 從庫I/O線程請求主庫的binlog
3. 主庫Binlog Dump線程推送日志到從庫
4. 從庫將日志寫入中繼日志(relay log)
5. 從庫SQL線程重放relay log中的事件
### 2.3 重要日志文件
- **binlog**:主庫的二進制日志,三種格式可選
- STATEMENT:記錄SQL語句(5.7默認)
- ROW:記錄行數據變化(8.0默認)
- MIXED:混合模式
- **relay log**:從庫的中繼日志,格式與binlog相同
- **master.info**:從庫保存的主庫連接信息(8.0后存入表)
- **relay-log.info**:從庫執行的relay log位置信息
## 三、配置實踐指南
### 3.1 主庫配置(my.cnf)
```ini
[mysqld]
server-id = 1 # 必須唯一
log_bin = mysql-bin # 開啟binlog
binlog_format = ROW # 推薦使用ROW格式
binlog_row_image = FULL # 記錄完整的行信息
sync_binlog = 1 # 每次事務提交都刷盤
expire_logs_days = 7 # 自動清理舊日志
[mysqld]
server-id = 2 # 區別于主庫
relay_log = mysql-relay # 中繼日志位置
read_only = ON # 設為只讀(超級用戶除外)
log_slave_updates = ON # 級聯復制時需要
-- 主庫創建復制賬號
CREATE USER 'repl'@'%' IDENTIFIED BY 'SecurePass123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
-- 從庫配置主庫信息(8.0+)
CHANGE MASTER TO
MASTER_HOST = 'master_host',
MASTER_USER = 'repl',
MASTER_PASSWORD = 'SecurePass123!',
MASTER_PORT = 3306,
MASTER_AUTO_POSITION = 1; # GTID模式
-- 啟動復制
START SLAVE;
全局事務標識(Global Transaction Identifier):
- 格式:source_id:transaction_id
- 優點:
- 簡化故障恢復
- 自動定位復制位置
- 避免重復執行事務
- 啟用方式:
gtid_mode = ON
enforce_gtid_consistency = ON
確保至少一個從庫接收binlog后主庫才提交:
-- 主庫安裝插件
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
-- 從庫安裝插件
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
-- 配置參數
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
人為設置從庫延遲(用于誤操作恢復):
CHANGE MASTER TO MASTER_DELAY = 3600; # 延遲1小時
-- 基于庫的并行復制(5.6)
slave_parallel_workers = 4
-- 基于邏輯時鐘的并行復制(5.7+)
slave_parallel_type = LOGICAL_CLOCK
slave_parallel_workers = 8
SHOW MASTER STATUS; # 查看主庫binlog位置
SHOW SLAVE STATUS\G # 查看從庫復制狀態
SHOW PROCESSLIST; # 查看復制線程
-- 復制延遲監控(Seconds_Behind_Master不完全準確)
SELECT
NOW() - MAX(ts) AS replica_lag
FROM
mysql.replica_status;
主鍵沖突:
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;
網絡中斷:
Last_IO_Error
字段數據不一致:
Seconds_Behind_Master
和復制錯誤設置監控注:本文基于MySQL 8.0版本整理,部分參數在早期版本可能不同。生產環境建議結合官方文檔進行配置。 “`
(全文約1350字,涵蓋MySQL主從復制核心知識點)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。