CentOS 7 下 MySQL 5.7 互为主从同步配置教程

在实际项目中,MySQL 主从同步可实现数据备份与读写分离,而互为主从(双主模式)能进一步提升可用性,避免单主故障导致的服务中断。本文基于两台 CentOS 7 主机,详细讲解 MySQL 5.7 互为主从的完整配置流程,包含环境准备、单向主从配置、双向同步验证,新手也能轻松跟随操作。

目录

一、环境说明

二、环境准备:两台主机安装 MySQL 5.7

1. 上传并解压 MySQL 安装包

2. 安装 MySQL 并启动服务

3. 初始化 MySQL 密码(修改为自定义密码)

三、第一步:配置 host41 为主库、host42 为从库(单向同步)

1. 关闭两台主机的防火墙与 SELinux

2. 配置 host41(主库)的 MySQL 配置文件

3. 配置 host42(从库)的 MySQL 配置文件

4. 在 host41(主库)创建复制账号

5. 获取 host41(主库)的 binlog 信息

6. 在 host42(从库)配置主库信息并启动同步

7. 验证单向主从同步状态

8. 测试单向同步

四、第二步:配置 host42 为主库、host41 为从库(实现互为主从)

1. 在 host42(新主库)创建复制账号

2. 获取 host42(新主库)的 binlog 信息

3. 在 host41(新从库)配置主库信息并启动同步

4. 恢复 host42 的从库同步(可选,若之前停止过)

5. 验证互为主从同步状态

五、最终测试:验证双向同步

测试 1:host42 写数据,host41 同步

测试 2:host41 写数据,host42 同步

六、常见问题与解决方法

总结


一、环境说明

主机角色IP 地址MySQL 版本核心作用
主机 1(host41)192.168.4.415.7.17初始主库 + 最终从库(同步 host42)
主机 2(host42)192.168.4.425.7.17初始从库 + 最终主库(同步 host41)

前置要求:两台主机已配置好网络(能互相 ping 通),且未安装其他 MySQL 版本(避免端口冲突)。

二、环境准备:两台主机安装 MySQL 5.7

以下步骤需在 host41 和 host42 上分别执行,确保两台主机的 MySQL 环境一致。

1. 上传并解压 MySQL 安装包

  1. 将本地下载的 mysql-5.7.17.tar 包上传到 CentOS 7 主机(可通过 Xshell、FinalShell 等工具的 “上传” 功能实现)。
  2. 执行命令创建目录并解压安装包:

    bash

    # 创建 MySQL 安装目录
    mkdir /root/mysql
    # 解压 tar 包到指定目录(若路径不同需修改)
    tar -xf mysql-5.7.17.tar -C /root/mysql
    
  3. 查看解压结果,确认目录内有 RPM 安装文件:

    bash

    ls /root/mysql
    

