MySQL 主從複製是實現讀寫分離、災備、高可用的基石。本文以雙節點(一主一從)為例,詳細記錄配置流程、關鍵參數、資料同步驗證與常見坑點,適用於 5.6/5.7/8.0 版本(部分參數名稱在 8.0 有變化,文中標註)。
192.168.1.100(Server ID: 1)192.168.1.101(Server ID: 2)my.cnf 路徑與啟停腳本GRANT REPLICATION SLAVE ON *.* TO 'backup'@'192.168.1.101' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
注意:多從庫需重複執行,或用 'backup'@'192.168.1.%' 批量授權。
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW # 推薦 ROW 格式,減少衝突
read-only = 0 # 主庫讀寫
binlog-do-db = test # 僅同步指定庫(多行)
binlog-ignore-db = mysql # 忽略系統庫(多行)
# 可選:過期清理、同步策略
expire_logs_days = 7
sync_binlog = 1 # 每次提交刷盤,最安全
innodb_flush_log_at_trx_commit = 1
[mysqld]
server-id = 2
log_bin = /var/log/mysql/mysql-bin.log
relay_log = /var/log/mysql/relay-bin.log
read-only = 1 # 從庫預設只讀,防誤寫
master-host = 192.168.1.100 # 5.6/5.7 風格,8.0 建議用 CHANGE MASTER TO
master-user = backup
master-password = 123456
master-port = 3306
master-connect-retry = 60 # 重連間隔秒
replicate-do-db = test # 僅複製指定庫
replicate-ignore-db = mysql # 忽略系統庫
# 可選:延遲從庫(災備用)
# slave-skip-errors = 1062 # 謹慎使用,跳過主鍵衝突
# slave-delay = 3600 # 延遲 1 小時
兩種主流方式:
# 主庫
mysqldump -u root -p --single-transaction --master-data=2 --databases test > /tmp/master_backup.sql
# 從庫
mysql -u root -p < /tmp/master_backup.sql
--master-data=2 會在導出文件中包含 CHANGE MASTER TO 註釋,記錄當前 Binlog 位置。
# 主庫熱備份
xtrabackup --backup --target-dir=/backup/full --user=root --password=xxx
# 傳輸到從庫,準備並還原
xtrabackup --prepare --target-dir=/backup/full
rsync -av /backup/full/ /var/lib/mysql/
chown -R mysql:mysql /var/lib/mysql
重啟主從 MySQL 服務(先主後從),然後在從庫執行:
-- 若用方式 A 且導出含 CHANGE MASTER 註釋,可能已自動配置,仍建議顯式執行確認
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='backup',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001', -- 從主庫 SHOW MASTER STATUS 獲取
MASTER_LOG_POS=154,
MASTER_CONNECT_RETRY=60;
START SLAVE;
SHOW MASTER STATUS\G
-- 關鍵:File, Position, Binlog_Do_DB, Binlog_Ignore_DB
SHOW SLAVE STATUS\G
-- 關鍵指標:
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes
-- Seconds_Behind_Master: 0 (延遲秒數,0 為同步)
-- Last_IO_Error / Last_SQL_Error: 空
-- 主庫寫入
INSERT INTO test.t VALUES (1, 'replication test');
-- 從庫查詢
SELECT * FROM test.t; -- 應可見新行
| 現象 | 可能原因 | 排查步驟 |
|---|---|---|
Slave_IO_Running: No | 網路不通/認證失敗/主庫 Binlog 位置錯誤 | 檢查防火牆、賬號密碼、SHOW MASTER STATUS 位置 |
Slave_SQL_Running: No | SQL 執行錯誤(主鍵衝突、外鍵、字符集) | 看 Last_SQL_Error,手動修正或 SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1 跳過 |
Seconds_Behind_Master 大/增長 | 從庫執行慢/長事務/大事務/硬體瓶頸 | 優化從庫索引/配置、並行複製、升級硬體 |
| GTID 模式報錯 | GTID 集合不一致 | 重新同步或 SET GTID_PURGED |
master-host 等配置文件參數,**必須用 CHANGE MASTER TO** 動態配置binlog_format = ROW、GTID 模式更穩健replica 術語替代 slave(SHOW REPLICA STATUS)主從複製配置看似簡單,但生產環境穩定運行需關注:監控告警、延遲治理、故障演練、備份驗證、版本升級兼容。建立標準化 SOP,讓複製成為可信賴的資料保護層。