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密码
mysql

MySQL 命令行内执行:

alter user 'root'@'localhost' identified by '你的root密码';
flush privileges;
exit;
(4)设置系统时区
timedatectl set-timezone Asia/Shanghai

3. 分节点设置主机名

【仅主库 master 执行】
hostnamectl set-hostname master
bash
【仅从库 slave 执行】
hostnamectl set-hostname slave
bash

4. 分节点配置 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.d

2. 创建子配置文件 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.pid

3. 重启服务并验证配置生效

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 = ONserver_id = 4binlog_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.d

2. 创建子配置文件 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.pid

3. 重启服务并验证配置生效

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 = 5read_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: Yes
  • Slave_SQL_Running: Yes
  • Last_IO_ErrorLast_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 或主库操作未同步时执行。

  1. 确认 binlog 已开启
show variables like 'log_bin';

若为 OFF,说明配置未生效,需检查 /etc/my.cnf 并重启 MySQL。

  1. 确认 server-id 生效
show variables like 'server_id';

值必须非 0,且与从库不重复。

  1. 检查复制账号权限
show grants for 'repl'@'slave';

必须包含 REPLICATION SLAVE 权限。

  1. 确认操作已写入 binlog
show master status;

执行写操作后,Position 数值应增长;未增长说明操作被 binlog-ignore-db 规则忽略。

避坑提醒:binlog-ignore-db 基于当前默认数据库判断,若先 use mysql 再建业务库,操作不会记录 binlog。


第三步:【仅从库执行】排查从库端问题

  1. 测试主库网络与端口连通性
# 测试3306端口
telnet master 3306

# 用复制账号直连主库
mysql -urepl -p'Abc@1234' -h master -P 3306

连接失败需排查防火墙、主机名解析、账号权限。

  1. 确认 server-id 不重复
show variables like 'server_id';

必须与主库数值不同。

  1. 查看中继日志是否生成
ls /var/lib/mysql/mysql-relay-bin*

无文件说明 IO 线程未正常拉取日志。


第四步:数据一致性错误修复

Slave_SQL_Running = No 且报错为 1062(主键冲突)、1032(记录不存在)时执行。

新搭建环境推荐方案

  1. 主库全量备份数据,记录最新 FilePosition
  2. 从库清空对应数据库,导入主库备份;
  3. 从库重新执行 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 从库 查看具体报错,修复数据一致性后重启复制
同步延迟持续增大 从库 开启并行复制、优化大事务、提升从库硬件性能
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