MySQL通用日志缺少时间戳。
MySQL通用日志缺少时间戳。
我想确定MySQL(v5.1.71)的通用查询日志中的事件发生时间。
例如,在服务器操作系统CLI(Unix)上,我运行了一个简单的grep命令从日志文件中提取数据:
grep "Access denied" /data/mysql/my_servername.log
1249390 Connect Access denied for user 'user1'@'user.1.ip.add' (using password: YES) 131204 17:51:00 1254417 Connect Access denied for user 'user2'@'user.2.ip.add' (using password: NO)
我查看了整个日志,发现其他类型的信息也缺少时间戳。似乎MySQL只在SS值与上一条日志条目不同时在日志条目前添加YYMMDD HH:MI:SS。在上面的示例中,我无法确定user1的日志条目的日期/时间,因为我只有毫秒/纳秒/其他秒数。
我目前使用以下选项运行mysql:
--user=mysql --general_log --ssl-ca=/path_to_file1 --ssl-cert=/path_to_file2 --ssl-key=/path_to_file3
那么如何让MySQL在每一行上都放置一个时间戳呢?
SK
MySQL General Log missing Timestamps问题的出现的原因是MySQL的General Log中没有时间戳。解决方法有两种:
第一种方法是使用pt-query-digest这个第三方工具进行查询。具体命令如下:
pt-query-digest \
--type genlog \
--print \
--no-report \
--filter '$event->{arg} && $event->{arg} =~ /Access denied/' \
/data/mysql/my_servername.log
第二种方法是将日志格式从FILE改为TABLE。需要在my.cnf文件中进行配置,并重启MySQL服务。具体命令如下:
set global log_output='TABLE';
然后可以通过查询mysql.general_log表来查看日志:
select * from mysql.general_log where argument like 'Access denied%';
其中,第二种方法是一个很好的解决方案,但是根据组织政策的要求,必须使用MySQL自带的工具,而不是第三方工具。
对于第二种方法,还有一些问题需要解决。第一,my.cnf中的设置应该是log_output = 'TABLE'。第二,表名必须是general_log(否则MySQL如何知道使用哪个表)。第三,MySQL是否还会记录其他类型的日志,比如错误日志、事务日志(我在使用InnoDB引擎)、恢复日志、二进制日志等。换句话说,这样做只会将General Query日志从文件转移到表中,而不会影响其他类型的日志。
答案如下:
1. 在/etc/my.cnf中添加log_output=TABLE,确保它在[mysqld]部分中。
2. MySQL会自动创建表,表名分别为mysql.general_log和mysql.slow_log。
3. log_output会影响两种日志:General Query日志和慢查询日志(如果启用)。它不会影响其他任何日志。