openEuler MySQL 8.0 主从复制部署与排查步骤
参考博客:https://www.cnblogs.com/gxl2004/p/19931158
一、前置环境准备
1. 节点规划
| 节点角色 | 主机名 | IP 地址 |
|---|---|---|
| 主库 Master | master | 192.168.10.229 |
| 从库 Slave | slave | 192.168.10.230 |
2. 双节点共同执行(主 + 从都要操作)
以下命令在 master 和 slave 两台机器上完全一致,均需执行。
(1)配置主机名解析
vim /etc/hosts文件末尾追加:
192.168.100.4 master 192.168.100.5 slave(2)关闭防火墙与 SELinux
# 关闭防火墙并禁用开机自启 systemctl disable firewalld --now # 临时关闭SELinux setenforce 0 # 永久关闭SELinux sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config(3)安装 MySQL 8.0 并初始化
# 安装服务 yum install -y mysql-server # 启动并设置开机自启 systemctl enable mysqld --now # 登录MySQL设置root密码 mysqlMySQL 命令行内执行:
alter user 'root'@'localhost' identified by '你的root密码'; flush privileges; exit;(4)设置系统时区
timedatectl set-timezone Asia/Shanghai3. 分节点设置主机名
【仅主库 master 执行】
hostnamectl set-hostname master bash【仅从库 slave 执行】
hostnamectl set-hostname slave bash4. 分节点配置 Chrony 时间同步
【仅主库 master 执行】
# 安装chrony yum install -y chrony systemctl enable chronyd --now # 修改配置文件 vim /etc/chrony.conf注释默认pool行,添加以下内容:
server ntp.aliyun.com iburst server ntp.tencent.com iburst allow 192.168.0.0/16 local stratum 10重启并同步时间:
systemctl restart chronyd chronyc makestep【仅从库 slave 执行】
# 安装chrony yum install -y chrony systemctl enable chronyd --now # 修改配置文件 vim /etc/chrony.conf注释默认pool行,添加以下内容:
server master iburst重启并同步时间:
systemctl restart chronyd chronyc makestep二、主库(Master)专属配置步骤
以下所有命令仅在 master 节点执行。
1. 修改主配置文件/etc/my.cnf
vim /etc/my.cnf找到[mysqld]段,追加以下配置(末尾保留!includedir):
有关相关核心参数含义可以参考文章首部博主帖子,里面讲解的很详细
[mysqld] # ========== 主从复制核心参数 ========== server-id = 4 log_bin = mysql-bin binlog_format = ROW expire_logs_days = 7 sync_binlog = 1 binlog-ignore-db = mysql binlog-ignore-db = information_schema binlog-ignore-db = performance_schema binlog-ignore-db = sys # ========== 性能优化参数 ========== innodb_buffer_pool_size = 2560M innodb_buffer_pool_instances = 4 max_connections = 500 character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci # 引入子配置目录(默认已有则保留) !includedir /etc/my.cnf.d2. 创建子配置文件mysql-server.cnf
说明:MySQL 官方 RPM 包默认不自带该文件,需手动创建。
# 确保目录存在 mkdir -p /etc/my.cnf.d # 创建并编辑子配置 vim /etc/my.cnf.d/mysql-server.cnf写入内容:
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock log-error=/var/log/mysql/mysqld.log pid-file=/run/mysqld/mysqld.pid3. 重启服务并验证配置生效
systemctl restart mysqld验证核心参数:
mysql -uroot -p'你的root密码' -e "show variables like 'log_bin';" mysql -uroot -p'你的root密码' -e "show variables like 'server_id';" mysql -uroot -p'你的root密码' -e "show variables like 'binlog_format';"预期结果:log_bin = ON、server_id = 4、binlog_format = ROW。
4. 创建复制专用账号
登录 MySQL 命令行:
mysql -uroot -p'你的root密码'执行 SQL:
create user 'repl'@'slave' identified with mysql_native_password by 'Abc@1234'; grant replication slave on *.* to 'repl'@'slave'; flush privileges;5. 记录 binlog 状态(从库配置需要)
show master status;记下输出中的File(如mysql-bin.000001)和Position(如864),后续从库配置必须使用这两个值。
三、从库(Slave)专属配置步骤
以下所有命令仅在 slave 节点执行。
1. 修改主配置文件/etc/my.cnf
vim /etc/my.cnf找到[mysqld]段,追加以下配置:
[mysqld] # ========== 主从复制核心参数 ========== server-id = 5 relay-log = mysql-relay-bin read_only = 1 relay_log_recovery = 1 # ========== 并行复制优化 ========== slave_parallel_type = LOGICAL_CLOCK slave_parallel_workers = 4 # ========== 性能优化参数(与主库一致) ========== innodb_buffer_pool_size = 2560M innodb_buffer_pool_instances = 4 max_connections = 500 character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci # 引入子配置目录 !includedir /etc/my.cnf.d2. 创建子配置文件mysql-server.cnf
与主库完全一致,手动创建:
mkdir -p /etc/my.cnf.d vim /etc/my.cnf.d/mysql-server.cnf[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock log-error=/var/log/mysql/mysqld.log pid-file=/run/mysqld/mysqld.pid3. 重启服务并验证配置生效
systemctl restart mysqld验证核心参数:
mysql -uroot -p'你的root密码' -e "show variables like 'server_id';" mysql -uroot -p'你的root密码' -e "show variables like 'read_only';"预期结果:server_id = 5、read_only = ON。
4. 配置主从复制关联
登录 MySQL 命令行:
mysql -uroot -p'你的root密码'执行 SQL,填入主库记录的 binlog 文件名和偏移量:
CHANGE MASTER TO MASTER_HOST='master', MASTER_USER='repl', MASTER_PASSWORD='Abc@1234', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=864;5. 启动复制线程
start slave;查看复制状态:
show slave status\G核心校验标准:
Slave_IO_Running: YesSlave_SQL_Running: YesLast_IO_Error和Last_SQL_Error为空
四、主从同步功能验证
【仅主库 master 执行】写入测试数据
create database cloud; use cloud; create table user (id int auto_increment primary key, username varchar(50) not null); insert into user (username) values ('test_data');【仅从库 slave 执行】查询验证
use cloud; select * from user;能查询到test_data记录,则主从复制部署成功。
五、故障标准化排查步骤
第一步:【仅从库执行】检查复制核心状态(必做第一步)
show slave status\G重点核对 4 个字段:
| 字段 | 正常状态 | 异常方向 |
|---|---|---|
Slave_IO_Running | Yes | 网络、账号、binlog 文件问题 |
Slave_SQL_Running | Yes | 数据不一致、SQL 执行报错 |
Last_IO_Error | 空 | IO 线程具体报错信息 |
Last_SQL_Error | 空 | SQL 线程具体报错信息 |
第二步:【仅主库执行】排查主库端问题
当Slave_IO_Running = No或主库操作未同步时执行。
- 确认 binlog 已开启
show variables like 'log_bin';若为OFF,说明配置未生效,需检查/etc/my.cnf并重启 MySQL。
- 确认 server-id 生效
show variables like 'server_id';值必须非 0,且与从库不重复。
- 检查复制账号权限
show grants for 'repl'@'slave';必须包含REPLICATION SLAVE权限。
- 确认操作已写入 binlog
show master status;执行写操作后,Position数值应增长;未增长说明操作被binlog-ignore-db规则忽略。
避坑提醒:
binlog-ignore-db基于当前默认数据库判断,若先use mysql再建业务库,操作不会记录 binlog。
第三步:【仅从库执行】排查从库端问题
- 测试主库网络与端口连通性
# 测试3306端口 telnet master 3306 # 用复制账号直连主库 mysql -urepl -p'Abc@1234' -h master -P 3306连接失败需排查防火墙、主机名解析、账号权限。
- 确认 server-id 不重复
show variables like 'server_id';必须与主库数值不同。
- 查看中继日志是否生成
ls /var/lib/mysql/mysql-relay-bin*无文件说明 IO 线程未正常拉取日志。
第四步:数据一致性错误修复
当Slave_SQL_Running = No且报错为 1062(主键冲突)、1032(记录不存在)时执行。
新搭建环境推荐方案:
- 主库全量备份数据,记录最新
File和Position; - 从库清空对应数据库,导入主库备份;
- 从库重新执行
CHANGE MASTER TO填入最新位点,再启动复制。
临时应急方案(生产慎用,会导致数据不一致):
stop slave; set global sql_slave_skip_counter = 1; start slave;六、典型问题速查
| 问题现象 | 执行节点 | 解决方向 |
|---|---|---|
/etc/my.cnf.d/mysql-server.cnf不存在 | 主 + 从 | 官方 RPM 默认不提供,按本文步骤手动创建即可 |
| 主库建库建表,从库无数据 | 先从后主 | 先查从库复制线程状态,再查主库 binlog 是否开启、操作是否被忽略 |
Slave_IO_Running = No | 主 + 从 | 排查网络、端口、账号密码、server-id 重复、binlog 文件过期 |
Slave_SQL_Running = No | 从库 | 查看具体报错,修复数据一致性后重启复制 |
| 同步延迟持续增大 | 从库 | 开启并行复制、优化大事务、提升从库硬件性能 |