MySQL通常查询日志或者慢查询日志历史数据的清理

 

general log&slow query logmysql

对于MySQL的通常查询日志和慢查询日志,开启比较简单,其中公用的一个参数是log_output,log_output控制着慢查询和通常查询日志的输出方向
能够是表(mysql.general_log,mysql.slow_log)或者文件(有参数general_log_file和slow_query_log_file配置决定)
或者同时输出到表和文件(想不明白,何时须要同时输出到表和文件)。
可是二者受log_output参数影响,输出的目标老是一致的,也就是要么都写入表,或者要么都写入文件,不会一个输出到表,一个输出到文件。linux

--slow log 相关参数
select * 
from performance_schema.global_variables 
where variable_name in
('slow_query_log','log_output','slow_query_log_file','long_query_time')

--general log 相关参数
select * 
from performance_schema.global_variables 
where variable_name in
('general_log','log_output','general_log_file')

对于上述两种日志,系统默认不会清理,所以在开启了相关日志以后,须要人为清理。sql

如何清理历史general log&slow query log数据库

1,当输出目标为表的时候windows

  没法直接删除,若是直接删除的话,会出现“ERROR 1556 (HY000): You can't use locks with log tables.”的错误提示并发

  

以general log为例,须要先关闭general_log,而后重命名general_log这个表,
 性能

在对重命名以后的表执行删除,最后在重命名回来,最后开启general_log(若是有必要的话)测试

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
DELETE FROM general_log_temp WHERE event_time < DATE(NOW());
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';


--slow log 同理
SET GLOBAL slow_query_log = 'OFF';
RENAME TABLE slow_log TO slow_log_temp;
DELETE FROM slow_log_temp WHERE start_time < DATE(NOW());
RENAME TABLE slow_log_temp TO slow_log;
SET GLOBAL slow_query_log = 'ON';

  若是对重命名以后的表(general_log或者是slow_log)没有再次重命名回来,会发生什么?
  参加以下截图,若是没有找到对应的表(general_log或者是slow_log),在输出目标为表的状况下,会提示没法找到对应的表,将没法开启对应的日志spa

2,当输出目标为文件的时候3d

  当输出目标为文件的时候,在linux下,直接使用rm命名删除便可,若是在开启了通常查询日志或者是慢查询日志,删除对应的日志文件,并不影响数据库的正常使用
  网上有说须要中止MySQL服务而后重命名文件而后在建立新的文件啥的,在Linux下并非必须的,不知道在windows下是什么状况,没兴趣试。
  固然也不是说就建议始终这种暴力的方式清理日志文件,
  在Linux下,删除了默认的日志文件(或者重命名了原日志文件),要想再次生成日志文件
  1,可使用mysqladmin flush-logs
  2,是SQL命令flush slow logs;flush general logs;
  3,重启MySQL服务
  都可从新生成对应的日志文件。

注意:当对应的文件是存在的时候,上述命名执行以后是没有影响的(也不会清理对应的日志文件)

 


 

如下偏离主题

当输出目标为表的时候的解析

  无论是general_log或者是slow_log,对应的SQL语句都是二进制格式的,须要使用convert(sql_text using UTF8)作一个转换,才变得具备可读性。

 

当输出目标为表的时候对性能的影响

  据我的测试,在请求量不大的数据库上,开启general_log或者是slow_log,对性能影响并无很是明显。
  理论家们一方面强调说MySQL的处理并发上多强悍,一方面又说开启general_log对性能影响很大,会不会自相矛盾呢?
  关于general_log,在zabbix监控下,测试环境TPS不过百的状况下(每秒写入general log不超过100条数据),开启general_log以后并CPU负载几乎没有变化,CPU高点是在作其余压力测试。
  尤为是slow_log这种写入不是太频繁的日志,直接写入到表中,对性能的影响有限,比后面再去花时间解析文件……  
  固然不排除TPS在上千或者上万甚至更高以后,开启general_log会产生较大的影响,固然没事也不会闲的蛋疼去开general_log。

  

 

 

备注:

直接rm掉general log&slow query log 并无实际删除文件,磁盘空间也不会释放。mysql进程会继续持有,而且持续往里写数据。lsof看一下就知道了
压力大的状况下 大概30-% 性能损耗
相关文章
相关标签/搜索