首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CentOS 7 下 MySQL 主从复制超详细操作手册(逐行命令+原理说明)

CentOS 7 下 MySQL 主从复制超详细操作手册(逐行命令+原理说明)

作者头像
IT咸鱼
发布2025-05-20 18:50:12
发布2025-05-20 18:50:12
23700
代码可运行
举报
运行总次数:0
代码可运行

#一、环境准备(主从节点均需操作)

#1. 虚拟机基础配置
代码语言:javascript
代码运行次数:0
运行
复制
# 1.1 配置静态IP(以主节点为例,从节点IP不同)

sudo vi /etc/sysconfig/network-scripts/ifcfg-ens33  

修改内容:

代码语言:javascript
代码运行次数:0
运行
复制
BOOTPROTO=static          # 改为静态IP

ONBOOT=yes# 开机启动网卡

IPADDR=192.168.1.100# 主节点IP

NETMASK=255.255.255.0

GATEWAY=192.168.1.1

DNS1=8.8.8.8

重启网络服务:

代码语言:javascript
代码运行次数:0
运行
复制
sudo systemctl restart network

代码语言:javascript
代码运行次数:0
运行
复制
# 1.2 关闭防火墙(测试环境方便,生产环境需配置规则)

sudo systemctl stop firewalld  

sudo systemctl disable firewalld  



# 1.3 禁用SELinux(避免权限拦截)

sudo setenforce 0  

sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config  

#2. 安装 MySQL 5.7
代码语言:javascript
代码运行次数:0
运行
复制
# 2.1 安装Yum仓库

sudo yum install -y https://repo.mysql.com/mysql57-community-release-el7-11.noarch.rpm  



# 2.2 安装MySQL服务

sudo yum install -y mysql-community-server  



# 2.3 启动服务

sudo systemctl start mysqld  

sudo systemctl enable mysqld  



# 2.4 获取初始密码(首次安装必做)

sudo grep 'temporary password' /var/log/mysqld.log  

# 输出示例:A temporary password is generated for root@localhost: xxxxxx

#3. 初始化 MySQL 安全配置
代码语言:javascript
代码运行次数:0
运行
复制
# 3.1 运行安全脚本

sudo mysql_secure_installation  



# 按提示操作:

# 1. 输入临时密码(从步骤2.4获取)

# 2. 重置root密码(需包含大小写字母、数字、符号,如MyRootPass123!)

# 3. 移除匿名用户?Y

# 4. 禁止root远程登录?n(若需远程访问选n)

# 5. 删除测试数据库?Y

# 6. 刷新权限表?Y


#二、主库(Master)配置

#1. 修改MySQL配置文件
代码语言:javascript
代码运行次数:0
运行
复制
sudo vi /etc/my.cnf  

[mysqld]段落下添加:

代码语言:javascript
代码运行次数:0
运行
复制
server-id = 1# 唯一标识,主从不能重复

log-bin = mysql-bin            # 二进制日志文件名(默认路径/var/lib/mysql)

binlog_format = ROW            # 推荐格式,保证数据一致性

expire_logs_days = 7# 自动清理7天前的日志

# 可选:指定同步的数据库

# binlog-do-db = mydb          # 只同步mydb库

# binlog-ignore-db = mysql     # 忽略系统库

#2. 重启MySQL服务
代码语言:javascript
代码运行次数:0
运行
复制
sudo systemctl restart mysqld

#3. 创建主从同步专用用户
代码语言:javascript
代码运行次数:0
运行
复制
# 登录MySQL

mysql -u root -p  

代码语言:javascript
代码运行次数:0
运行
复制
-- 创建用户(用户名repl,密码ReplPass123!)

CREATEUSER'repl'@'%' IDENTIFIED BY'ReplPass123!';  



-- 授予复制权限

GRANT REPLICATION SLAVE ON*.*TO'repl'@'%';  



-- 刷新权限

FLUSH PRIVILEGES;  

#4. 查看主库状态
代码语言:javascript
代码运行次数:0
运行
复制
SHOW MASTER STATUS;  

记录输出中的 File (如mysql-bin.000002) 和 Position (如154),从库配置需要用到。


#三、从库(Slave)配置

#1. 修改MySQL配置文件
代码语言:javascript
代码运行次数:0
运行
复制
sudo vi /etc/my.cnf  

[mysqld]段落下添加:

代码语言:javascript
代码运行次数:0
运行
复制
server-id = 2# 必须与主库不同

relay-log = mysql-relay-bin    # 中继日志文件名

read_only = 1# 从库只读(超级用户仍可写)

# 可选:指定同步的数据库

# replicate-do-db = mydb       # 与主库binlog-do-db对应

# replicate-ignore-db = mysql

#2. 重启MySQL服务
代码语言:javascript
代码运行次数:0
运行
复制
sudo systemctl restart mysqld

#3. 配置主从复制链路
代码语言:javascript
代码运行次数:0
运行
复制
# 登录MySQL

mysql -u root -p  

代码语言:javascript
代码运行次数:0
运行
复制
-- 停止从库复制(首次可不执行)

STOP SLAVE;  



-- 配置主库信息(IP、用户、日志文件、位置)

CHANGE MASTER TO

MASTER_HOST ='192.168.1.100',  

MASTER_USER ='repl',  

MASTER_PASSWORD ='ReplPass123!',  

