73

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

 6 years ago
source link: http://www.importnew.com/29170.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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.”的错误提示

M3Qj22y.png!web

以general log为例,需要先关闭general_log,然后重命名general_log这个表,

BNNJ7vZ.png!web

在对重命名之后的表执行删除,最后在重命名回来,最后开启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),在输出目标为表的情况下,会提示无法找到对应的表,将无法开启对应的日志

RjEFv2i.png!web

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

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

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

  • 可以使用mysqladmin flush-logs
  • 是SQL命令flush slow logs;flush general logs;
  • 重启MySQL服务

均可重新生成对应的日志文件。

ZzqaumI.png!web

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

以下偏离主题

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

不管是general_log或者是slow_log,对应的SQL语句都是二进制格式的,需要使用convert(sql_text using UTF8)做一个转换,才变得具有可读性。

mUrUNrv.png!web

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

据个人测试,在请求量不大的数据库上,开启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。

e2eeUrm.png!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK