需要注意的点:
- 确保防火墙开放对应的端口,特别是非默认端口。
- 主主复制可能导致数据冲突,应用层需要确保不会同时在两个节点写入同一行数据,或者使用自增ID的不同偏移。
- 在配置复制过滤时,确保两边的过滤规则正确,否则可能导致数据不一致。
- 对于无主键的表,最好添加主键,否则复制可能不可靠。
步骤1. 清除旧配置
在两台服务器上执行:
STOP SLAVE; -- 停用备份
RESET SLAVE ALL; -- 清除从库信息
RESET MASTER; -- 删除所有二进制日志(谨慎操作,确保数据已备份)
步骤2. 修改MySQL配置文件
编辑 /etc/mysql/mysql.conf.d/mysqld.cnf
,打开文件:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
按需调整以下参数:
[mysqld]
# 基础配置
server-id = 1 # 另一台设为2,确保唯一
port = 3306 # 修改为非默认端口(如3307)如是默认端口可以不写
binlog_format = ROW # 推荐使用ROW格式
gtid_mode = ON # 启用GTID
enforce_gtid_consistency = ON
slave_rows_search_algorithms = 'INDEX_SCAN,HASH_SCAN'
binlog_row_image = FULL # 记录完整行数据
log_slave_updates = ON # 确保双主架构中日志可传递
replicate-do-table = enh_all.zz #配置需要备份的表,多表写多个replicate-do-table
# 处理无主键表(MySQL 8.0+)
slave_rows_search_algorithms = 'INDEX_SCAN,HASH_SCAN' # 提高无主键表复制兼容性
重启MySQL生效配置:
systemctl restart mysql
步骤3. 创建复制账户(非必要)
在两台服务器上执行:
CREATE USER 'repl'@'%' IDENTIFIED BY 'SecurePassword123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
步骤4. 配置主主复制
前置条件,需要备份的表内容一致!
在服务器A(IP: 192.168.1.101,端口3307)执行:
CHANGE MASTER TO
MASTER_HOST='192.168.1.102',
MASTER_PORT=3307, # 对方端口
MASTER_USER='repl',
MASTER_PASSWORD='SecurePassword123!',
MASTER_AUTO_POSITION=1;
START SLAVE;
在服务器B(IP: 192.168.1.102,端口3307)执行:
CHANGE MASTER TO
MASTER_HOST='192.168.1.101',
MASTER_PORT=3307, # 对方端口
MASTER_USER='repl',
MASTER_PASSWORD='SecurePassword123!',
MASTER_AUTO_POSITION=1;
START SLAVE;
步骤5. 验证复制状态
检查同步状态:
SHOW SLAVE STATUS\G
-
确认以下参数为Yes:
-
Slave_IO_Running: Yes
-
Slave_SQL_Running: Yes
-
-
检查错误信息:
-
Last_IO_Error
-
Last_SQL_Error
-