MySQL 一般查询日志或者慢查询日志历史数据的清理

官方账号 2018-08-0601:45:19经验总结评论499字数 2287阅读7分37秒阅读模式

对于MySQL的一般查询日志和慢查询日志,开启比较简单,其中公用的一个参数是log_output,log_output控制着慢查询和一般查询日志的输出方向可以是表(mysql.general_log,mysql.slow_log)或者文件(有参数general_log_file和slow_query_log_file配置决定)或者同时输出到表和文件(想不明白,什么时候需要同时输出到表和文件)。文章源自玩技e族-https://www.playezu.com/14130.html

但是两者受log_output参数影响,输出的目标总是一致的,也就是要么都写入表,或者要么都写入文件,不会一个输出到表,一个输出到文件。文章源自玩技e族-https://www.playezu.com/14130.html

--slow log 相关参数文章源自玩技e族-https://www.playezu.com/14130.html

select * 文章源自玩技e族-https://www.playezu.com/14130.html

from performance_schema.global_variables 文章源自玩技e族-https://www.playezu.com/14130.html

where variable_name in文章源自玩技e族-https://www.playezu.com/14130.html

('slow_query_log','log_output','slow_query_log_file','long_query_time')文章源自玩技e族-https://www.playezu.com/14130.html

 文章源自玩技e族-https://www.playezu.com/14130.html

--general log 相关参数文章源自玩技e族-https://www.playezu.com/14130.html

select * 文章源自玩技e族-https://www.playezu.com/14130.html

from performance_schema.global_variables 文章源自玩技e族-https://www.playezu.com/14130.html

where variable_name in文章源自玩技e族-https://www.playezu.com/14130.html

('general_log','log_output','general_log_file')文章源自玩技e族-https://www.playezu.com/14130.html

对于上述两种日志,系统默认不会清理,因此在开启了相关日志之后,需要人为清理。文章源自玩技e族-https://www.playezu.com/14130.html

如何清理历史general log&slow query log文章源自玩技e族-https://www.playezu.com/14130.html

1,当输出目标为表的时候文章源自玩技e族-https://www.playezu.com/14130.html

无法直接删除,如果直接删除的话,会出现“ERROR 1556 (HY000): You can’t use locks with log tables.”的错误提示文章源自玩技e族-https://www.playezu.com/14130.html

MySQL 一般查询日志或者慢查询日志历史数据的清理文章源自玩技e族-https://www.playezu.com/14130.html

以general log为例,需要先关闭general_log,然后重命名general_log这个表,文章源自玩技e族-https://www.playezu.com/14130.html

MySQL 一般查询日志或者慢查询日志历史数据的清理文章源自玩技e族-https://www.playezu.com/14130.html

在对重命名之后的表执行删除,最后在重命名回来,最后开启general_log(如果有必要的话)文章源自玩技e族-https://www.playezu.com/14130.html

SET GLOBAL general_log = 'OFF';文章源自玩技e族-https://www.playezu.com/14130.html

RENAME TABLE general_log TO general_log_temp;文章源自玩技e族-https://www.playezu.com/14130.html

DELETE FROM general_log_temp WHERE event_time < DATE(NOW());文章源自玩技e族-https://www.playezu.com/14130.html

RENAME TABLE general_log_temp TO general_log;文章源自玩技e族-https://www.playezu.com/14130.html

SET GLOBAL general_log = 'ON';文章源自玩技e族-https://www.playezu.com/14130.html

 文章源自玩技e族-https://www.playezu.com/14130.html

 文章源自玩技e族-https://www.playezu.com/14130.html

--slow log 同理文章源自玩技e族-https://www.playezu.com/14130.html

SET GLOBAL slow_query_log = 'OFF';文章源自玩技e族-https://www.playezu.com/14130.html

RENAME TABLE slow_log TO slow_log_temp;文章源自玩技e族-https://www.playezu.com/14130.html

DELETE FROM slow_log_temp WHERE start_time < DATE(NOW());文章源自玩技e族-https://www.playezu.com/14130.html

RENAME TABLE slow_log_temp TO slow_log;文章源自玩技e族-https://www.playezu.com/14130.html

SET GLOBAL slow_query_log = 'ON';文章源自玩技e族-https://www.playezu.com/14130.html

如果对重命名之后的表(general_log或者是slow_log)没有再次重命名回来,会发生什么?文章源自玩技e族-https://www.playezu.com/14130.html

