mysql常用的有5种日志,分别为:
1、普通日志(general_log),任何执行的sql语句都会写入这个日志中。
2、慢查询日志(slow_log),记录超过“慢查询时间”的语句。
3、二进制日志(bin_log),记录所有更改数据的语句,可用于数据拷贝。
4、错误日志(error_log),mysql启动、停止、运行过程中的报错信息。
5、中继日志(relay_log),主从复制的日志。
一、普通日志(general_log)
MySQL默认不开启普通日志,因为这会消耗一定的资源。要开启这个功能,稍微配置一下,打开log日志文件就可以了。
1、查看是否已经开启普通日志
mysql> show variables like "general_log%";
这里general_log值为OFF,没有开启
2、开启普通日志
临时开启
mysql> set global general_log = 'ON';
mysql> set global general_log_file = '/var/lib/mysql/localhost.log';#可以不设置日志路径,默认日志路径
临时开启在mysql服务重启后失效
永久开启
找到mysql配置文件(/etc/my.cnf,我这里mysql版本是8.0.18,版本不一样,有可能配置文件目录不一样),添加这两行,重启mysql后生效
general_log = 1
general_log_file = /var/lib/mysql/localhost.log
3、日志文件时间跟系统时间对不上
查看系统时间参数
mysql>select @@log_timestamps;
重设系统时间参数
mysql>set global log_timestamps=SYSTEM;
再次查看日志,这是我上午10:45执行的update语句生成的日志
修改成功,这里设置时间在mysql服务重启后失效,修改配置文件永久生效
my.cnf配置文件添加下面一行:
log_timestamps = SYSTEM
到这里SQL语句日志记录就配置好了,数据库出现数据问题,就可以通过日志慢慢分析了,不到迫不得已还是不要开启SQL日志记录为好,太耗性能,太占硬盘了。
二、慢查询日志(slow_log)
记录超过变量"long_query_time"设定时间值的查询为慢查询。
找到mysql配置文件(/etc/my.cnf,我这里mysql版本是8.0.18,版本不一样,有可能配置文件目录不一样),添加以下内容,重启mysql后生效。
1、设置慢查询时间值(单位为秒)。
这里设置long_query_time=2
2、开启慢查询日志并配置慢查询日志目录。
slow_query_log=1
slow_query_log_file=/var/lib/mysql/localhost-slow.log
3、我这里有个存有上千万条记录的表userInfo,索引字段为userID,为验证慢查询日志,不根据索引字段去查询数据,而根据普通字段name去查询,结果产生一条慢查询日志。
日志记录查询时间为23.637362秒,记录查询语句select * from userInfo where name='name5000000'
4、慢查询日志归类工具mysqldumpslow
比如我这里有三次慢查询,执行mysqldumpslow -a localhost-slow.log,输出如下:
5、总结
慢查询日志在SQL语句调优的时候非常有用,应该将它启用起来,且应该让慢查询阈值尽量小,例如1秒甚至低于1秒。就像一天执行上千次的1秒语句,和一天执行几次的20秒语句,显然更值得去优化这个1秒的语句。