環境:Windows 2000 + MySQL 4.0.4-beta-max-nt-log (示例版本),原理通用於 5.x/8.x。
| 模式 | 拓撲 | 用途 | 衝突風險 |
|---|---|---|---|
| 主從單向 | A → B | 讀寫分離、備份、報表 | 無 (單寫入點) |
| 雙主熱備 | A ⇄ B | 高可用、雙活寫入 | 高 (需自增錯開、業務路由) |
| 鏈式複製 | A → B → C | 多級讀擴展 | 無 |
| 星型複製 | A → B/C/D | 一主多從 | 無 |
# Master 必備
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-do-db = sync_db # 僅同步指定庫 (可選)
# binlog-ignore-db = mysql # 排除系統庫
# Slave 必備
[mysqld]
server-id = 2
master-host = 10.10.10.22
master-user = repl
master-password = replpass
master-port = 3306
master-connect-retry = 60
replicate-do-db = sync_db
replicate-ignore-db = mysql
relay-log = relay-bin
log-slave-updates = 1 # 鏈式/雙主必開
read-only = 1 # 防止誤寫入
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'slave_ip' IDENTIFIED BY 'pass';FLUSH TABLES WITH READ LOCK;,記錄 SHOW MASTER STATUS (File, Position)。CHANGE MASTER TO ... MASTER_LOG_FILE='...', MASTER_LOG_POS=...;START SLAVE;,驗證 SHOW SLAVE STATUS\G 兩個 Yes、Seconds_Behind_Master=0。
# 在 Master (A) 追加 Slave 配置
master-host = 10.10.10.53
master-user = repl
master-password = replpass
replicate-do-db = sync_db
master-connect-retry = 10
# 在 Slave (B) 追加 Master 配置
log-bin = mysql-bin
binlog-do-db = sync_db
防衝突鐵律:
auto_increment_offset (A=1, B=2) + auto_increment_increment (2)。Seconds_Behind_Master、Slave_*_Running、Binlog 傳輸延遲。| 故障 | 現象 | 處理 |
|---|---|---|
| IO 線程掛起 | Slave_IO_Running=No | 檢查網絡/防火牆/賬號/主機名/DNS;telnet master 3306 |
| SQL 線程報錯 | Slave_SQL_Running=No | SHOW SLAVE STATUS\G 看 Last_Error;主鍵衝突→手動修復/跳過;結構差異→同步 DDL |
| 延遲過大 | Seconds_Behind_Master > 阈值 | 優化慢查詢、升級 Slave 硬體、開啟並行複製 (5.6+ slave_parallel_workers) |
| Binlog 丟失 | Slave 要求的 Binlog 已被 PURGE | 重新同步基線 (重做步驟 2-5),調大 expire_logs_days |