MySQL通用日志缺少时间戳。

13 浏览
0 Comments

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

0
0 Comments

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日志和慢查询日志(如果启用)。它不会影响其他任何日志。

0