MySQL Server层四个日志的实现


Posted in MySQL onMarch 31, 2022

一、MySQL Server层日志简介

一个mysql client发起一个连接请求,处理请求的过程如下图所示:

MySQL Server层四个日志的实现

MySQL日志是在MySQL server上生成的,不管更改哪个存储引擎,这些日志都是需要有的,包括:

  • 错误日志:记录mysqld服务运行过程中出现的cordump、error、exception等
  • 查询日志:记录客户端所有的SQL。由于上线项目的SQL太多了,开启查询日志IO太多导致MySQL效率低下,我们一般都不会开启,只有调试时才开启
  • 二进制日志:记录数据的更改(insert、update、delete、alter …),非常重要,可用于数据恢复,主从复制。主从复制技术依赖于log_bin,主库所有的更改操作都记录在log_bin里,从库从binlog读取主库所有的操作,自己再执行一遍。
  • 慢查询日志:记录了一些执行时间超过指定值的SQL语句,可供开发人员分析耗时SQL,从而针对性优化

查看日志相关变量

MySQL Server层四个日志的实现

二、配置文件参数

my.cnf

MySQL Server层四个日志的实现

通过set方法只能影响当前session,如果想要配置永久有效,需要在配置文件上进行设置,然后重启MySQL服务,就可以永久生效

linux下重启mysqld服务的命令:sudo service mysqld restart

我们查看一下配置文件/etc/mysql/my.cnf

MySQL Server层四个日志的实现

  • 给出log-error的路径就是开启了log-error,如果不自定义log-error的路径,默认在data_dir
  • 在开启log-bin=mysql-bin的同时还要加上server-id=1(表示当前MySQL Server的身份),否则sudo service mysqld restart无法重启服务
  • 设置过期的时间expire_log_days,因为总有一天磁盘会被这个日志占满,导致服务器不可运行,超过设置时间后日志文件会被删除

三、错误日志

错误日志是 MySQL 中最重要的日志之一,它记录了当 mysqld 启动和停止,以及服务器在运行过程中发生任何严重错误(cordump,error,exception…)时的相关信息。当数据库出现故障导致无法正常使用时,可以首先查看此日志

mysqld 使用的错误日志名为 host_name.err(host_name 为主机名) ,并默认在参数data_dir(数据目录)指定的目录中写入日志文件

四、查询日志

查询日志记录了client发送的所有SQL语句

由于上线项目sql特别多,开启查询日志IO太多导致MySQL效率低,我们一般都不会开启,只有在调试时才开启,比如通过查看sql发现热点数据从而可以进行缓存

show global variables like '%genera%';

MySQL Server层四个日志的实现

五、二进制日志

不是明文,不能直接查看,需要通过mysqlbinlog工具(mysql原生自带)解析binlog日志文件

