安装MYSQL5.7
完成初始化可以去看我搭建LNMP的那个作品
# 安装 wget下载工具
yum -y install wget
#下载官方的yum源的包
wget https://repo.mysql.com/mysql57-community-release-el7-11.noarch.rpm
#mysql57 –代表MySQL5.7版本
#community –代表社区版本开源的
#release –这个包只是配置源,不是直接下载mysql
#el7 –适用于linux7
#11 –rpm包本身的版本
#noarch –这个包没有二进制文件,只要配置文件
#安装mysql的yum源
yum -y localinstall mysql57-community-release-el7-11.noarch.rpm
#yum的localinstall直接从本地下载mysql57-community-release-el7-11.noarch.rpm这个rpm包
## 配置yum源秘钥
rpm –import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
#用来验证MySQL包有没要问题
# 安装yum配置工具
yum -y install yum-utils
#安装这个工具是为了用这个命令yum-config-manager
#禁用8版本
yum-config-manager –disable mysql80-community
#防止他自动升级到更高的版本
# 启动5.7的版本
yum-config-manager –enable mysql57-community
# 安装服务端,客户端
yum -y install mysql-community-server mysql
# 设置开机启动机启动mysql服务端
systemctl enable mysqld –now
#相当于systemctl enable mysqld && systemctl start mysqld
#获取零时的密码
grep ‘password’ /var/log/mysqld.log
#MySQL只有启动之后才能获得这个临时密码
#登录MySQL并修改密码
mysql -uroot -p
#改密码
alter user ‘root’@’localhost’ identified by ‘你的密码’;
#密码要符合规范
exit
一. 传统的MySQL主从
这里配置一主一从
master节点
修改MySQL配置文件
vim /etc/my.cnf
#在文件的最下面加入
server-id=1 #用来区分不同的mysql服务的
read-only=0 #0表示可读可写配置slave的时候是1表示只读
log_bin=mysql-bin #开启MySQL的binlog日志,主从的关键
binlog_format=row #binlog日志的格式#重启
systemctl restart mysqld
mysql中binlog日志记录的三种格式
row:记录被修改行的实际前后数据,修改表中莫一行再修改之前记录这一行的值,修改之后也记录这一行的值,默认设置为row,也是最安全最一致的设置。但是这个日志文件要比statement大
statement:直接记录修改数据的sql语句,这种情况可能导致主从不一致
mixed:前两种的结合,不推荐
创建一个用户给slave权限
#登录mysql
mysql -uroot -p
#创建一个mysql用户–这个用户是给slave用的
create user ‘slave’@’%’ identified with mysql_native_password by ‘你的密码’;
#%表示可以从任意主机登录到mysql服务
#给这个用户权限所有库所有表的权限
grant replication slave on *.* to ‘slave’@’%’;
#刷新一下权限
flush privileges;
#再确认一下binlog日志的位置—这个位置后面配置需要用到
show master status;
+——————+———-+————–+——————+——————-+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+——————+———-+————–+——————+——————-+
| mysql-bin.000002 | 154 | | | |
+——————+———-+————–+——————+——————-+
1 row in set (0.00 sec)

slave节点
在另一台机器上,按照第一步安装MySQL5.7版本
修改配置文件
vim /etc/my.cnf
server-id=2 #不同的服务id
read-only=1 #设置为只读
log_bin=mysql-bin #开启binlog日志
binlog_format=row #binlog日志格式为row,将记录修改之前与修改之后的语句
这里slave不是只用执行查询语句,为什么也要开启binlog日志呢?
开启binlog日志就是把自己对数据库修改的语句记录下来保存到binlog日志中,也是每个master节点必须要开启的进程,如果当master节点突然宕机了或者挂掉了怎么办?我们可以让主从切换让slave来替换掉挂掉的master,这样主从的结构还能继续维持。
#重启mysql服务
systemctl restart mysqld
完成主从
#进入mysql
mysql -uroot -p
#停止slave
stop slave;
#进行初始化slave
change master to master_host=’master的IP地址’,master_user=’slave’,master_password=’你的master节点mysql的密码’,master_log_file=’在master节点show master status;看到的mysql-bin.000002′,master_log_pos=154;
#启动slave
start slave
#查看主从的状态
show slave statusG;
只要看到IO线程和SQL线程都是yes就是说明没问题

