MySQL 主從複制採用非同步單向複制,主庫寫入 Binlog,從庫透過 I/O 執行緒拉取、SQL 執行緒重放,實現資料同步。本文提供生產級配置完整步驟。
master.info(Binlog 位置)、relay-log.info(Relay Log 位置)log-bin、設定 server-idserver-idGRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' IDENTIFIED BY 'repl_password';
FLUSH PRIVILEGES;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
-- 記錄 File (如 mysql-bin.000003) 和 Position (如 73)
-- 此處保持會話不斷開,另開終端打包資料目錄
tar -czf /tmp/mysql-snapshot.tar.gz /var/lib/mysql
UNLOCK TABLES;
scp /tmp/mysql-snapshot.tar.gz slave_host:/tmp/
# 從庫上
tar -xzf /tmp/mysql-snapshot.tar.gz -C /var/lib/mysql/
chown -R mysql:mysql /var/lib/mysql
[mysqld]
server-id = 2
relay-log = mysql-relay-bin
log-slave-updates = 1
read-only = 1
CHANGE MASTER TO
MASTER_HOST = 'master_ip',
MASTER_USER = 'repl_user',
MASTER_PASSWORD = 'repl_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
-- Last_IO_Error / Last_SQL_Error: 空
| 現象 | 可能原因 | 處理 |
|---|---|---|
| IO_Running: No | 網路不通、帳號密碼錯、Binlog 位置錯 | 檢查防火牆、重設 CHANGE MASTER TO |
| SQL_Running: No | 資料衝突、Schema 不同、外鍵失敗 | 查 Last_SQL_Error,跳過錯誤或重建從庫 |
| Seconds_Behind_Master 偏大 | 從庫效能不足、大事務、網路延遲 | 優化從庫、啟用並行複制 (slave_parallel_workers) |
gtid_mode=ON,自動定位位置,故障切換更簡單rpl_semi_sync_master=ON,主庫至少一從庫確認才提交,降低資料遺失風險slave_parallel_workers=4,多執行緒重放 Relay LogCHANGE MASTER TO MASTER_DELAY=3600,防誤刪資料 1 小時內可恢復Seconds_Behind_Master > 300、Slave_*_Running != Yes 觸發告警