✅ 双主复制配置完整步骤

🧱 1. 修改配置文件(确认无误)
主库A(server-id=1)配置:
[mysqld]
server-id = 1
log-bin = mysql-bin
auto-increment-increment = 2
auto-increment-offset = 1
log-slave-updates = 1
binlog-do-db = test1 # 注意下面会建议不要使用此行,建议删除
主库B(server-id=2)配置:
[mysqld]
server-id = 2
log-bin = mysql-bin
auto-increment-increment = 2
auto-increment-offset = 2
log-slave-updates = 1
binlog-do-db = test1 # 同样建议删除
⚠️ binlog-do-db 的注意事项
建议不要使用
binlog-do-db,因为这只记录默认数据库里的操作,跨库语句可能会被忽略,造成数据不一致。
🔁 如果你想同步多个数据库,请不要用 binlog-do-db,直接记录所有库的操作。
🧼 2. 清空并同步初始数据(初始阶段建议清数据)
确保两台机器的 test1 数据库内容完全一致(或一台为空),可以选择:
- 从一台导出
mysqldump - 导入到另一台
- 或者在初始化前把两边数据都清空
🔐 3. 创建复制账户(互为主从)
在 主库A 上:
CREATE USER 'repl'@'%' IDENTIFIED BY 'replpass';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
在 主库B 上也做同样操作。
🔗 4. 设置主从连接
在主库A执行以下命令(连接主库B):
CHANGE MASTER TO
MASTER_HOST='主库B的IP',
MASTER_PORT=33161, -- 这里指定了主库的端口,不加这行的默认3306端口
MASTER_USER='repl',
MASTER_PASSWORD='replpass',
MASTER_LOG_FILE='mysql-bin.000001', -- 取自主库B的 SHOW MASTER STATUS
MASTER_LOG_POS= 1234; -- 同样取 SHOW MASTER STATUS 输出
在主库B执行以下命令(连接主库A):
CHANGE MASTER TO
MASTER_HOST='主库A的IP',
MASTER_USER='repl',
MASTER_PASSWORD='replpass',
MASTER_LOG_FILE='mysql-bin.000001', -- 取自主库A的 SHOW MASTER STATUS
MASTER_LOG_POS= 1234;
然后分别在两台机器上运行:
START SLAVE;
检查状态:
SHOW SLAVE STATUS\G
确保 Slave_IO_Running 和 Slave_SQL_Running 都是 Yes。
🔁 自动主键冲突避免说明
你已正确设置:
| 主机 | offset | increment |
|---|---|---|
| A | 1 | 2 |
| B | 2 | 2 |
这样 auto-increment 的 ID 就不会冲突。比如:
- 主库A生成:1, 3, 5…
- 主库B生成:2, 4, 6…
❓关于“能不能同步所有库”
是的,只要你 不设置 binlog-do-db 和 replicate-do-db,就可以同步所有数据库。
如果你设置了 binlog-do-db = test1,则 只能同步该库,你要同步多个库就要删掉这个配置。
✅ 最终建议配置(两个主机都一样,配置全部数据库)
[mysqld]
server-id = 1 # 或 2
log-bin = mysql-bin
auto-increment-increment = 2
auto-increment-offset = 1 # 或 2
log-slave-updates = 1
不要设置 binlog-do-db,除非你只同步某个库