MASTER_LOG_FILE ='mysql-bin.000002',  -- 替换为主库SHOW MASTER STATUS的值  

MASTER_LOG_POS =154;  



-- 启动复制

START SLAVE;  


#四、验证主从同步

#1. 检查从库复制状态
代码语言:javascript
代码运行次数:0
运行
复制
SHOW SLAVE STATUS\G  

关键字段说明

  • Slave_IO_Running: Yes(表示从库能读取主库日志)
  • Slave_SQL_Running: Yes(表示从库能重放日志)
  • Seconds_Behind_Master: 0(主从无延迟)
  • Last_IO_Error: 空(无网络或权限错误)
  • Last_SQL_Error: 空(无SQL执行错误)
#2. 数据同步测试
代码语言:javascript
代码运行次数:0
运行
复制
-- 在主库创建测试数据

CREATE DATABASE sync_test;  

USE sync_test;  

CREATETABLE users (id INTPRIMARY KEY, name VARCHAR(20));  

INSERTINTO users VALUES (1, 'Alice'), (2, 'Bob');  



-- 在从库查询数据

SELECT*FROM sync_test.users;  

预期输出:

代码语言:javascript
代码运行次数:0
运行
复制
+----+-------+

| id | name  |

+----+-------+

| 1  | Alice |

| 2  | Bob   |

+----+-------+


#五、故障排查大全

#1. 主从连接失败(Slave_IO_Running: No)

检查网络连通性

代码语言:javascript
代码运行次数:0
运行
复制
telnet 192.168.1.100 3306  # 从库执行,测试端口是否开放

验证复制用户权限

代码语言:javascript
代码运行次数:0
运行
复制
-- 在主库执行

SHOW GRANTS FOR'repl'@'%';  -- 确认有REPLICATION SLAVE权限

#2. 主从数据不一致(Slave_SQL_Running: No)

跳过错误(谨慎操作)

代码语言:javascript
代码运行次数:0
运行
复制
STOP SLAVE;  

SETGLOBAL SQL_SLAVE_SKIP_COUNTER=1;  -- 跳过1个错误事件

START SLAVE;  

重新同步全量数据

  • •主库备份: mysqldump -u root -p --all-databases --master-data=2 > master_full.sql
  • •从库导入: mysql -u root -p < master_full.sql
  • •重新配置复制链路。
#3. 从库写入导致数据冲突

强制从库只读

代码语言:javascript
代码运行次数:0
运行
复制
SETGLOBAL read_only =1;          -- 普通用户只读

SETGLOBAL super_read_only =1;    -- 超级用户只读(MySQL 5.7+)


#六、高级配置(生产环境建议)

#1. GTID复制(全局事务标识)
代码语言:javascript
代码运行次数:0
运行
复制
# 主从库配置文件添加

gtid_mode = ON

enforce_gtid_consistency = ON

从库配置命令改为:

代码语言:javascript
代码运行次数:0
运行
复制
CHANGE MASTER TO MASTER_AUTO_POSITION =1;  

#2. 半同步复制(确保数据安全)
代码语言:javascript
代码运行次数:0
运行
复制
-- 主库执行

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';  

SETGLOBAL rpl_semi_sync_master_enabled =1;  



-- 从库执行

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';  

SETGLOBAL rpl_semi_sync_slave_enabled =1;  

#3. 监控脚本
代码语言:javascript
代码运行次数:0
运行
复制
# 监控从库状态(保存为 /opt/mysql_monitor.sh)

#!/bin/bash

STATUS=$(mysql -u root -p'密码' -e "SHOW SLAVE STATUS\G")

echo"$(date +"%Y-%m-%d %H:%M:%S")" >> /var/log/mysql_replication.log  

echo"$STATUS" | grep "Running\|Behind\|Error" >> /var/log/mysql_replication.log  



# 添加定时任务

crontab -e  

# 添加:*/5 * * * * /bin/bash /opt/mysql_monitor.sh

#七、关键原理图解

主从复制流程

代码语言:javascript
代码运行次数:0
运行
复制
主库写入数据 → 记录到binlog → 从库IO线程拉取binlog → 写入relay log → 从库SQL线程重放relay log

二进制日志 (binlog) 类型

  • STATEMENT:记录SQL语句(可能因函数导致主从不一致)
  • ROW:记录行数据变化(推荐,保证一致性)
  • MIXED:混合模式
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-04-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT咸鱼 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • #一、环境准备(主从节点均需操作)
    • #1. 虚拟机基础配置
    • #2. 安装 MySQL 5.7
    • #3. 初始化 MySQL 安全配置
  • #二、主库(Master)配置
    • #1. 修改MySQL配置文件
    • #2. 重启MySQL服务
    • #3. 创建主从同步专用用户
    • #4. 查看主库状态
  • #三、从库(Slave)配置
    • #1. 修改MySQL配置文件
    • #2. 重启MySQL服务
    • #3. 配置主从复制链路
  • #四、验证主从同步
    • #1. 检查从库复制状态
    • #2. 数据同步测试
  • #五、故障排查大全
    • #1. 主从连接失败(Slave_IO_Running: No)
    • #2. 主从数据不一致(Slave_SQL_Running: No)
    • #3. 从库写入导致数据冲突
  • #六、高级配置(生产环境建议)
    • #1. GTID复制(全局事务标识)
    • #2. 半同步复制(确保数据安全)
    • #3. 监控脚本
  • #七、关键原理图解
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档