架構前提
- MySQL 版本 ≥ 3.23(建議 5.5+)。
- Slave 版本 ≥ Master 版本(向上相容)。
- 基於二進制日誌(Binlog)的非同步複寫。
Master 配置關鍵點
[mysqld]
server-id = 1
log-bin = mysql-bin
# 只同步指定資料庫(可選)
binlog-do-db = db1,db2
binlog-ignore-db = test,tmp
# 行基複寫(推薦,避免非確定性函數問題)
binlog_format = ROW
# 增加耐用性
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1
建立複寫帳號
-- MySQL 4.0.2+ 使用 REPLICATION SLAVE
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';
-- 4.0.2 之前舊版相容
GRANT FILE ON *.* TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';
初始資料同步(關鍵步驟)
- Master:
FLUSH TABLES WITH READ LOCK; 鎖定全庫唯讀。
- 記錄 Binlog 位置:
SHOW MASTER STATUS; 記下 File、Position。
- 備份資料:
- 物理備份(快):直接打包
datadir 目錄(tar czf /backup/master_data.tar.gz /var/lib/mysql)。
- 邏輯備份(慢):
mysqldump --master-data=1 --single-transaction --all-databases > full.sql。
- Master:
UNLOCK TABLES; 解鎖恢復寫入。
- 將備份傳輸到 Slave 並還原。
Slave 配置
[mysqld]
server-id = 2
relay-log = relay-bin
relay-log-index = relay-bin.index
# 只同步指定資料庫(可選)
replicate-do-db = db1,db2
replicate-ignore-db = test,tmp
# 從庫唯讀(防止誤寫入)
read_only = 1
啟動複寫
CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl',
MASTER_PASSWORD='slavepass',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=73;
START SLAVE;
SHOW SLAVE STATUS\G
-- 確認:
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes
-- Seconds_Behind_Master: 0
常見問題與排查
| 現象 | 可能原因 | 處理 |
| IO Thread 掛掉 | 網路不通、帳號密碼錯、防火牆、MASTER_LOG_FILE/POS 錯 | 檢查連線、CHANGE MASTER TO 重設位置 |
| SQL Thread 掛掉 | 重複鍵衝突、外鍵失敗、資料型別不符、觸發器錯誤 | SHOW SLAVE STATUS 看 Last_SQL_Error,修正資料後 START SLAVE |
| Seconds_Behind_Master 偏大 | Slave 機能不足、大交易、長鎖、單執行緒複寫瓶頸 | 升級硬體、啟用多執行緒複寫(5.6+ slave_parallel_workers)、優化慢查詢 |
| 主從資料不一致 | Slave 直接寫入、非確定性函數、Binlog 格式問題 | pt-table-checksum 驗證、pt-table-sync 修復、強制 ROW 格式 |
故障切換(Failover)考量
- 非同步複寫不保證零資料遺失(Master 崩潰時 Binlog 可能未傳至 Slave)。
- 半同步複寫(
rpl_semi_sync_master=1)可降低風險,至少一 Slave 收到 Binlog 才提交。
- 生產環境建議引入 MHA、Orchestrator、GTID + 自動故障轉移工具,勿手動切換。
- 切換前必須確認 Slave
Seconds_Behind_Master = 0。
監控指標清單
Slave_IO_Running、Slave_SQL_Running = Yes。
Seconds_Behind_Master 接近 0。
Relay_Log_Space 不持續增長。
- Master
Binlog_Dump 執行緒正常。
- 磁碟空間、InnoDB Buffer Pool 命中率。