MySQL 採用非同步單向複寫:主庫寫入 Binlog → 從庫 I/O 執行緒拉取 → 寫入 Relay Log → SQL 執行緒重放。三執行緒協作實現資料同步。
log_bin 並設定唯一 server_idserver_idGRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'password';# /etc/my.cnf
[mysqld]
server_id = 1
log_bin = mysql-bin
binlog_format = ROW # 推薦 ROW 格式,最安全
sync_binlog = 1 # 最高持久性
expire_logs_days = 7 # 自動清理舊 binlog
# 可選:只複寫特定庫
# binlog_do_db = business_db
# binlog_ignore_db = mysql,test
重啟主庫:systemctl restart mysqld
# 主庫鎖表(僅針對 MyISAM/需一致性快照)
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
# 記錄 File 與 Position,例如:mysql-bin.000003, 73
# 熱備份資料目錄(InnoDB 可用 xtrabackup 免鎖表)
tar czf /tmp/mysql_snapshot.tar.gz /var/lib/mysql
# 解鎖
UNLOCK TABLES;
# /etc/my.cnf
[mysqld]
server_id = 2
relay_log = mysql-relay-bin
log_slave_updates = 1 # 從庫也寫 binlog,支援鏈式複寫
read_only = 1 # 防止誤寫入
# 可選:只複寫特定庫
# replicate_do_db = business_db
重啟從庫,解壓主庫快照至資料目錄,確保權限正確:chown -R mysql:mysql /var/lib/mysql
CHANGE MASTER TO
MASTER_HOST = '192.168.1.100',
MASTER_USER = 'repl',
MASTER_PASSWORD = 'password',
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 # 延遲秒數,0 表示同步
Last_IO_Error: # 空白表示無錯誤
Last_SQL_Error:
| 現象 | 可能原因 | 解決方案 |
|---|---|---|
| IO_Running=No | 網路不通/帳號錯誤/主庫 binlog 被清理 | 檢查連線、重設 MASTER_LOG_FILE/POS、補全缺失 binlog |
| SQL_Running=No | 重放錯誤(主鍵衝突/外鍵失敗/結構不一致) | 檢查 Last_SQL_Error,手動修正或跳過 SET GLOBAL sql_slave_skip_counter=1 |
| Seconds_Behind_Master 偏大 | 從庫硬體較弱/大交易/長查詢阻塞 | 優化從庫配置、平行複寫、升級硬體 |
| 資料不一致 | 非複寫寫入從庫/主庫直接修改資料/跳過錯誤 | 使用 pt-table-checksum 校驗、pt-table-sync 修復 |
slave_parallel_workers = 4、slave_parallel_type = LOGICAL_CLOCKgtid_mode = ON、enforce_gtid_consistency = ON,自動定位位置,故障切換更簡單rpl_semi_sync_master_enabled = 1,主庫等待至少一從庫確認才提交,減少資料遺失風險MASTER_DELAY = 3600,延遲 1 小時重放,防誤操作(如誤 DELETE)Seconds_Behind_Master、Slave_IO_Running、Slave_SQL_Runningpt-table-checksum 驗證資料一致性主從複寫是 MySQL 高可用架構基石,標準化配置、持續監控、定期演練,才能在關鍵時刻發揮作用。