AI大模型教程
一起来学习

MYSQL主从复制实现

安装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主从复制的原理

  1. 主库开启binlog日志,将所有修改的操作写入binlog日志中,并告知从库我的日志跟新了你来拿啊 。
  2. 从库的I/O线程去请求主从的binlog日志,并拿到binlog日志的内容,会将二进制日志文件(binlog)写入自己的中继日志中(relay log)。
  3. SQL线程会去读取到中继日志(relay log)的内容,并执行sql语句使得从库与主库的数据达到一致。

文章来源于互联网:MYSQL主从复制实现

赞(0)
未经允许不得转载:5bei.cn大模型教程网 » MYSQL主从复制实现
分享到: 更多 (0)

AI大模型,我们的未来

小欢软考联系我们