2. 安装 MySQL 并启动服务

  1. 通过 yum 安装解压后的所有 RPM 包,自动解决依赖:

    bash

    yum -y install /root/mysql/*
    
  2. 启动 MySQL 服务,并设置开机自启(避免重启后需手动启动):

    bash

    # 启动服务
    systemctl restart mysqld
    # 设置开机自启
    systemctl enable mysqld
    
  3. 检查 MySQL 端口(3306)是否正常监听,确认服务启动成功:

    bash

    ss -antulp | grep 3306
    
    若输出包含 LISTEN 0 80 :::3306 :::* users:(("mysqld",pid=xxxx,fd=xx)),说明端口正常。

3. 初始化 MySQL 密码(修改为自定义密码)

MySQL 5.7 安装后会生成临时密码,需先获取临时密码登录,再修改为自定义密码(本文统一改为 123qqq...A)。

  1. 查看日志文件中的临时密码(冒号后内容即为临时密码,需复制保存):

    bash

    grep password /var/log/mysqld.log
    
    示例输出:2025-10-11T10:09:21.091212Z 1 [Note] A temporary password is generated for root@localhost: dq=ikwUhW9H_
  2. 使用临时密码登录 MySQL:

    bash

    # 临时密码含特殊字符,需用单引号包裹
    mysql -uroot -p'dq=ikwUhW9H_'
    
  3. 修改 root 密码(执行后需重新登录验证):

    sql

    # 修改本地 root 用户密码为 123qqq...A
    alter user root@'localhost' identified by '123qqq...A';
    # 退出 MySQL 终端
    exit;
    
  4. 验证新密码:重新登录 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 配置文件

  1. 编辑 MySQL 主配置文件 /etc/my.cnf,在 [mysqld] 模块下添加以下内容(确保 server_id 唯一,不可与 host42 重复):

    bash

    vim /etc/my.cnf
    
    添加内容:

    ini

    [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...
  2. 保存并退出编辑器(按 Esc,输入 :wq 回车),重启 MySQL 使配置生效:

    bash

    systemctl restart mysqld
    

3. 配置 host42(从库)的 MySQL 配置文件

  1. 同样编辑 /etc/my.cnf[mysqld] 模块下添加内容(server_id 设为 42,与 host41 区分):

    bash

    vim /etc/my.cnf
    
    添加内容:

    ini

    [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...
  2. 重启 MySQL 服务:

    bash

    systemctl restart mysqld
    

4. 在 host41(主库)创建复制账号

主库需创建一个用于从库同步的账号(本文账号为 repluser,密码 123qqq...A),授予 replication slave 权限:

  1. 登录 host41 的 MySQL 终端:

    bash

    mysql -uroot -p'123qqq...A'
    
  2. 执行授权命令(% 表示允许所有 IP 连接,生产环境可限制为 host42 的 IP 192.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(从库)配置主库信息并启动同步

  1. 登录 host42 的 MySQL 终端:

    bash

    mysql -uroot -p'123qqq...A'
    
  2. 执行命令指定主库(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. 测试单向同步

  1. 在 host41(主库)的 MySQL 终端创建测试库、表并插入数据:

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

若能查询到 host41 插入的数据,说明单向主从同步配置成功。

四、第二步:配置 host42 为主库、host41 为从库(实现互为主从)

基于已有的单向主从,补充 “host42 写数据 → host41 同步数据” 的反向同步,最终实现互为主从。

1. 在 host42(新主库)创建复制账号

与 host41 类似,host42 作为主库时,也需创建复制账号(本文账号为 jim,密码 123qqq...A):

  1. 登录 host42 的 MySQL 终端:

    bash

    mysql -uroot -p'123qqq...A'
    
  2. 执行授权命令:

    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(新从库)配置主库信息并启动同步

  1. 登录 host41 的 MySQL 终端:

    bash

    mysql -uroot -p'123qqq...A'
    
  2. 执行命令指定主库(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: YesSlave_SQL_Running: Yes
  • host42(从库,同步 host41):Slave_IO_Running: YesSlave_SQL_Running: Yes

五、最终测试:验证双向同步

通过在两台主机分别写数据,验证互为主从是否生效。

测试 1:host42 写数据,host41 同步

  1. 在 host42 的 MySQL 终端插入数据:

  2. 在 host41 的 MySQL 终端查询:

    结果相同,实现同步。

测试 2:host41 写数据,host42 同步

  1. 在 host41 的 MySQL 终端建cc库:

  2. 在 host42 的 MySQL 终端查询:

    结果相同,实现同步。

六、常见问题与解决方法

  1. Slave_IO_Running: Connecting:从库 IO 线程连接主库失败,检查:
    • 主库 IP、复制账号密码是否正确;
    • 主库防火墙是否关闭,3306 端口是否开放;
    • 主库 my.cnf 是否配置 bind-address=127.0.0.1(需注释或改为 0.0.0.0)。
  2. Slave_SQL_Running: No:从库 SQL 线程执行失败,检查:
    • 主从库数据不一致(如主库有表,从库没有);
    • 从库已存在相同数据,同步时主键冲突(需删除从库冲突数据后重启同步)。
  3. binlog 文件名 / 偏移量错误:配置时需确保 master_log_file 和 master_log_pos 与主库当前状态一致,可重新执行 show master status\G; 获取最新值。

总结

MySQL 互为主从的核心是 “双向授权 + 双向配置 binlog 同步”,关键注意三点:

  1. 两台主机的 server_id 必须唯一,且均开启 log_bin 和 log_slave_updates
  2. 复制账号权限需正确,且主从库网络能正常通信(关闭防火墙 / SELinux);
  3. 配置从库时,master_log_file 和 master_log_pos 需与主库当前状态完全一致。

按照本文步骤操作,即可实现 MySQL 互为主从同步,满足数据备份与高可用需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值