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;
posted @ 2025-05-27 10:42  凉初  阅读(23)  评论(0)    收藏  举报