| 作者:江夏
| 知乎:https://www.zhihu.com/people/1024-paper-96
| GitHub:https://github.com/JiangXia-1024?tab=repositories
| 博客地址:https://blog.csdn.net/qq_41153943

江夏的第88篇原创
本文大概
3506
字
读完共需
8
分钟
1
2
show variables like 'log_err%'


打开后日志内容如下:

二进制日志又叫BINLOG,记录了所有的DDL(数据定义语言)语句和DML(数据操纵语言)语句,但不包括DQL(数据查询语句),此日志对于故障时的数据恢复起着很重要的作用,MySQL的主从复制,就是通过该日志实现的。
BINLOG默认情况下并不是开启的,需要到MySQL的配置文件中开启,并且配置MySQL日志的格式,比如:
#配置开启binlog日志,日志的文件前缀为mysqlbinlog_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’


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

show status like '%slow_queries%';

show variables like '%slow%';

set global slow_query_log=1

log_output=table
slow_query_log_file = slow_log
慢查询不记录执行失败的查询,比如long_query_time设置为10(10秒钟),一个查询超过了10秒钟,但是因为其他原因执行失败,MySQL的慢查询将无法记录此查询信息。
3
以上就是在mysql中常用到的四种日志,通过这些日志能够帮助我们定位到mysql语句的故障和性能比较慢的地方,从而进行故障排除和性能优化。
-END-

几个必须掌握的SQL优化技巧(一):查看SQL语句的执行频率 几个必须掌握的SQL优化技巧(二):如何定位低效率执行SQL 几个必须掌握的SQL优化技巧(三):Explain分析执行计划 几个必须掌握的SQL优化技巧(四):使用Trace工具分析优化器执行计划 几个必须掌握的SQL优化技巧(五):Show Profile分析SQL性能 几个必须掌握的SQL优化技巧(六):针对SQL语句的优化 几个必须掌握的SQL优化技巧(七):索引的最佳使用法则 
点个在看你最好看




