| 角色 | IP | Server ID |
|---|---|---|
| Master | 192.168.0.100 | 1 |
| Slave | 192.168.0.200 | 2 |
版本一致、防火牆放行 3306、時間同步(NTP)。
[mysqld]
server-id=1
log-bin=master-bin
log-bin-index=master-bin.index
binlog_format=ROW # 推薦 ROW 格式
expire_logs_days=7
max_binlog_size=500M
# 可選:只同步特定庫
# binlog-do-db=repl_db
# binlog-ignore-db=mysql
systemctl restart mysqld
CREATE USER 'repl'@'192.168.0.%' IDENTIFIED BY 'strong_repl_pass';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.%';
FLUSH PRIVILEGES;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| master-bin.000004| 224 | | |
+------------------+----------+--------------+------------------+
UNLOCK TABLES;
記錄 File 與 Position。
[mysqld]
server-id=2
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
read_only=1 # 防止誤寫入
# replicate-do-db=repl_db
# replicate-wild-ignore-table=mysql.%
# replicate-wild-ignore-table=information_schema.%
systemctl restart mysqld
# Master 上
mysqldump -uroot -p --all-databases --master-data=2 --single-transaction --flush-logs > full.dump
scp full.dump slave:/tmp/
# Slave 上
mysql -uroot -p < /tmp/full.dump
# Master:FLUSH TABLES WITH READ LOCK; 記錄座標
# 複製 datadir 到 Slave(rsync/tar+scp)
# Slave:修正權限、啟動、CHANGE MASTER TO...
CHANGE MASTER TO
MASTER_HOST='192.168.0.100',
MASTER_USER='repl',
MASTER_PASSWORD='strong_repl_pass',
MASTER_LOG_FILE='master-bin.000004',
MASTER_LOG_POS=224;
START SLAVE;
SHOW SLAVE STATUS\G
-- 關鍵指標
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
Last_IO_Error:
Last_SQL_Error:
# Master
CREATE DATABASE repl_test;
CREATE TABLE repl_test.t (id INT PRIMARY KEY, val VARCHAR(20));
INSERT INTO repl_test.t VALUES (1,'hello'),(2,'world');
# Slave
SHOW DATABASES LIKE 'repl_test';
SELECT * FROM repl_test.t;
binlog-do-db / binlog-ignore-db 控制寫入 binlog 的庫(影響所有 Slave)。replicate-do-db / replicate-ignore-db / replicate-wild-do-table / replicate-wild-ignore-table 靈活控制各 Slave 同步範圍。| 現象 | 可能原因 | 處理 |
|---|---|---|
| IO_Running=No | 網路不通、帳號密碼錯、MASTER_LOG_FILE/POS 錯 | 檢查防火牆、SHOW MASTER STATUS 核對、重新 CHANGE MASTER |
| SQL_Running=No | 主從結構不一致、唯一鍵衝突、異常事務 | SHOW SLAVE STATUS 看 Last_SQL_Error,跳過錯誤 SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE; 或修復數據 |
| Seconds_Behind_Master 偏大 | 從庫硬體弱、長事務、大查詢阻塞、網路延遲 | 優化從庫索引、調整 parallel replication (5.6+)、升級硬體 |