[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
gtid_mode = ON
enforce-gtid-consistency = ON
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1
# binlog-do-db = biz_db # 可選:只同步指定庫
# binlog-ignore-db = mysql,sys,performance_schema,information_schema
重啟:`systemctl restart mysqld`
CREATE USER 'repl'@'192.168.100.%' IDENTIFIED BY 'StrongReplPass!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.100.%';
FLUSH PRIVILEGES;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
-- 記錄 File (如 mysql-bin.000001) 和 Position (如 890)
UNLOCK TABLES;
[mysqld]
server-id = 2 # 唯一,≠ Master
relay-log = relay-bin # 獨立 Relay Log 名稱
log-slave-updates = ON # 關鍵:支撐級聯/雙主
gtid_mode = ON
enforce-gtid-consistency = ON
# replicate-do-db = biz_db # 從庫過濾 (可選)
# replicate-ignore-db = mysql,sys,...
重啟:`systemctl restart mysqld`
-- GTID 模式 (推薦,無需 File/Position)
CHANGE MASTER TO
MASTER_HOST='192.168.100.10',
MASTER_USER='repl',
MASTER_PASSWORD='StrongReplPass!',
MASTER_PORT=3306,
MASTER_AUTO_POSITION=1;
-- 非 GTID 模式 (舊版兼容)
CHANGE MASTER TO
MASTER_HOST='192.168.100.10',
MASTER_USER='repl',
MASTER_PASSWORD='StrongReplPass!',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=890;
START SLAVE;
SHOW SLAVE STATUS\G
-- 核心確認:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
| 現象 | 關鍵字段 | 定位方向 | 修復命令/動作 |
|---|---|---|---|
| I/O 線程未運行 | `Slave_IO_Running: No` `Slave_IO_State: Connecting...` | 網絡不通/防火牆/權限/賬號/主庫 bind-address | `START SLAVE IO_THREAD` / 修正網絡權限 / `CHANGE MASTER TO` 重定位 |
| SQL 線程未運行 | `Slave_SQL_Running: No` `Last_SQL_Error: ...` | 主鍵衝突/Schema 不同/字符集/長度截斷/外鍵 | 1. 修正數據 → `START SLAVE SQL_THREAD` 2. 跳過錯誤 (非 GTID):`SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE SQL_THREAD;` 3. GTID 模式跳過:`SET GTID_NEXT='aaa-bbb-ccc:10'; BEGIN; COMMIT; SET GTID_NEXT=AUTOMATIC;` |
| 延遲高 | `Seconds_Behind_Master: 大` `Slave_IO_State: Waiting...` | Slave 資源不足/長事務/單線程回放/主庫寫入過快 | 啟用並行復制:`slave_parallel_workers=8`, `slave_parallel_type=LOGICAL_CLOCK` / 優化慢 SQL / 升級硬件 |
| Relay Log 積壓 | `Relay_Log_Space` 大 | SQL 線程慢於 I/O 線程 | 設置 `relay_log_space_limit=10G` / 並行復制 / 監控告警 |
| 角色 | 命令 | 用途 |
|---|---|---|
| Master | `SHOW MASTER STATUS` | 當前 Binlog 文件/位置/GTID |
| `SHOW SLAVE HOSTS` | 已連接 Slave 列表 (需 `report-host/port`) | |
| `SHOW BINLOG EVENTS [IN 'file' FROM pos LIMIT n]` | 解析 Binlog 事件內容 | |
| `PURGE BINARY LOGS TO 'file'` | 刪除指定文件**之前**的 Binlog (確認 Slave 已回放) | |
| `PURGE BINARY LOGS BEFORE 'date'` | 按時間刪除舊 Binlog | |
| `RESET MASTER` | 重置 Binlog 索引/文件 (僅全新初始化用,**慎用**) | |
| `SET SQL_LOG_BIN=0/1` | 當前會話禁用/啟用 Binlog 寫入 (需 `SUPER`) | |
| `FLUSH LOGS` | 切換新 Binlog 文件 (觸發 `FLUSH LOGS` 事件) | |
| Slave | `START SLAVE [IO_THREAD|SQL_THREAD]` | 啟動復制 (可單獨啟動某線程) |
| `STOP SLAVE [IO_THREAD|SQL_THREAD]` | 停止復制 | |
| `CHANGE MASTER TO ...` | 動態修改 Master 連接信息/位置/GTID 模式 | |
| `RESET SLAVE [ALL]` | 重置 Slave 狀態 (清除 master.info/relay-log.info/GTID 執行集合) | |
| `SET GLOBAL SQL_SLAVE_SKIP_COUNTER=n` | 跳過 n 個錯誤事件 (**非 GTID 模式**) | |
| `SHOW SLAVE STATUS\G` | 完整狀態診斷 (核心指標見上表) | |
| `SHOW RELAYLOG EVENTS [IN 'file' FROM pos LIMIT n]` | 解析 Relay Log 事件 (定位 SQL 線程錯誤位置) | |
| `PURGE MASTER LOGS ...` | 從庫刪除已同步的 Master Binlog (謹慎) | |
| `LOAD DATA FROM MASTER` | 從 Master 熱備份同步 (舊版/特定引擎,不推薦) |
-- Slave 端動態生效 (需 STOP SLAVE 後設置)
STOP SLAVE;
SET GLOBAL slave_parallel_workers = 8; -- 工作線程數 (CPU 核心數參考)
SET GLOBAL slave_parallel_type = 'LOGICAL_CLOCK'; -- 並行策略:基於組提交順序 (推薦)
-- DATABASE: 按庫並行 (庫少效果差)
START SLAVE;
MySQL Replication 搭建核心在於:**GTID 模式簡化定位、雙邊 `server-id` 唯一、`log-slave-updates` 支撐拓撲擴展、並行復制消除延遲**。掌握 `CHANGE MASTER TO`、`SHOW SLAVE STATUS` 關鍵字段語義、IO/SQL 線程分離排查、GTID/非 GTID 跳過錯誤差異,即可應對 90%+ 生產復制故障。建議將此手冊作為運維 SOP 存檔,定期演練故障注入與恢復流程。