在实际项目中,MySQL 主从同步可实现数据备份与读写分离,而互为主从(双主模式)能进一步提升可用性,避免单主故障导致的服务中断。本文基于两台 CentOS 7 主机,详细讲解 MySQL 5.7 互为主从的完整配置流程,包含环境准备、单向主从配置、双向同步验证,新手也能轻松跟随操作。
目录
三、第一步:配置 host41 为主库、host42 为从库(单向同步)
四、第二步:配置 host42 为主库、host41 为从库(实现互为主从)
一、环境说明
| 主机角色 | IP 地址 | MySQL 版本 | 核心作用 |
|---|---|---|---|
| 主机 1(host41) | 192.168.4.41 | 5.7.17 | 初始主库 + 最终从库(同步 host42) |
| 主机 2(host42) | 192.168.4.42 | 5.7.17 | 初始从库 + 最终主库(同步 host41) |
前置要求:两台主机已配置好网络(能互相 ping 通),且未安装其他 MySQL 版本(避免端口冲突)。
二、环境准备:两台主机安装 MySQL 5.7
以下步骤需在 host41 和 host42 上分别执行,确保两台主机的 MySQL 环境一致。
1. 上传并解压 MySQL 安装包
- 将本地下载的
mysql-5.7.17.tar包上传到 CentOS 7 主机(可通过 Xshell、FinalShell 等工具的 “上传” 功能实现)。 - 执行命令创建目录并解压安装包:
bash
# 创建 MySQL 安装目录 mkdir /root/mysql # 解压 tar 包到指定目录(若路径不同需修改) tar -xf mysql-5.7.17.tar -C /root/mysql - 查看解压结果,确认目录内有 RPM 安装文件:
bash
ls /root/mysql
2. 安装 MySQL 并启动服务
- 通过 yum 安装解压后的所有 RPM 包,自动解决依赖:
bash
yum -y install /root/mysql/* - 启动 MySQL 服务,并设置开机自启(避免重启后需手动启动):
bash
# 启动服务 systemctl restart mysqld # 设置开机自启 systemctl enable mysqld - 检查 MySQL 端口(3306)是否正常监听,确认服务启动成功:
bash
若输出包含ss -antulp | grep 3306LISTEN 0 80 :::3306 :::* users:(("mysqld",pid=xxxx,fd=xx)),说明端口正常。
3. 初始化 MySQL 密码(修改为自定义密码)
MySQL 5.7 安装后会生成临时密码,需先获取临时密码登录,再修改为自定义密码(本文统一改为 123qqq...A)。
- 查看日志文件中的临时密码(冒号后内容即为临时密码,需复制保存):
bash
示例输出:grep password /var/log/mysqld.log2025-10-11T10:09:21.091212Z 1 [Note] A temporary password is generated for root@localhost: dq=ikwUhW9H_ - 使用临时密码登录 MySQL:
bash
# 临时密码含特殊字符,需用单引号包裹 mysql -uroot -p'dq=ikwUhW9H_' - 修改 root 密码(执行后需重新登录验证):
sql
# 修改本地 root 用户密码为 123qqq...A alter user root@'localhost' identified by '123qqq...A'; # 退出 MySQL 终端 exit; - 验证新密码:重新登录 MySQL,确认能正常进入终端:
bash
mysql -uroot -p'123qqq...A'
三、第一步:配置 host41 为主库、host42 为从库(单向同步)
先实现 “host41 写数据 → host42 同步数据” 的单向主从,这是互为主从的基础。
1. 关闭两台主机的防火墙与 SELinux
防火墙和 SELinux 会拦截 MySQL 3306 端口通信,需在 host41 和 host42 上分别执行:
bash
# 临时关闭 SELinux(重启后失效,若需永久关闭需修改配置文件)
setenforce 0
# 停止防火墙服务
systemctl stop firewalld
2. 配置 host41(主库)的 MySQL 配置文件
- 编辑 MySQL 主配置文件
/etc/my.cnf,在[mysqld]模块下添加以下内容(确保server_id唯一,不可与 host42 重复):bash
添加内容:vim /etc/my.cnfini
[mysqld] server_id=41 # 主机唯一标识,建议与 IP 最后一段一致(如 41 对应 192.168.4.41) log_bin=master41 # 开启 binlog 日志,日志文件前缀为 master41 log_slave_updates # 允许从库同步的数据写入自身 binlog(互为主从必需) # 新增:解决主键冲突的自增配置 auto_increment_increment = 2 # 步长=主机数量(2台),每次自增2 auto_increment_offset = 1 # 起始偏移=1,生成主键:1、3、5、7... - 保存并退出编辑器(按
Esc,输入:wq回车),重启 MySQL 使配置生效:bash
systemctl restart mysqld
3. 配置 host42(从库)的 MySQL 配置文件
- 同样编辑
/etc/my.cnf,[mysqld]模块下添加内容(server_id设为 42,与 host41 区分):bash
添加内容:vim /etc/my.cnfini
[mysqld] server_id=42 # 唯一标识,与 host41 的 41 不重复 log_bin=master42 # 开启 binlog,前缀为 master42 log_slave_updates # 互为主从必需,允许同步数据写入 binlog # 新增:解决主键冲突的自增配置 auto_increment_increment = 2 # 步长与 host41 一致(均为2) auto_increment_offset = 2 # 起始偏移=2,生成主键:2、4、6、8... - 重启 MySQL 服务:
bash
systemctl restart mysqld
4. 在 host41(主库)创建复制账号
主库需创建一个用于从库同步的账号(本文账号为 repluser,密码 123qqq...A),授予 replication slave 权限:
- 登录 host41 的 MySQL 终端:
bash
mysql -uroot -p'123qqq...A' - 执行授权命令(
%表示允许所有 IP 连接,生产环境可限制为 host42 的 IP192.168.4.42):sql
grant replication slave on *.* to repluser@"%" identified by "123qqq...A"; # 刷新权限,使授权生效 flush privileges;
5. 获取 host41(主库)的 binlog 信息
从库需通过主库的 binlog 文件名和偏移量,确定同步的起始位置,需在 host41 的 MySQL 终端执行:
sql
# 查看主库当前 binlog 状态(记录 File 和 Position 字段值)
show master status\G;
示例输出(需记录以下两个值,后续配置从库会用到):

6. 在 host42(从库)配置主库信息并启动同步
- 登录 host42 的 MySQL 终端:
bash
mysql -uroot -p'123qqq...A' - 执行命令指定主库(host41)信息,注意替换
master_log_file和master_log_pos为步骤 5 记录的值:sql
# 先停止从库线程(若之前配置过,避免冲突) stop slave; # 配置主库信息 change master to master_host="192.168.4.41", # 主库(host41)的 IP master_user="repluser", # 主库创建的复制账号 master_password="123qqq...A",# 复制账号密码 master_log_file="master41.000001", # 主库 binlog 文件名(步骤 5 记录) master_log_pos=154; # 主库 binlog 偏移量(步骤 5 记录) # 启动从库同步线程 start slave;
7. 验证单向主从同步状态
在 host42 的 MySQL 终端执行以下命令,查看同步状态:
sql
show slave status\G;
关键看以下两个字段,均为 Yes 表示同步成功:
Slave_IO_Running: Yes(从库 IO 线程正常,能连接主库)Slave_SQL_Running: Yes(从库 SQL 线程正常,能执行同步的 SQL)

8. 测试单向同步
- 在 host41(主库)的 MySQL 终端创建测试库、表并插入数据:


- 在 host42(从库)的 MySQL 终端查询,确认数据已同步:

若能查询到 host41 插入的数据,说明单向主从同步配置成功。
四、第二步:配置 host42 为主库、host41 为从库(实现互为主从)
基于已有的单向主从,补充 “host42 写数据 → host41 同步数据” 的反向同步,最终实现互为主从。
1. 在 host42(新主库)创建复制账号
与 host41 类似,host42 作为主库时,也需创建复制账号(本文账号为 jim,密码 123qqq...A):
- 登录 host42 的 MySQL 终端:
bash
mysql -uroot -p'123qqq...A' - 执行授权命令:
sql
grant replication slave on *.* to jim@"%" identified by "123qqq...A"; # 刷新权限 flush privileges;
2. 获取 host42(新主库)的 binlog 信息
在 host42 的 MySQL 终端执行,记录 binlog 文件名和偏移量:
sql
show master status\G;
示例输出(记录以下两个值,后续配置 host41 从库会用到):
plaintext
*************************** 1. row ***************************
File: master42.000001 # host42 的 binlog 文件名
Position: 1303 # host42 的 binlog 偏移量
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
3. 在 host41(新从库)配置主库信息并启动同步
- 登录 host41 的 MySQL 终端:
bash
mysql -uroot -p'123qqq...A' - 执行命令指定主库(host42)信息,替换
master_log_file和master_log_pos为步骤 2 记录的值:sql
# 先停止从库线程(避免冲突) stop slave; # 配置 host42 为主库 change master to master_host="192.168.4.42", # 新主库(host42)的 IP master_user="jim", # host42 创建的复制账号 master_password="123qqq...A",# 复制账号密码 master_log_file="master42.000001", # host42 的 binlog 文件名(步骤 2 记录) master_log_pos=1303; # host42 的 binlog 偏移量(步骤 2 记录) # 启动从库同步线程 start slave;
4. 恢复 host42 的从库同步(可选,若之前停止过)
若在配置过程中停止过 host42 的从库线程,需重新启动(确保 host42 仍能同步 host41 的数据):
sql
# 在 host42 的 MySQL 终端执行
start slave;
5. 验证互为主从同步状态
分别在 host41 和 host42 的 MySQL 终端执行 show slave status\G;,确认两台主机的以下两个字段均为 Yes:
- host41(从库,同步 host42):
Slave_IO_Running: Yes、Slave_SQL_Running: Yes - host42(从库,同步 host41):
Slave_IO_Running: Yes、Slave_SQL_Running: Yes 
五、最终测试:验证双向同步
通过在两台主机分别写数据,验证互为主从是否生效。
测试 1:host42 写数据,host41 同步
- 在 host42 的 MySQL 终端插入数据:

- 在 host41 的 MySQL 终端查询:
结果相同,实现同步。
测试 2:host41 写数据,host42 同步
- 在 host41 的 MySQL 终端建cc库:

- 在 host42 的 MySQL 终端查询:
结果相同,实现同步。
六、常见问题与解决方法
- Slave_IO_Running: Connecting:从库 IO 线程连接主库失败,检查:
- 主库 IP、复制账号密码是否正确;
- 主库防火墙是否关闭,3306 端口是否开放;
- 主库
my.cnf是否配置bind-address=127.0.0.1(需注释或改为0.0.0.0)。
- Slave_SQL_Running: No:从库 SQL 线程执行失败,检查:
- 主从库数据不一致(如主库有表,从库没有);
- 从库已存在相同数据,同步时主键冲突(需删除从库冲突数据后重启同步)。
- binlog 文件名 / 偏移量错误:配置时需确保
master_log_file和master_log_pos与主库当前状态一致,可重新执行show master status\G;获取最新值。
总结
MySQL 互为主从的核心是 “双向授权 + 双向配置 binlog 同步”,关键注意三点:
- 两台主机的
server_id必须唯一,且均开启log_bin和log_slave_updates; - 复制账号权限需正确,且主从库网络能正常通信(关闭防火墙 / SELinux);
- 配置从库时,
master_log_file和master_log_pos需与主库当前状态完全一致。
按照本文步骤操作,即可实现 MySQL 互为主从同步,满足数据备份与高可用需求。

2013

被折叠的 条评论
为什么被折叠?



