社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

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

数据分析与开发 • 6 年前 • 701 次点击  

(点击上方蓝字,快速关注我们)


来源:MSSQL123

www.cnblogs.com/wy123/p/9259783.html


general log&slow query log


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


但是两者受log_output参数影响,输出的目标总是一致的,也就是要么都写入表,或者要么都写入文件,不会一个输出到表,一个输出到文件。


--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')


对于上述两种日志,系统默认不会清理,因此在开启了相关日志之后,需要人为清理。


如何清理历史general log&slow query log


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


无法直接删除,如果直接删除的话,会出现“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),在输出目标为表的情况下,会提示无法找到对应的表,将无法开启对应的日志



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


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


当然也不是说就建议始终这种暴力的方式清理日志文件,在Linux下,删除了默认的日志文件(或者重命名了原日志文件),要想再次生成日志文件


  • 可以使用mysqladmin flush-logs

  • 是SQL命令flush slow logs;flush general logs;

  • 重启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。




【关于投稿】


如果大家有原创好文投稿,请直接给公号发送留言。


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

② 示例:
【投稿】
《不要自称是程序员,我十多年的 IT 职场总结》:http://blog.jobbole.com/94148/


③ 最后请附上您的个人简介哈~




看完本文有收获?请转发分享给更多人

关注「数据分析与开发」,提升数据技能


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/JLXplmjkMJ
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/22024
 
701 次点击