MySQL日志必知必会

part 1

在日常的开发中,我们都会习惯记录日志,通过日志我们可以记录程序在何时何种情况发生过何种事情,有助于我们快速地定位bug和修复bug。在任何一种数据库中,也有着各种各样的日志,记录着数据库工作的方方面面,以帮助数据库管理员追踪数据库曾经发生过的各种事情。在MySQL中,有着四种不同的日志,它们分别是错误日志,二进制日志(也叫BINLOG日志),查询日志以及慢日志。今天这篇文章就来说说,MySQL的这四种常用的日志!

part 2

一、错误日志

错误日志是MySQL中最为重要的日志之一,它主要记录了当MySQL启动和停止时,以及服务器在运行过程中发生任何严重的错误时的相关信息,当数据库出现任何故障而导致无法正常工作时,可以通过查看错误日志,来了解具体情况。
错误日志默认时开启的,默认存放目录为MySQL的数据目录,默认的日志文件名为hostname.err(hostname是主机名)。
可以通过以下命令查看日志位置:

show variables like 'log_err%'

在这里插入图片描述
在这里插入图片描述
打开后日志内容如下:
图片

二、二进制日志

二进制日志又叫BINLOG,记录了所有的DDL(数据定义语言)语句和DML(数据操纵语言)语句,但不包括DQL(数据查询语句),此日志对于故障时的数据恢复起着很重要的作用,MySQL的主从复制,就是通过该日志实现的。

BINLOG默认情况下并不是开启的,需要到MySQL的配置文件中开启,并且配置MySQL日志的格式,比如:

#配置开启binlog日志,日志的文件前缀为mysqlbin
log_bin=mysqlbin
#配置二进制日志的格式
binlog_format=STATEMENT

配置时,给定了文件名但是没有指定路径,日志默认写入了mysql的数据目录。生成的文件名如:

mysqlbin.00001,
mysqlbin.00002
......

BINLOG的日志有三种格式:STATEMENT、ROW、MIXED

STATEMENT:该日志格式在日志文件中记录的都是SQL语句(STATEMENT),每一条对数据进行修改的SQL语句都会被记录在日志中。通过MySQL提供的mysqlbinlog工具,可以清晰的查看到每条语句的文本在主从复制的时候,从库(slave)会将日志解析为原文本,并在从库重新执行一次。

ROW:该日志格式在日志文件中记录的时每一行数据的变更,而不是记录SQL语句,比如在执行SQL语句:

update user set name='tom'

如果是statement日志格式,那么会在日志中记录每一行sql文件,而如果是row日志格式,由于是对全表进行更新,也就是每一行记录都会发生变更,ROW格式的日志中就会记录每一行的数据变更。

MIXED日志格式是目前MySQL默认的日志格式,即混合了前面两种日志格式。默认情况下采用statement格式,但是在一些特殊的情况下采用row来进行记录。mixed格式能尽量利用两种模式的有点,而避开它们的缺点。

对于二进制日志因为日志是以二进制方式存储,不能直接读取,需要用mysqlbinlog工具来查看,语法如下:

mysqlbinlog log-file

如果日志格式是row,那么直接查看日志是看不懂的。所以需要在mysqlbinlog后面加上-vv参数:

mysqlbinlog -vv log-file

对于比较繁忙的系统,每天都会生成大量的日志,日积月累会占用大量的磁盘空间,所以需要对不需要的日志文件进行删除:

一、通过reset master指令删除全部的binlog日志,删除之后,日志编号会从xxx.00001重新弄开始

二、通过执行命令

purge master logs to 'mysqlbin.xxxx'

该命令将删除xxx编号之前的所有的日志。

三、通过执行命令

purge master log before 'yyyy-mm-dd hh24:mi:ss'

该命令删除指定时间之前所产生的所有日志。

四、设置参数

--expire_logs_days=#

此参数的含义是设置日志的过期天数,过了指定的天数后日志将会被自动删除,这样的方式有助于减少DBA管理日志的工作量,不用时刻关注处理日志。

三、查询日志

查询日志(general log)记录了客户端的所有的操作语句,而二进制不包含查询数据的sql语句。

查询日志记录了服务器接收到的每一个查询或是命令,无论这些查询或是命令是否正确甚至是否包含语法错误,查询日志都会将其记录下来 ,记录的格式为 {Time ,Id ,Command,Argument }。也正因为mysql服务器需要不断地记录日志,开启查询日志会产生不小的系统开销。因此,Mysql默认是把查询日志关闭的。

查看日志的存放方式:

show variables like 'log_output';

因为默认情况下,查询日志是未开启的。如果需要开启查询日志,需要设置:

开启general log:set global general_log=on;
关闭general log:set global general_log=off;

如果设置

set global log_output=’table’

则日志结果会记录到名为gengera_log的表中,这表的默认引擎都是CSV。

如果设置表数据到文件

set global log_output=file;

设置general log的日志文件路径:

set global general_log_file=’/tmp/general.log’;

然后再用:

show global variables like ‘general_log’

看是否开启
在这里插入图片描述

四、查询日志

关于慢查询日志,之前的mysql调优的文章也有提到过,慢日志记录执行时间过长和没有使用索引的查询语句,报错select、update、delete以及insert语句,慢日志只会记录执行成功的语句。这里的执行时间过长的标准是通过long_query_time参数进行设置的,该参数的默认值是10s,最小值为0,精度可以精确到微秒。慢查询日志记录所有执行时间大于long_query_time参数并且扫描记录数不小于min_examined_row_limit的所有SQL语句的日志。
可以通过以下命令查看long_query_time参数的时间

show variables like 'long_query_time';-- 默认10s

在这里插入图片描述
通过以下命令可以查看慢查询的配置情况:

show status like '%slow_queries%';

在这里插入图片描述
可以看到上面显示慢查询日志是关闭的,开启慢日志命令如下:

set global slow_query_log=1

在这里插入图片描述
记录慢查询日志到表,需要添加一个log_output的配置,就可以将慢查询记录到表中了。

log_output=table

mysql库下面有一个默认的slow_log表,可以直接将

slow_query_log_file = slow_log

即可将慢查询日志记录到表中。
慢查询不记录执行失败的查询,比如long_query_time设置为10(10秒钟),一个查询超过了10秒钟,但是因为其他原因执行失败,MySQL的慢查询将无法记录此查询信息。

part 3

以上就是在mysql中常用到的四种日志,通过这些日志能够帮助我们定位到mysql语句的故障和性能比较慢的地方,从而进行故障排除和性能优化。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值