MySQL 8.0.36 主从复制完整实验

一、环境准备

主从复制的前提是确保基础环境一致且网络互通,以下是本次实操的环境信息及前置要求。

1.1 环境说明

主机名 ip地址 操作系统 mysql版本
master 192.168.194.163 rhel9.4 yum安装mysql8.0.36
rep1 192.168.194.164 rhel9.4 yum安装mysql8.0.36

1.2 前置条件说明(生产必看)

在开始配置前,需确保以下条件已满足,否则可能导致复制失败:

MySQL 已正常安装 :主从库均已完成 MySQL 8.0.36 源码安装,且能通过/etc/init.d/mysqld start正常启动(源码安装需提前配置好服务脚本)。
网络互通 :主库与从库之间能 ping 通,且主库已开放 3306 端口(MySQL 默认端口),关闭安全组件,或者开放3306端口。
时间同步:主从库时间需一致(误差建议≤1 秒),否则会导致 binlog 时间戳异常,影响复制。

二、主库master配置步骤

主库的核心作用是记录二进制日志(binlog),并允许从库通过复制账号读取 binlog。以下是完整配置流程:

**2.1 配置 MySQL 主配置文件 **(/etc/my.cnf.d/mysql-server.cnf或/etc/my.cnf)

MySQL 的主从复制依赖my.cnf(主配置文件)中的关键参数,需编辑该文件启用 binlog 并设置唯一标识:

bash 复制代码
[root@master ~]# vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
# MySQL数据存储目录
datadir=/var/lib/mysql
# MySQL socket文件路径,用于本地进程通信
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/run/mysqld/mysqld.pid
# 主库唯一标识 
server_id=163
# 启用二进制日志(主从复制核心,日志文件前缀为binlog,文件会生成在datadir目录下)
log-bin=binlog

# 修改my.cnf后需重启 MySQL 服务
[root@master ~]# systemctl restart mysqld
# 登录MySQL,验证server_id是否为163(主库配置值)
[root@master ~]# mysql -uroot -p -e"select @@server_id;"
Enter password: 
+-------------+
| @@server_id |
+-------------+
|         163 |
+-------------+

2.2 创建复制专用账号并授权

从库需通过一个专用账号连接主库读取 binlog,该账号只需replication slave权限(最小权限原则,提升安全性):

sql 复制代码
[root@master ~]# mysql -uroot -p123
# 创建复制账号rep,允许从任何IP连接(%表示所有IP,生产建议限定从库IP,如'192.168.2.104')
mysql> create user 'rep'@'%' identified  by 'rep123';
# 授予rep账号复制权限(replication slave是复制必需的最小权限)
mysql> grant  replication slave on *.* to 'rep'@'%';
# 查看权限
mysql>  show grants for 'rep'@'%';
+---------------------------------------------+
| Grants for rep@%                            |
+---------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO `rep`@`%` |
+---------------------------------------------+

2.3 (可选) 锁定主库表,防止数据变更

全量备份主库数据前,需锁定所有表(仅允许读,禁止写),避免备份过程中数据不一致:

sql 复制代码
#为后面备份准备,注意生产环境要提前申请停机时间;
mysql> flush tables with read lock;
#提示:如果超过设置时间不操作会自动解锁。
mysql> show variables like '%timeout%';

2.4 查看主库 binlog 状态

sql 复制代码
#查看主库状态,即当前日志文件名和二进制日志偏移量
mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000003 |     1210 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+

2.5 (可选) 备份主数据库中数据

sql 复制代码
mysqldump -uroot -p -A -B |gzip > /server/backup/mysql_bak.$(date +%F).sql.gz

2.6 (可选) 解锁

sql 复制代码
mysql> unlock tables;

2.7 (可选)主库备份数据上传到从库

sql 复制代码
scp  /server/backup/mysql_bak.2025-08-07.sql.gz 192.168.194.164:/server/backup

