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,没有开启

logrotate分割mysql日志 mysql两种日志_慢查询

 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

logrotate分割mysql日志 mysql两种日志_sql语句日志_02

3、日志文件时间跟系统时间对不上

logrotate分割mysql日志 mysql两种日志_mysql_03

 查看系统时间参数

mysql>select @@log_timestamps;

logrotate分割mysql日志 mysql两种日志_sql语句日志_04

重设系统时间参数

mysql>set global log_timestamps=SYSTEM;

logrotate分割mysql日志 mysql两种日志_logrotate分割mysql日志_05

再次查看日志,这是我上午10:45执行的update语句生成的日志

 

logrotate分割mysql日志 mysql两种日志_logrotate分割mysql日志_06

修改成功,这里设置时间在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

logrotate分割mysql日志 mysql两种日志_慢查询_07

3、我这里有个存有上千万条记录的表userInfo,索引字段为userID,为验证慢查询日志,不根据索引字段去查询数据,而根据普通字段name去查询,结果产生一条慢查询日志。

logrotate分割mysql日志 mysql两种日志_慢查询_08

日志记录查询时间为23.637362秒,记录查询语句select * from userInfo where name='name5000000'

 

4、慢查询日志归类工具mysqldumpslow

比如我这里有三次慢查询,执行mysqldumpslow -a localhost-slow.log,输出如下:

logrotate分割mysql日志 mysql两种日志_mysql执行语句日志记录_09

5、总结

慢查询日志在SQL语句调优的时候非常有用,应该将它启用起来,且应该让慢查询阈值尽量小,例如1秒甚至低于1秒。就像一天执行上千次的1秒语句,和一天执行几次的20秒语句,显然更值得去优化这个1秒的语句。