架構與前提
- Master:192.168.0.88(寫入)
- Slave:192.168.0.99(唯讀/備份)
- **版本必須一致**(如均為 5.7.38)
- 同步庫:
kangte;不同步:mysql 系統庫
Master 配置(/etc/my.cnf)
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-do-db = kangte
binlog-ignore-db = mysql
# 可選:ROW 格式減少衝突
binlog_format = ROW
systemctl restart mysqld
Master 建立同步帳號並獲取定位點
CREATE USER 'kt'@'192.168.0.99' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT, RELOAD, SUPER ON *.* TO 'kt'@'192.168.0.99' WITH GRANT OPTION;
FLUSH PRIVILEGES;
-- 鎖表獲取一致性位點
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
-- 記錄 File、Position(例:mysql-bin.000006, 656)
-- 導出同步庫
mysqldump -u root -p kangte > /tmp/kangte.sql
-- 解鎖
UNLOCK TABLES;
-- 傳輸到 Slave
scp /tmp/kangte.sql root@192.168.0.99:/tmp/
Slave 配置(/etc/my.cnf)
[mysqld]
server-id = 2
master-host = 192.168.0.88
master-user = kt
master-password = 123456
master-port = 3306
master-connect-retry = 60
replicate-do-db = kangte
replicate-ignore-db = mysql
systemctl restart mysqld
Slave 初始化數據並指定同步起點
# 1. 停止 Slave 線程(防止自動啟動)
systemctl stop mysqld
# 或啟動時加參數
mysqld_safe --skip-slave-start &
# 2. 建庫並導入
mysql -u root -p -e "CREATE DATABASE kangte;"
mysql -u root -p kangte < /tmp/kangte.sql
# 3. 指定 Master 定位點(必須在 START SLAVE 前)
mysql -u root -p -e "
CHANGE MASTER TO
MASTER_HOST = '192.168.0.88',
MASTER_USER = 'kt',
MASTER_PASSWORD = '123456',
MASTER_LOG_FILE = 'mysql-bin.000006',
MASTER_LOG_POS = 656;
"
# 4. 啟動同步
mysql -u root -p -e "START SLAVE;"
# 5. 驗證
mysql -u root -p -e "SHOW SLAVE STATUS\G"
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes
命令列純手工部署(無配置檔依賴)
# Master
mysql> GRANT REPLICATION SLAVE ON *.* TO 'xu'@'192.168.1.121' IDENTIFIED BY '123456';
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS; -- 記錄 File, Position
# mysqldump 導出 test 庫
mysql> UNLOCK TABLES;
# Slave
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.1.120',
MASTER_USER='xu',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=123;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G
關鍵注意事項
- ⚠️ **binlog-do-db / replicate-do-db 僅對默認庫生效**,跨庫操作(如
INSERT INTO db1.t SELECT * FROM db2.t)可能不同步,建議用 **ROW 格式 + 不做庫過濾**,應用層控制寫入庫。
- ⚠️ **Slave 導入前必須先 CREATE DATABASE**,否則報錯 "Unknown database"。
- ⚠️ **CHANGE MASTER TO 必須在 START SLAVE 前執行**,否則報錯 "Cannot change master while slave running"。
- ⚠️ 5.6+ 建議改用 **GTID 模式**(參考 74700 文章),免去手動位點維護。
- 📌 監控腳本:定時檢查
Seconds_Behind_Master、Slave_*_Running、Last_Error。