![在这里插入图片描述](https://img-blog.csdnimg.cn/3e04f2768d1b493da15064300e3f6bd9.png)
**测试:**
客户端1:
mysql -uroot -p1234
#删除000002之前的日志文件,不包含000002
purge master logs to ‘binlog.000002’;
![在这里插入图片描述](https://img-blog.csdnimg.cn/56608e1e7ff5477c8b3e5342993b226d.png)
客户端2:
cd /var/lib/mysql
#可以看到二进制日志文件和索引文件
ll
![在这里插入图片描述](https://img-blog.csdnimg.cn/73a8d50c54f344a4b3579b95fbf67e26.png)
### 1.3 查询日志
查询日志中记录了客户端的**所有操作语句**,而二进制日志不包含查询数据的SQL语句。默认情况下, 查询日志是**未开启的**。
mysql -uroot -p1234
#检查参数查看开关是否开启
#可以看到默认是关闭的以及日志文件所处位置和文件名
show variables like ‘%general%’;
![在这里插入图片描述](https://img-blog.csdnimg.cn/3be6158c26114b90bdcde215633a052f.png)
如果需要开启查询日志,可以修改MySQL的配置文件 /etc/my.cnf 文件,添加如下内容:
vim /etc/my.cnf
#该选项用来开启查询日志 , 可选值 : 0 或者 1 ; 0 代表关闭, 1 代表开启
general_log=1
#设置日志的文件名 , 如果没有指定, 默认的文件名为 host_name.log
general_log_file=mysql_query.log
#重启mysql服务
systemctl restart mysqld.service
#查看这个目录下是否会生成此日志文件
cd /var/lib/mysql/
ll
![在这里插入图片描述](https://img-blog.csdnimg.cn/eae4335f69224a1294561a3b4cd36b84.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/0f2369c6b2814082ae31b89fd798903e.png)
开启了查询日志之后,在MySQL的数据存放目录,也就是 /var/lib/mysql/ 目录下就会出现mysql\_query.log 文件。之后所有的客户端的增删改查操作都会记录在该日志文件之中,长时间运行后,该日志文件将会非常大。所以用不上此日志文件,我们可以把它关上。
**测试**:
客户端1:
mysql -uroot -p1234
use db01;
#执行查询操作(前提是已经登录)
select * from stu;
#执行更新操作
update stu set age=100 where id=7;
![在这里插入图片描述](https://img-blog.csdnimg.cn/ff183f80a03d4272ad0f6035269f546b.png)
客户端2:
cd /var/lib/mysql/
#前提是已经进入到了这个目录,并且目录下有这个文件(上面已经配置过了)
#实时刷新此日志文件尾部的内容(tail查看文件尾部,-f表示实时刷新)
tail -f mysql_query.log
可以看到所有的DDL和DML操作都会在日志表当中记录。
![在这里插入图片描述](https://img-blog.csdnimg.cn/03ea7014bb02484386d33c5c7a99da24.png)
### 1.4 慢查询日志
慢查询日志记录了所有执行时间超过参数 long\_query\_time 设置值并且扫描记录数不小于min\_examined\_row\_limit 的所有的SQL语句的日志,**默认未开启**。long\_query\_time 默认为10 秒,最小为 0, 精度可以到微秒。
解释:
* 慢查询日志记录了执行效率比较低,执行速度比较慢的sql语句。
* 之前在索引的sql性能分析中讲解过。
如果需要开启慢查询日志,需要在MySQL的配置文件 /etc/my.cnf 中配置如下参数:
#慢查询日志:1代表开启
slow_query_log=1
#执行时间参数:表示执行时间超过2秒就是慢查询日志,此时慢查询日志文件就会记录这条sql.
long_query_time=2
默认情况下,**不会记录管理语句,也不会记录不使用索引进行查找的查询**。可以使用log\_slow\_admin\_statements和 更改此行为 log\_queries\_not\_using\_indexes,如下所述。
解释:
* 通过在`vim /etc/my.cnf` 配置文件中配置这2个参数,可以改变它的默认行为。
* 如果添加了log\_slow\_admin\_statements =1:表示当我们执行比较慢的管理语句的时候,也会记录在慢查询日志当中。
* 如果添加了log\_queries\_not\_using\_indexes = 1:表示如果某一条sql语句,它没有使用索引而造成执行效率比较慢的话,也会记录在慢查询日志当中。
* 通过慢查询日志就可以定位出那些sql执行效率低,从而对这类的sql进行优化。
#记录执行较慢的管理语句
log_slow_admin_statements =1
#记录执行较慢的未使用索引的语句
log_queries_not_using_indexes = 1
>
> 上述所有的参数配置完成之后,都需要重新启动MySQL服务器才可以生效。
>
>
>
**测试:**
客户端1:
mysql -uroot -p1234
#db01数据库下有tb_sku表,存放了1000万条记录
#电脑太卡,所以我没有创建tb_sku表,这里不在演示,只显示最终结果
use db01;
#不会记录
select * from tb_user limit 0,10; – 这条SQL执行效率比较高, 执行耗时 0.01sec
#前面学习过SQL优化,分页查询越向后效率越低,此时超过2秒,会记录在慢查询日志中
select * from tb_user limit 1000000,10; – 由于tb_sku表中, 预先存入了1000w的记录, count一次,耗时4.71sec(秒)
客户端2:
#配置慢查询日志
vim /etc/my.cnf
#配置的内容
slow_query_log=1
long_query_time=2
重启Mysql服务器
systemctl restart mysqld
进入到此目录,发现会有一个后缀是-slow.log的日志文件
cd /var/lib/mysql/
ll
#实时刷新文件尾部的位置发现:
#记录了什么时间哪一个用户在哪一个主机上执行了什么样的sql语句
tail -f mysql8-slow.log
![在这里插入图片描述](https://img-blog.csdnimg.cn/00960a113dc24c05ad8c66c13655f9ef.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/13ea5a118f504435bbab656fb6ab39e2.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/71c283636fc640ecbe8519553ca3d0b6.png)
## 2.主从复制
### 2.1 概述
主从复制是指将主数据库的 DDL 和 DML 操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。
MySQL支持一台主库同时向多台从库进行复制, 从库同时也可以作为其他从服务器的主库,实现链状复制。
![在这里插入图片描述](https://img-blog.csdnimg.cn/daa7977e0ec14658a167279eccdfb969.png)
MySQL 复制的优点主要包含以下三个方面:
* 主库出现问题,可以快速切换到从库提供服务。
* 实现读写分离,降低主库的访问压力。
+ 增删改操作主库,查询操作从库。
* 可以在从库中执行备份,以避免备份期间影响主库服务。
+ 数据备份的时候加上全局锁以防止备份的数据不完整,此时数据库处于只读状态,其它的客户端只能查询不能做增删改。
+ 有了主从复制后,可以在从库当中进行备份只需要锁从库就行,主库仍然可以进行增删改等操作。从库加了全局锁后仍然可以查询,只不过在数据备份期间可能存在一定的数据延迟,因为在备份期间从库是不能够执行从主库同步过来的二进制日志的。
+ 解决:可以使用single-transaction参数代替加全局锁的方式进行备份,来保证数据的一致性备份------详情查看全局锁。
### 2.2 原理
MySQL主从复制的核心就是 **二进制日志**,具体的过程如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/6a22c268af49424e86d1142c7888ab3e.png)
从上图来看,复制分成三步:
1. Master 主库在事务提交时,会把数据变更记录在二进制日志文件 Binlog 中。
2. 从库读取主库的二进制日志文件 Binlog ,写入到从库的`中继日志 Relay Log` 。
* 从库中的IOthread线程:发起一个请求连接主数据库,然后读取主数据库中的 Binlog日志,读取完并返回从库之后,此线程会把Binlog日志写入到从库自身的一份日志(中继日志 Relay Log)中。
3. slave从库重做中继日志中的事件,将改变反映它自己的数据。
* 从库中的SQLthread线程:读取中继日志当中的数据,然后把中继日志当中所记录的数据变化在反映到自身数据库的数据变化,从而保证主从数据的一致。
举例:主库执行insert语句之后写入到二进制日志中,然后被IOthread线程读取过来之后写入到中继日志,那么SQLthread线程读取中继日志就会读取到这条insert语句,那么接下来在从库当中再去执行这条insert,此时就保证了主从数据的一致。
### 2.3 搭建
#### 2.3.1 环境准备
![在这里插入图片描述](https://img-blog.csdnimg.cn/5f584312b5914fccb49d31ad25a3f1a8.png)
准备好两台服务器之后,在上述的两台服务器中分别安装好MySQL,并完成基础的初始化准备(安装、 密码配置等操作)工作(`注意要关闭防火墙`)。 其中:
* `192.168.10.200`作为主服务器master
+ 主机名:master
* `192.168.10.201`作为从服务器slave
+ 主机名:slave
![在这里插入图片描述](https://img-blog.csdnimg.cn/f2a39fed1f04409996e7673e9cd00161.png)
**`注意事项`:**
* 首先配置的ip地址要和虚拟机配置的域名解析要在同一个网段,只有最后一个可以不同。
![在这里插入图片描述](https://img-blog.csdnimg.cn/37e6d5ffaf564fde92ce2506d709733a.png)
* 如果重启虚拟机后不显示ens33网卡,需要重启网络服务,当然启动服务时有可能会报错,需要关闭NetworkManger 服务。
+ ifconfig异常情况不显示ens33:
![在这里插入图片描述](https://img-blog.csdnimg.cn/08cb4a0bf4f64a988297f614e6a6b3f5.png)
+ ifconfig正常情况显示ens33:
![在这里插入图片描述](https://img-blog.csdnimg.cn/02c3d4eee83c499da1b0b8573e8510a7.png)
#重启网络服务,可能会报错
service network restart
#如果报错:可能是和 NetworkManager 服务有冲突
#NetworkManager 是一个为系统提供检测和配置功能以便自动连接到网络的程序。包含一个守护程序、一个命令行界面(nmcli)和一个基于 curses 的界面(nmtui)。
#解决:直接关闭 NetworkManger 服务就好了,并且禁止开机启动,之后在重启网络服务
#关闭NetworkManger 服务
service NetworkManager stop
#禁止开机启动
chkconfig NetworkManager off
#此时再次启动网络服务就会成功了
service network restart
最后查看2台mysql服务器的运行状态:
systemctl status mysqld
![在这里插入图片描述](https://img-blog.csdnimg.cn/b5e8156e355f4467b08b2018369f1e27.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/692c54f72c274f59bfc4ff1525000095.png)
#### 2.3.2 主库配置
1.修改配置文件 `vim /etc/my.cnf`
#mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 232-1,默认为1
server-id=1
#是否只读,1 代表只读, 0 代表读写
read-only=0
#以下2个不需要配置,表示创建的所有数据库都需要进行同步
#忽略的数据, 指不需要同步的数据库
#binlog-ignore-db=mysql
#指定同步的数据库
#binlog-do-db=db01
![在这里插入图片描述](https://img-blog.csdnimg.cn/7caafd0b044144b6b85a080d53b2007c.png)
2.重启MySQL服务器
#如果没有报错代表配置文件中的配置成功
systemctl restart mysqld
![在这里插入图片描述](https://img-blog.csdnimg.cn/17f8a94cbf1c4aba9c5bdd85cef64658.png)
3.`登录mysql`,创建远程连接的账号,并授予主从复制权限
解释
* ‘itcast’@‘%’:其中`itcast`是用户名,@'%代表这个用户可以在任意主机上来访问当前服务器
* 密码是:`Root@123456`
#需要先登录mysql
mysql -uroot -p1234
#创建itcast用户,并设置密码,该用户可在任意主机连接该MySQL服务
#作用:在从库当中连接主库时的账号和密码。
CREATE USER ‘itcast’@‘%’ IDENTIFIED WITH mysql_native_password BY ‘Root@123456’;
#为 ‘itcast’@‘%’ 用户分配主从复制权限
GRANT REPLICATION SLAVE ON *.* TO ‘itcast’@‘%’;
![在这里插入图片描述](https://img-blog.csdnimg.cn/4e27317ded7c46d5aaa4cd39fc1d3011.png)
4.通过指令,查看二进制日志坐标
show master status ;
![在这里插入图片描述](https://img-blog.csdnimg.cn/2a53b972c9664204b28bc3990f483b67.png)
字段含义说明:
* file : 从哪个日志文件开始推送日志文件(写到那个日志文件了)
* position : 从哪个位置开始推送日志
* binlog\_ignore\_db : 指定不需要同步的数据库
>
> * `主库配置完后就不要在执行DML增删改以及DDL语句了。`
>
>
>
#### 2.3.3 从库配置
1.修改配置文件 `vim /etc/my.cnf`
#mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 2^32-1,和主库不一样即可
server-id=2
#是否只读,1 代表只读, 0 代表读写
#从库只需要做查询操作不需要做修改操作,所以设置为1也可以。
#这个选项仅仅代表是普通用户只读,如果这个用户具有超级管理员super的权限,那么他也是可以进行读写的。
read-only=1
#如果想要禁用超级管理员的读写功能,让它也变为只有读的功能,可以设置以下参数
super-read-only=1
![在这里插入图片描述](https://img-blog.csdnimg.cn/1254a76e5d884529a08847e2ce06a085.png)
2.重新启动MySQL服务
systemctl restart mysqld
![在这里插入图片描述](https://img-blog.csdnimg.cn/5721e7d5fa0649369da9a2ccbf8abf14.png)
3.`登录mysql`,设置主库配置
现在主库和从库是没有关系的,并没有产生关联,所以接下来还要在从库中去设置主库的相关配置。
* SOURCE\_HOST=‘192.168.200.200’:原主机地址是多少,也就是主库的ip
* SOURCE\_USER=‘itcast’:连接这个ip地址对应的mysql,那么我的用户名是多少
* SOURCE\_PASSWORD=‘Root@123456’:密码是多少
* SOURCE\_LOG\_FILE=‘binlog.000004’:从哪个二进制日志文件开始同步
* SOURCE\_LOG\_POS=663:表示从这份日志文件中的哪个位置开始同步。
mysql -uroot -p1234
CHANGE REPLICATION SOURCE TO SOURCE_HOST=‘192.168.10.200’, SOURCE_USER=‘itcast’,SOURCE_PASSWORD=‘Root@123456’, SOURCE_LOG_FILE=‘binlog.000012’,SOURCE_LOG_POS=663;
![在这里插入图片描述](https://img-blog.csdnimg.cn/6d720a4fbc594b75a33c4b7b6b753e30.png)
上述是8.0.23中的语法。如果mysql是 8.0.23 **之前**的版本,执行如下SQL:
CHANGE MASTER TO MASTER_HOST=‘192.168.10.201’, MASTER_USER=‘itcast’,MASTER_PASSWORD=‘Root@123456’, MASTER_LOG_FILE=‘binlog.000012’,MASTER_LOG_POS=663;
**2个版本的区别是参数名不同:当前使用的8.0.26版本兼容之前的语法,所以执行那一条都可以**
| 参数名 | 含义 | 8.0.23之前 |
| --- | --- | --- |
| SOURCE\_HOST | 主库IP地址 | MASTER\_HOST |
| SOURCE\_USER | 连接主库的用户名 | MASTER\_USER |
| SOURCE\_PASSWORD | 连接主库的密码 | MASTER\_PASSWORD |
| SOURCE\_LOG\_FILE | binlog日志文件名 | MASTER\_LOG\_FILE |
| SOURCE\_LOG\_POS | binlog日志文件位置 | MASTER\_LOG\_POS |
4.开启同步操作
start replica ; #8.0.22之后
start slave ; #8.0.22之前
![在这里插入图片描述](https://img-blog.csdnimg.cn/9b3880f69dbf47d3805cbb25de9debf3.png)
5.查看主从同步状态
show replica status ; #8.0.22之后
#表中的数据比较大展示出来的效果比较混乱,可以加上\G把每一列数据转化为每一行显示。
show replica status\G;
show slave status ; #8.0.22之前
**效果**:只需要以下2个选项为yes就代表主从复制正常,IO-Running代表那一组io线程运行是否正常,SQL-Running代表那一组sql线程运行是否正常。
**错误情况**:如果是克隆的虚拟机,mysql的uuid值是一样的,必须修改从库虚拟机的mysql服务器uuid的值,和主库不能一样
![在这里插入图片描述](https://img-blog.csdnimg.cn/fb44b17fdaa5473b83a28469b17ed53c.png)
解决:
#不需要登录mysql
#修改此文件中的uuid值,随便修改一个字符
vim /var/lib/mysql/auto.cnf
#重启mysql服务
systemctl restart mysqld
![在这里插入图片描述](https://img-blog.csdnimg.cn/92c3d621500942cd8de7454fcd748a19.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/41eeb4874c0d40308be1d8aac5fb11fb.png)
再次查询主从同步状态,此时都为yes(注意在从库执行)
#登录进mysql后执行,可以开启多个会话窗口这样就不需要多次登陆了
show replica status\G;
![在这里插入图片描述](https://img-blog.csdnimg.cn/722daaedf81c4e8cb76ef5299f2f5765.png)
#### 2.3.4 测试
先查询此时的数据库状态:
show databases;
![在这里插入图片描述](https://img-blog.csdnimg.cn/15d3843af83040b4b3345e7b1ae8509c.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/7de2f11308214c46bc42245879be4461.png)
1.在**主库** 192.168.10.200 上创建数据库、表,并插入数据
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/9cedd3945f88efcbae3cd7d2b0d68064.png)
![img](https://img-blog.csdnimg.cn/img_convert/e7a4041354963bdf9c464f0eee7e92ab.png)
![img](https://img-blog.csdnimg.cn/img_convert/c7e22951509868fb2833f77fd92e68fc.png)
![img](https://img-blog.csdnimg.cn/img_convert/c304108812614206ee5c2e5456fa3d37.png)
![img](https://img-blog.csdnimg.cn/img_convert/7ec44ab292e53e8ee7f394504469ce7d.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)**
![img](https://img-blog.csdnimg.cn/img_convert/2a5e0e523fc370bf7c408e8ad7ce90bf.jpeg)
### 最后的话
最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!
### 资料预览
给大家整理的视频资料:
![](https://img-blog.csdnimg.cn/img_convert/49e99cb92c3d991b0852b40d2bee1cd5.png)
给大家整理的电子书资料:
![](https://img-blog.csdnimg.cn/img_convert/a8bdd2f1b0d5998b43700aa3a7215d8f.png)
**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**
**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
![img](https://img-blog.csdnimg.cn/img_convert/15627c04799b4a4e9afa5c24dfd06785.jpeg)
84Naz-1712972056498)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)**
[外链图片转存中...(img-2NTjeykN-1712972056498)]
### 最后的话
最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!
### 资料预览
给大家整理的视频资料:
[外链图片转存中...(img-0EqWQJiC-1712972056498)]
给大家整理的电子书资料:
[外链图片转存中...(img-RY9YXXnm-1712972056498)]
**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**
**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
[外链图片转存中...(img-JhTxbcG1-1712972056499)]