在 Windows 環境部署 MySQL 主從複寫,適用於開發測試、小型生產或異地備援。本文提供完整配置步驟、my.ini 設定、資料同步初始化與驗證方法。
| 角色 | IP | Server ID | 說明 |
|---|---|---|---|
| Master | 192.168.1.100 | 1 | 寫入主庫 |
| Slave | 192.168.1.101 | 2 | 唯讀從庫,可多台 |
前提:兩台機器網路互通、MySQL 版本一致(或 Slave 版本 ≥ Master)、防火牆開放 3306。
mysql -u root -p
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'192.168.1.101' IDENTIFIED BY 'repl_pass';
FLUSH PRIVILEGES;
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-do-db = test # 只同步 test 庫,多庫寫多行
binlog-ignore-db = mysql # 忽略系統庫
read-only = 0 # Master 讀寫皆可
重啟服務:net stop mysql && net start mysql
[mysqld]
server-id = 2
log-bin = mysql-bin
relay-log = relay-bin
master-host = 192.168.1.100
master-user = repl_user
master-password = repl_pass
master-port = 3306
master-connect-retry = 60
replicate-do-db = test
replicate-ignore-db = mysql
read-only = 1 # Slave 建議唯讀
注意:MySQL 5.6+ 已棄用 master-host 等參數,改用 CHANGE MASTER TO 動態配置(見下)。
mysqldump -u root -p --all-databases --master-data=2 > master_dump.sqlmaster_dump.sql 複製到 Slave。mysql -u root -p < master_dump.sql-- Slave 執行
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='repl_user',
MASTER_PASSWORD='repl_pass',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001', -- 從 dump 檔或 SHOW MASTER STATUS 取得
MASTER_LOG_POS=107;
START SLAVE;
-- Master
SHOW MASTER STATUS\G;
-- Slave
SHOW SLAVE STATUS\G;
關鍵指標:
Slave_IO_Running: Yes(I/O 執行緒連線正常)Slave_SQL_Running: Yes(SQL 執行緒重放正常)Seconds_Behind_Master: 0(無延遲)-- Master 執行
USE test;
CREATE TABLE t_repl_test (id INT PRIMARY KEY AUTO_INCREMENT, val VARCHAR(20));
INSERT INTO t_repl_test (val) VALUES ('replication test');
-- Slave 查詢
USE test;
SELECT * FROM t_repl_test;
若 Slave 可見新資料,複寫運作正常。
| 現象 | 原因 | 解決 |
|---|---|---|
| IO_Running: Connecting | 網路不通/帳號密碼錯/防火牆 | telnet 檢查 3306、核對帳號、開放防火牆 |
| SQL_Running: No | 資料衝突/結構不一致/外鍵錯誤 | 檢查 Last_SQL_Error、修正資料或跳過錯誤 |
| Seconds_Behind_Master 偏大 | Slave 機能不足/長事務/網路延遲 | 優化 Slave 硬體、調大 relay_log_space_limit |
在 Master 依各 Slave IP 建立帳號,各 Slave 設定不同 server-id 即可。所有 Slave 共用 Master 的 binlog,無額外負擔。