我想确定MySQL的通用查询日志中发生事件的时间(v5.1.71)。 例如,在服务器OS CLI(Unix)上,我运行了一个简单的grep来从日志文件中提取数据:
grep“拒绝访问”/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)
我查看了整个日志,了解了我要提取的其他类型的信息,并注意到条目也缺少时间戳。当SS值自上次日志条目以来发生更改时,MySQL似乎仅在日志条目之前使用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
答案 0 :(得分:3)
您应该使用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文件中执行此操作,以便在重新启动后仍然存在),并且每个行中都会显示时间戳。表:
set global log_output='TABLE';
现在您可以查询表而不是grepping文件:
select * from mysql.general_log where argument like 'Access denied%';