1 前言
在日常的开发中,我们都会习惯记录日志,通过日志我们可以记录程序在何时何种情况发生过何种事情,有助于我们快速地定位bug和修复bug。在任何一种数据库中,也有着各种各样的日志,记录着数据库工作的方方面面,以帮助数据库管理员追踪数据库曾经发生过的各种事情。在MySQL中,有着四种不同的日志,它们分别是错误日志,二进制日志(也叫BINLOG日志),查询日志以及慢日志。今天这篇文章就来说说,MySQL的这四种常用的日志!
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%'; 复制代码
查看慢查询日志路径的命令如下:
show variables like '%slow%'; 复制代码
可以看到上面显示慢查询日志是关闭的,开启慢日志命令如下:
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的慢查询将无法记录此查询信息。
3 总结
以上就是在mysql中常用到的四种日志,通过这些日志能够帮助我们定位到mysql语句的故障和性能比较慢的地方,从而进行故障排除和性能优化。