二进制日志(BINLOG)记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言) 语句,但是不包括数据查询语句(不记录select操作,记录的是数据库的更改操作

语句以“事件”的形式保存,它描述了数据的更改过程。二进制日志对于灾难时的数据恢复起着极其重要的作用

两个重要的应用场景:主从复制、数据恢复

主从复制:主库所有的更新操作(update、delete、insert、alter …)都记录在binlog中,从库读主库的binlog,把binlog的所有操作在从库上在进行一遍

查看当前的binlog:

show binary logs; -- show master logs;

MySQL Server层四个日志的实现

binlog默认在MySQL的data_dir下

MySQL Server层四个日志的实现

1. 演示binlog记录更改

我们先刷新一下,生成一个新的binlog

MySQL Server层四个日志的实现

切换数据库

MySQL Server层四个日志的实现

更改一下数据

MySQL Server层四个日志的实现

再次查看binlog

MySQL Server层四个日志的实现

我们发现日志的filesize和刚才的不一样了,肯定记录我们刚才的数据更改操作

如果我们直接cat日志查看,会发现不是明文,无法直接查看

MySQL Server层四个日志的实现

我们需要通过mysqlbinlog进行查看,如下:

mysqlbinlog --no-defaults --database=school --base64-output=decode-rows -v --start-datetime='2022-03-01 00:00:00' --stop-datetime='2022-03-31 00:00:00' mysql-bin.000001 | more
  • database:指定查看某个库的更改
  • base64-output:binlog解码方式
  • start-datetime & stop-datetime:指定查看某个时间段内的更改,不写则查看所有的更改
  • mysql-bin.000001:查看的二进制日志文件

我们查看一下binlog

MySQL Server层四个日志的实现

MySQL Server层四个日志的实现

MySQL Server层四个日志的实现

@1、@2、@3、@4:表示数据库表的4个字段

server id:表示我们在my.cnf中设置的id,用于标识当前MySQL的身份

at 565、at679:指的是当前事件在binlog记录的位置,数据恢复的时候使用

2. 演示binlog数据恢复

MySQL Server层四个日志的实现

现在创建数据库mytest,并创建表,添加数据

MySQL Server层四个日志的实现

假如现在有人把库删除了:

MySQL Server层四个日志的实现

这时mytest库的所有表和数据都没有了,然而这些操作都会记录在二进制日志binlog里面

理论上来说,可以从binlog把丢失的数据恢复出来。由于恢复过程也是对数据的修改,所以恢复过程产生的日志也要记录在binlog中,这就需要我们指定binlog恢复区间

我们现在知道,我们建库、建表、插入数据的操作都记录在mysql-bin.00003文件中

MySQL Server层四个日志的实现

我们现在刷新一下,生成一个新的binlog,这就可以让我们接下来数据恢复的操作被记录在mysql-bin.00004文件中,而不会在追加到mysql-bin.00003

MySQL Server层四个日志的实现

我们先查看mysql-bin.00003,找需要恢复的区间

MySQL Server层四个日志的实现

MySQL Server层四个日志的实现

MySQL Server层四个日志的实现

从mysql-bin.000003中拿出区间内所有的操作,通过管道放到MySQL shell上执行

MySQL Server层四个日志的实现

查看一下当前的库

MySQL Server层四个日志的实现

再查看一下表和数据

MySQL Server层四个日志的实现

到这里,数据已经全部恢复了

我们不仅可以通过binlog记录的位置,得到需要恢复的区间,也可以通过binlog记录的时间得到需要恢复的区间

MySQL Server层四个日志的实现

参数为:start-datetime、stop-datetime

由于binlog有一个过期时间,过期的日志数据都会进行备份,没有过期的数据可以直接通过binlog恢复,如果需要恢复过期的数据,通过以下命令即可:

mysql> source ~/data.sql
$cat ~/data.sql | mysql -u root -p

六、慢查询日志

MySQL可以设置慢查询日志,当SQL执行的时间超过我们设定的时间,那么这些SQL就会被记录在慢查询日志当中

我们通过查看日志,用explain分析这些SQL的执行计划,来判定为什么效率低下,是没有使用到索引?还是索引本身创建的有问题?或者是索引使用到了,但是由于表的数据量太大,花费的时间就是很长,那么此时我们可以把表分成n个小表,比如订单表按年份分成多个小表等

慢查询日志相关的参数如下所示:

MySQL Server层四个日志的实现

慢查询日志记录了包含所有执行时间超过参数 long_query_time(单位:秒)所设置值的 SQL语句的日志,在MySQL上用命令可以查看,如下:

MySQL Server层四个日志的实现

这个值是可以修改的:

MySQL Server层四个日志的实现

现在修改成执行时间超过1秒的SQL都会被记录在慢查询日志当中!可以设置为0.01秒,表示10毫秒

慢查询日志,默认名称是host_name-slow.log,存放在MySQL的data_dir下,内容格式显示大致如下:

MySQL Server层四个日志的实现

show profiles命令可有查看sql详细的运行时间,全局变量的名字是:profiling

首先需要:set profiling=on

MySQL Server层四个日志的实现

 到此这篇关于MySQL Server层四个日志的实现的文章就介绍到这了,更多相关MySQL Server层日志内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL性能压力基准测试工具sysbench的使用简介
Apr 21 MySQL
MySQL8.0.24版本Release Note的一些改进点
Apr 22 MySQL
Mysql服务添加 iptables防火墙策略的方案
Apr 29 MySQL
MySQL获取所有分类的前N条记录
May 07 MySQL
mysql中between的边界,范围说明
Jun 08 MySQL
MySQL中存储时间的最佳实践指南
Jul 01 MySQL
SQL实现LeetCode(197.上升温度)
Aug 07 MySQL
MySQL空间数据存储及函数
Sep 25 MySQL
解决MySQL添加新用户-ERROR 1045 (28000)的问题
Mar 03 MySQL
一条慢SQL语句引发的改造之路
Mar 16 MySQL
MySQL派生表联表查询实战过程
Mar 20 MySQL
DQL数据查询语句使用示例
Dec 24 MySQL
分享几个简单MySQL优化小妙招
MySQL Server 层四个日志
MySQL RC事务隔离的实现
mysql中DCL常用的用户和权限控制
Mar 31 #MySQL
Mysql分析设计表主键为何不用uuid
你真的会用Mysql的explain吗
MySQL限制查询和数据排序介绍
You might like
ueditor 1.2.6 使用方法说明
2013/07/24 PHP
PHP框架Swoole定时器Timer特性分析
2014/08/19 PHP
PHP中的浅复制与深复制的实例详解
2017/10/26 PHP
PHP排序算法之归并排序(Merging Sort)实例详解
2018/04/21 PHP
基于jQuery判断两个元素是否有重叠部分的代码
2012/07/25 Javascript
点弹代码 点击页面任何位置都可以弹出页面效果代码
2012/09/17 Javascript
js实现点小图看大图效果的思路及示例代码
2013/10/28 Javascript
jquery中each方法示例和常用选择器
2014/07/08 Javascript
node.js中的url.parse方法使用说明
2014/12/10 Javascript
Javascript监视变量变化的方法
2015/06/09 Javascript
悬浮广告方法日常收集整理
2016/03/18 Javascript
JS模拟bootstrap下拉菜单效果实例
2016/06/17 Javascript
图解prototype、proto和constructor的三角关系
2016/07/31 Javascript
jQuery Ajax 实现在html页面实时显示用户登录状态
2016/12/30 Javascript
Angular2开发——组件规划篇
2017/03/28 Javascript
微信小程序自定义组件之可清除的input组件
2018/07/17 Javascript
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
2018/09/11 Javascript
layer弹出层显示在top顶层的方法
2019/09/11 Javascript
刷新页面后让控制台的js代码继续执行
2019/09/20 Javascript
layui监听下拉选框选中值变化的方法(包含监听普通下拉选框)
2019/09/24 Javascript
[01:38]【DOTA2亚洲邀请赛】Sumail——梦开始的地方
2017/03/03 DOTA
Python httplib模块使用实例
2015/04/11 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
2018/01/03 Python
OpenCV搞定腾讯滑块验证码的实现代码
2019/05/18 Python
django 框架实现的用户注册、登录、退出功能示例
2019/11/28 Python
Python实现上下文管理器的方法
2020/08/07 Python
Python Django路径配置实现过程解析
2020/11/05 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
2020/12/07 Python
亚瑟士美国官网:ASICS美国
2017/02/01 全球购物
学生党员思想汇报范文
2014/01/09 职场文书
党员岗位承诺口号大全
2014/03/28 职场文书
2014班子“三严三实”对照检查材料思想汇报
2014/09/18 职场文书
2014年民主评议党员个人总结
2014/09/24 职场文书
群众路线自查自纠工作情况报告
2014/10/28 职场文书
浅谈Nginx 中的两种限流方式
2021/03/31 Servers
Python使用pandas导入xlsx格式的excel文件内容操作代码
2022/12/24 Python