参加如下截图,如果没有找到对应的表(general_log或者是slow_log),在输出目标为表的情况下,会提示无法找到对应的表,将无法开启对应的日志文章源自玩技e族-https://www.playezu.com/14130.html

MySQL 一般查询日志或者慢查询日志历史数据的清理文章源自玩技e族-https://www.playezu.com/14130.html

2,当输出目标为文件的时候文章源自玩技e族-https://www.playezu.com/14130.html

当输出目标为文件的时候,在linux下,直接使用rm命名删除即可,如果在开启了一般查询日志或者是慢查询日志,删除对应的日志文件,并不影响数据库的正常使用。网上有说需要停止MySQL服务然后重命名文件然后在创建新的文件啥的,在Linux下并不是必须的,不知道在windows下是什么情况,没兴趣试。文章源自玩技e族-https://www.playezu.com/14130.html

当然也不是说就建议始终这种暴力的方式清理日志文件,在Linux下,删除了默认的日志文件(或者重命名了原日志文件),要想再次生成日志文件文章源自玩技e族-https://www.playezu.com/14130.html

  • 可以使用mysqladmin flush-logs文章源自玩技e族-https://www.playezu.com/14130.html

  • 是SQL命令flush slow logs;flush general logs;文章源自玩技e族-https://www.playezu.com/14130.html

  • 重启MySQL服务文章源自玩技e族-https://www.playezu.com/14130.html

均可重新生成对应的日志文件。文章源自玩技e族-https://www.playezu.com/14130.html

MySQL 一般查询日志或者慢查询日志历史数据的清理文章源自玩技e族-https://www.playezu.com/14130.html

注意:当对应的文件是存在的时候,上述命名执行之后是没有影响的(也不会清理对应的日志文件)文章源自玩技e族-https://www.playezu.com/14130.html

以下偏离主题文章源自玩技e族-https://www.playezu.com/14130.html

当输出目标为表的时候的解析文章源自玩技e族-https://www.playezu.com/14130.html

不管是general_log或者是slow_log,对应的SQL语句都是二进制格式的,需要使用convert(sql_text using UTF8)做一个转换,才变得具有可读性。文章源自玩技e族-https://www.playezu.com/14130.html

MySQL 一般查询日志或者慢查询日志历史数据的清理文章源自玩技e族-https://www.playezu.com/14130.html

当输出目标为表的时候对性能的影响文章源自玩技e族-https://www.playezu.com/14130.html

据个人测试,在请求量不大的数据库上,开启general_log或者是slow_log,对性能影响并没有非常明显。理论家们一方面强调说MySQL的处理并发上多强悍,一方面又说开启general_log对性能影响很大,会不会自相矛盾呢?关于general_log,在zabbix监控下,测试环境TPS不过百的情况下(每秒写入general log不超过100条数据),开启general_log之后并CPU负载几乎没有变化,CPU高点是在做其他压力测试。尤其是slow_log这种写入不是太频繁的日志,直接写入到表中,对性能的影响有限,比后面再去花时间解析文件……  文章源自玩技e族-https://www.playezu.com/14130.html

当然不排除TPS在上千或者上万甚至更高之后,开启general_log会产生较大的影响,当然没事也不会闲的蛋疼去开general_log。文章源自玩技e族-https://www.playezu.com/14130.html

MySQL 一般查询日志或者慢查询日志历史数据的清理文章源自玩技e族-https://www.playezu.com/14130.html

【关于投稿】文章源自玩技e族-https://www.playezu.com/14130.html

如果大家有原创好文投稿,请直接给公号发送留言。文章源自玩技e族-https://www.playezu.com/14130.html

① 留言格式:
【投稿】+《 文章标题》+ 文章链接

② 示例:
【投稿】
《不要自称是程序员,我十多年的 IT 职场总结》:http://blog.jobbole.com/94148/文章源自玩技e族-https://www.playezu.com/14130.html


③ 最后请附上您的个人简介哈~
文章源自玩技e族-https://www.playezu.com/14130.html

 文章源自玩技e族-https://www.playezu.com/14130.html

 文章源自玩技e族-https://www.playezu.com/14130.html

看完本文有收获?请转发分享给更多人文章源自玩技e族-https://www.playezu.com/14130.html

注意:本文法律责任由该文章作者承担,侵权请联系2523030730▷诈骗举报◁▷新闻不符◁▷我要投稿◁
  • 我们QQ群
  • QQ扫一扫
  • weinxin
  • 微信公众号
  • 公众号扫一扫
  • weinxin
匿名

发表评论

匿名网友

确定