雙主復制 (Master-Master) 實現兩台 MySQL 互為主從,寫入任意一節點自動同步至另一節點。本文記錄 Windows Server 2012 環境下,MySQL 5.6 同版本雙主配置全流程:同步賬號授權、雙向 my.ini 參數、CHANGE MASTER TO 掛載、啟動驗證與測試。
| 節點 | IP | 角色 |
|---|---|---|
| Server A | 192.168.1.2 | Master / Slave |
| Server B | 192.168.1.3 | Master / Slave |
前提:雙方 MySQL 版本一致 (大版本號相同,如 5.6.x),關閉防火牆 3306 端口或相互放行。
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'192.168.1.%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
192.168.1.% 允許該網段訪問,生產建議限制具體對端 IP。
Server A (192.168.1.2) my.ini [mysqld] 區段:
log_bin = mysql-bin
server_id = 1
replicate_do_db = ftest # 只同步 ftest 庫,多庫逗號分隔,可省略同步所有
sync_binlog = 1 # 事務提交強制刷盤,防數據丟失
log_slave_updates = 1 # 從庫執行的事件寫入自身 Binlog,支撐鏈式/雙主
auto_increment_offset = 1 # 自增起始值
auto_increment_increment = 2 # 自增步長 (雙主設 2,避免主鍵衝突)
Server B (192.168.1.3) my.ini [mysqld] 區段:
log_bin = mysql-bin
server_id = 2 # 必須不同!
replicate_do_db = ftest
sync_binlog = 1
log_slave_updates = 1
auto_increment_offset = 2 # 起始值 2
auto_increment_increment = 2 # 步長 2
關鍵參數:auto_increment_offset/increment 保證雙主自增主鍵不衝突 (A 產生 1,3,5... B 產生 2,4,6...)。修改後**必須重啟 MySQL 服務**生效。
在 Server B MySQL 客戶端執行:
-- 先查看 Server A 當前 Binlog 位點
SHOW MASTER STATUS\G;
-- 假設 File=mysql-bin.000001, Position=1234
STOP SLAVE;
CHANGE MASTER TO
MASTER_HOST = '192.168.1.2',
MASTER_USER = 'repl',
MASTER_PASSWORD = '123456',
MASTER_LOG_FILE = 'mysql-bin.000001',
MASTER_LOG_POS = 1234;
START SLAVE;
SHOW SLAVE STATUS\G;
關鍵指標:
Slave_IO_Running: Yes (IO 線程連接主庫正常)Slave_SQL_Running: Yes (SQL 線程重放事件正常)Seconds_Behind_Master: 0若 Slave_IO_State 為空、Running 為 No,檢查錯誤日誌、網絡、賬號權限、Binlog 位點是否正確。
在 Server A 執行對稱的 CHANGE MASTER TO (指向 192.168.1.3),並 START SLAVE、SHOW SLAVE STATUS\G 驗證。
ftest 庫表插入/更新數據 → 觀察 Server B 是否同步。Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs。log_slave_updates=1 導致事件在雙向流轉,需依賴 server_id 去重 (MySQL 內建),但舊版本需注意。