测试一下
在master节点
#创建一个库
ceate database if not exists test;
#进入这个库
use test;
#创建一个表
CREATE TABLE IF NOT EXISTS students ( id INT AUTO_INCREMENT PRIMARY KEY, -- 学生ID(自增主键) name VARCHAR(50) NOT NULL, -- 学生姓名 age INT, -- 年龄 gender ENUM('Male', 'Female'), -- 性别(枚举类型) enrollment_date DATE -- 入学日期 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
#插入几条数据
INSERT INTO students (name, age, gender, enrollment_date) VALUES
(‘张三’, 20, ‘Male’, ‘2023-09-01’),
(‘李四’, 22, ‘Female’, ‘2022-08-15’),
(‘王五’, 21, ‘Male’, ‘2023-03-10’),
(‘赵六’, 19, ‘Female’, ‘2024-01-20’),
(‘钱七’, 23, ‘Male’, ‘2021-07-05’);INSERT INTO students (name, age, gender, enrollment_date) VALUES ('张三', 20, 'Male', '2023-09-01'), ('李四', 22, 'Female', '2022-08-15'), ('王五', 21, 'Male', '2023-03-10'), ('赵六', 19, 'Female', '2024-01-20'), ('钱七', 23, 'Male', '2021-07-05');
在slave中查看

二. MySQL主从gtid方式
master
一样修改配置文件
vim /etc/my.cnf
server_id=1 #区分不同的MySQL服务,MySQL的唯一标识
gtid_mode=on #开启gtid模式,每个事务会获得全局唯一标识
enforce_gtid_consistency=on #强制gtid一致性,禁止执行会导致 GTID 不一致的 SQL 语log_bin=mysql-bin #开启binlog日志,记录所有数据修改操作
log-slave-updates=1 #实现级联复制(A→B→C)的关键配置,使中间节点(B)既能接收主库事件,又能将事件转发给下级从库
binlog_format=row #日志格式 ,记录实际修改的行数据skip_slave_start=1 #禁止复制线程随MySQL服务启动而启动,避免服务崩溃后自动启动复制导致数据不一致
重启mysql服务
systemctl restart mysqld
确认gtid模式开启
mysql -uroot -p
show master status;
show global variables like ‘%uuid%’;
show global variables like ‘%gtid%’;

查看binlog日志开启
show variables like ‘log_bin’;
授予slave复制的权限
grant replication slave,replication client on *.* to ‘slave’@’自己的网段比如192.168.66.%’ identified by “你的密码”;
刷新权限
flush privileges;
show grants for ‘slave’@’192.168.66.%’;
slave
vim /etc/my.cnf
server_id=2 #换个id
gtid_mode=on
enforce_gtid_consistency=on
log_bin=mysql-bin
log-slave-updates=1
binlog_format=row
skip_slave_start=on
read_only=on #从机只允许读操作
重启一下mysql服务
systemctl restart mysqld
登录mysql服务
mysql -uroot -p
停止slave
stop slave;
进行同步
change master to master_host=’masterIP地址’,master_user=’slave’,master_password=’在master上设置的slave密码’,master_auto_position=1;
启动slave
start slave;
查看slave状态
show slave status G;

自己测试一下
三. MySQL主从复制的原理

- 主库开启binlog日志,将所有修改的操作写入binlog日志中,并告知从库我的日志跟新了你来拿啊 。
- 从库的I/O线程去请求主从的binlog日志,并拿到binlog日志的内容,会将二进制日志文件(binlog)写入自己的中继日志中(relay log)。
- SQL线程会去读取到中继日志(relay log)的内容,并执行sql语句使得从库与主库的数据达到一致。
文章来源于互联网:MYSQL主从复制实现
5bei.cn大模型教程网










