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 并设置唯一标识:
[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权限(最小权限原则,提升安全性):
[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 (可选) 锁定主库表,防止数据变更
全量备份主库数据前,需锁定所有表(仅允许读,禁止写),避免备份过程中数据不一致:
#为后面备份准备,注意生产环境要提前申请停机时间;
mysql> flush tables with read lock;
#提示:如果超过设置时间不操作会自动解锁。
mysql> show variables like '%timeout%';
2.4 查看主库 binlog 状态
#查看主库状态,即当前日志文件名和二进制日志偏移量
mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000003 | 1210 | | | |
+---------------+----------+--------------+------------------+-------------------+
2.5 (可选) 备份主数据库中数据
mysqldump -uroot -p -A -B |gzip > /server/backup/mysql_bak.$(date +%F).sql.gz
2.6 (可选) 解锁
mysql> unlock tables;
2.7 (可选)主库备份数据上传到从库
scp /server/backup/mysql_bak.2025-08-07.sql.gz 192.168.194.164:/server/backup
三、从库rep1配置步骤
从库需设置唯一的server_id(与主库不同),若后续需搭建 “级联复制”(从库作为其他从库的主库),可启用 binlog(本文仅需基础主从,启用 binlog 更灵活):
3.1 配置 MySQL 配置文件
[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 (可选)解压备份文件并恢复从库数据
将主库的全量备份文件解压,然后恢复到从库,确保从库初始数据与主库一致:
[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 文件名及位置),建立主从关联:
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 检查状态
mysql> show replica status\G
Slave_IO_Running: Yes #IO线程是否打开
Slave_SQL_Running: Yes #SQL线程是否打开
四、MySQL主从复制的状况监测
#在主库上查看该主库有多少从库
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 |
+--------------------+