MySql运维篇---008:日志,Linux运维开发基础机构

#在这个文件中添加一行内容
binlog_format=STATEMENT

#重新启动mysql服务
systemctl restart mysqld.service

cd /var/lib/mysql

#可以看到此时重新生成了一个日志文件binlog.000005,原先是1~4。
#因为它的二进制日志格式改了,他不会再往原来的二进制日志文件写入了,而是写到一个新的日志文件中。
ll


![在这里插入图片描述](https://img-blog.csdnimg.cn/a5c5f6d304a7486fa1934b4515718558.png)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/a0cb778a17f24526b7a9f47a0eb7e153.png)


第二步:再次执行之前的更新语句



mysql -uroot -p1234

use db01;

update stu set age = age +1 where id =1;


![在这里插入图片描述](https://img-blog.csdnimg.cn/257fbd2fc83248bbb4f997893b7a4b3f.png)


第三步:再次查看这个新生成的二进制日志表的内容



#进入到二进制日志文件存放的位置
cd /var/lib/mysql

#可以看到此目录下有这个日志文件
ll

#查看此二进制日志文件
#不需要加-v,因为是STATEMENT它本身记录的就是sql语句
#效果:可以看到此时记录的就是sql语句而不是每一行的数据变化
mysqlbinlog binlog.000005;


![在这里插入图片描述](https://img-blog.csdnimg.cn/d4d55f532d0440d789842b7ef4bc3fec.png)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/0c9b67a7758946f395c9410da69ab25f.png)


#### 1.2.4 删除


对于比较繁忙的业务系统,每天生成的binlog数据巨大,如果长时间不清除,将会占用大量磁盘空间。可以通过以下几种方式清理日志:




| 指令 | 含义 |
| --- | --- |
| `reset master`  | 删除全部 binlog 日志,删除之后,日志编号,将从 binlog.000001重新开始 |
| `purge master logs to 'binlog.*****'` | 删除 \*\*\*\*\* 编号之前的所有日志 |
| `purge master logs before 'yyyy-mm-dd hh24:mi:ss'` | 删除日志为 “yyyy-mm-dd hh24:mi:ss” 时间点之前产生的所有日志 |


也可以在mysql的配置文件中配置二进制日志的过期时间,设置了之后,二进制日志过期会自动删除。



mysql -uroot -p1234

#查看系统变量,在mysql命令行中执行
#单位是秒,默认过期时间为30天,到期之后会自动删除
show variables like ‘%binlog_expire_logs_seconds%’;


![在这里插入图片描述](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 服务就好了,并且禁止开机启动,之后在重启网络服务

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
img

mg-3vyqXgja-1712535254914)]
[外链图片转存中…(img-fKRIb3fd-1712535254915)]
[外链图片转存中…(img-81wxkBRU-1712535254915)]
[外链图片转存中…(img-c3JKCQwD-1712535254916)]
[外链图片转存中…(img-o19kHhgw-1712535254916)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
[外链图片转存中…(img-mI1BICvy-1712535254916)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值