test-- On A
GRANT REPLICATION SLAVE, FILE ON *.* TO 'repl1'@'192.168.0.232' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
-- On B
GRANT REPLICATION SLAVE, FILE ON *.* TO 'repl2'@'192.168.0.231' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
[mysqld]
user = mysql
log-bin = mysql-bin
server-id = 1 -- A=1, B=2
binlog-do-db = test
binlog-ignore-db = mysql
replicate-do-db = test
replicate-ignore-db = mysql
log-slave-updates -- 關鍵:將從庫重放的事件再寫入自身 Binlog,實現雙向傳遞
slave-skip-errors = all -- 生產慎用,此處為演示
skip-name-resolve
sync_binlog = 1 -- 每次提交刷盤,保證不丟事件
auto_increment_increment = 2
auto_increment_offset = 1 -- A=1, B=2,避免自增 ID 衝突
/usr/local/mysql/bin/mysqld_safe &
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS; -- 記錄 File 與 Position
-- 導出/導入資料,保證兩端一致
-- On A(指向 B)
CHANGE MASTER TO
MASTER_HOST='192.168.0.232',
MASTER_USER='repl2',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000004', -- B 的 File
MASTER_LOG_POS=595; -- B 的 Position
START SLAVE;
-- On B(指向 A)
CHANGE MASTER TO
MASTER_HOST='192.168.0.231',
MASTER_USER='repl1',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000007', -- A 的 File
MASTER_LOG_POS=528; -- A 的 Position
START SLAVE;
SHOW PROCESSLIST\G
-- 關鍵:同時存在 "Waiting for master to send event"(SQL Thread)
-- 和 "Has sent all binlog to slave"(Binlog Dump Thread)
解鎖 UNLOCK TABLES,雙向寫入測試:A 插入 → B 可見;B 插入 → A 可見。自增 ID 交錯(1,3,5... / 2,4,6...),無衝突。
log-slave-updates:雙主必開,否則 A→B 重放的事件不會進 B 的 Binlog,B 無法傳給 A。sync_binlog=1:高可靠,犧牲部分寫入效能。auto_increment_increment/offset:雙主避免主鍵衝突的標準做法。