三、从库rep1配置步骤

从库需设置唯一的server_id(与主库不同),若后续需搭建 "级联复制"(从库作为其他从库的主库),可启用 binlog(本文仅需基础主从,启用 binlog 更灵活):
3.1 配置 MySQL 配置文件

bash 复制代码
[root@rep1 mysql]# vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
# MySQL数据存储目录
datadir=/var/lib/mysql
# MySQL socket文件路径,用于本地进程通信
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/run/mysqld/mysqld.pid
# 主库唯一标识 
server_id=164

[root@rep1 ~]# systemctl restart mysqld
[root@rep1 ~]# mysql -uroot -p -e"select @@server_id;"

3.2 (可选)解压备份文件并恢复从库数据

将主库的全量备份文件解压,然后恢复到从库,确保从库初始数据与主库一致:

bash 复制代码
[root@rep1 backup]# ls
mysql_bak.2025-09-03.sql.gz
[root@rep1 backup]# gzip -d mysql_bak.2025-09-03.sql.gz 
# 恢复数据到从库(通过mysql命令执行备份SQL)
[root@rep1 backup]# mysql -uroot -p123 < mysql_bak.2025-09-03.sql 
[root@rep1 backup]# mysql -uroot -p -e 'show databases;'

3.3 配置从库复制参数

在从库 MySQL 中执行change master to命令,配置主库信息(含主库 IP、复制账号、binlog 文件名及位置),建立主从关联:

sql 复制代码
mysql> CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.194.163',
SOURCE_USER='rep',
SOURCE_PASSWORD='rep123',
SOURCE_LOG_FILE='binlog.000003',
SOURCE_LOG_POS=1210,
SOURCE_SSL=1; 

# 启动从库同步开关
mysql> start replica;

3.4 检查状态

sql 复制代码
mysql> show replica status\G
Slave_IO_Running: Yes    #IO线程是否打开
Slave_SQL_Running: Yes   #SQL线程是否打开

四、MySQL主从复制的状况监测

sql 复制代码
#在主库上查看该主库有多少从库
mysql> show replicas;
+-----------+------+------+-----------+--------------------------------------+
| Server_Id | Host | Port | Source_Id | Replica_UUID                         |
+-----------+------+------+-----------+--------------------------------------+
|       129 |      | 3306 |       200 | 5600a85a-72ee-11f0-9706-000c29f34354 |
+-----------+------+------+-----------+--------------------------------------+

#主库创建一个数据库
[root@master ~]# mysql -uroot -p -e 'create database test1;'

#在从库可以看到主库同步过来的数据库
[root@rep1 mysql]# mysql -uroot -p -e 'show databases;'
Enter password:
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test1              |
+--------------------+
相关推荐
LQ深蹲不写BUG14 小时前
MySql的事务机制
数据库·mysql
xhbh66617 小时前
开发效率翻倍:资深DBA都在用的MySQL客户端利器
数据库·mysql·数据库连接工具·mysql 连接工具
CoderYanger20 小时前
MySQL数据库——3.2.1 表的增删查改-查询部分(全列+指定列+去重)
java·开发语言·数据库·mysql·面试·职场和发展
花哥码天下1 天前
MySQL事务日志类型及作用解析
数据库·mysql
手握风云-1 天前
MySQL数据库精研之旅第十七期:深度拆解事务核心(下)
数据库·mysql
杏花春雨江南1 天前
可重复读 是否“100%”地解决幻读?
数据库·mysql
neo_Ggx231 天前
MySQL数据库备份攻略:从Docker到本地部署
数据库·mysql·docker
武子康1 天前
Java-118 深入浅出 MySQL ShardingSphere 分片剖析:SQL 支持范围、限制与优化实践
java·大数据·数据库·分布式·sql·mysql·性能优化
问道飞鱼1 天前
【数据库相关】TxSQL新增数据库节点步骤
数据库·mysql·txsql·新增节点