MySQL双主复制
1、两个数据库初始化数据同步
2、进入数据库配置文件 /etc/mysql/mysql.conf.d/mysqld.cnf
2.1 节点A配置
[mysqld]
# 基础配置
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog-format=row
expire_logs_days = 10
max_binlog_size = 100M
binlog_do_db = mcbs_gzyfzx_bg # 复制的库,可选
#binlog_ignore_db = include_database_name
# GTID配置
gtid_mode = ON
enforce_gtid_consistency = ON
# 自增ID偏移(避免双主写入冲突)
auto_increment_increment = 2 # 自增步长为2(两节点相同)
auto_increment_offset = 1 # 节点A起始值为1
# 其他优化
expire_logs_days = 7
log_slave_updates = ON # 从库记录binlog(必须开启)
relay_log = /var/log/mysql/mysql-relay.log
2.2 节点B配置
[mysqld]
# 基础配置
server-id = 2
log_bin = /var/log/mysql/mysql-bin.log
binlog-format=row
expire_logs_days = 10
max_binlog_size = 100M
binlog_do_db = mcbs_gzyfzx_bg # 复制的库,可选
#binlog_ignore_db = include_database_name
# GTID配置
gtid_mode = ON
enforce_gtid_consistency = ON
# 自增ID偏移
auto_increment_increment = 2 # 自增步长为2(两节点相同)
auto_increment_offset = 2 # 节点B起始值为2
# 其他优化
expire_logs_days = 7
log_slave_updates = ON
relay_log = /var/log/mysql/mysql-relay.log
3、从启MySQL服务
sudo systemctl restart mysql
4、进入mysql命令行
mysql
5、创建复制账户(两节点均需执行)
5.1 在节点A(159服务器)执行
CREATE USER 'repl'@'192.168.230.158' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.230.158';
5.2 在节点B(158服务器)执行
CREATE USER 'repl'@'192.168.230.159' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.230.159';
6、 配置双向复制关系
6.1 在节点A(159服务器)执行
STOP SLAVE;
RESET SLAVE ALL;
CHANGE MASTER TO
MASTER_HOST = '192.168.230.158',
MASTER_USER = 'repl',
MASTER_PASSWORD = '123456',
MASTER_AUTO_POSITION = 1; -- 启用GTID自动定位
START SLAVE;
6.2 在节点B(158服务器)执行
STOP SLAVE;
RESET SLAVE ALL;
CHANGE MASTER TO
MASTER_HOST = '192.168.230.159',
MASTER_USER = 'repl',
MASTER_PASSWORD = '123456',
MASTER_AUTO_POSITION = 1; -- 启用GTID自动定位
START SLAVE;
6.3 查看主库链接配置
SHOW SLAVE STATUS\G
确认以下字段均为 Yes:
- Slave_IO_Running
- Slave_SQL_Running
- 无 Last_IO_Error 或 Last_SQL_Error
7、测试数据同步
7.1 切换数据库
USE mcbs_gzyfzx_bg;
7.2 在节点A写入数据:
CREATE TABLE test_table (id INT AUTO_INCREMENT PRIMARY KEY, data VARCHAR(20));
INSERT INTO test_table (data) VALUES ('NodeA Data');
7.3 在节点B检查数据:
SELECT * FROM test_table;
-- 应看到 id=1 的记录
7.4 在节点B写入数据:
INSERT INTO test_table (data) VALUES ('NodeB Data');
7.5 在节点A检查数据:
SELECT * FROM test_table;
-- 应看到 id=1 和 id=2 的记录
7.6 删除测试表
drop table test_table;

浙公网安备 33010602011771号