如何在mysql中启用每个表sql语句的日志记录

时间:2012-03-13 15:38:34

标签: mysql logging

我想记录访问特定表或特定表列表的所有SQL语句,但不记录所有表。

这在MySQL中甚至可能吗?

3 个答案:

答案 0 :(得分:6)

否 - general query log是您记录查询的唯一选项 - 这是服务器范围的...虽然您可以登录到表然后删除您不需要的结果

答案 1 :(得分:2)

这可以使用Percona Toolkit的pt-query-digest

如果您想要监控所有SELECTUPDATEJOIN的{​​{1}},table_onetable_twotable_three上,在数据库服务器上运行这样的东西就可以了:

my_database

它使用tcpdump -s 65535 -x -nn -q -tttt -i any -c 1000 port 3306 | pt-query-digest --type tcpdump \ --run-time 5s \ --iterations 0 \ --filter '$event->{fingerprint} =~ m/\b(from|join|into)\s+(`?my_database`?\.)`?(table_one|table_two|table_three)`?\b/' \ --output slowlog \ --no-report 监视所有传入的数据库流量,并将其传输到tcpdump工具,然后该工具尝试将其过滤到这些表上的查询。输出看起来像MySQL的慢查询日志。

您需要调整pt-query-digest参数中的正则表达式以满足您的需要。与大多数正则表达式一样,会出现很多边缘情况。我试图覆盖其中的一些,但在正则表达式方面,我绝不是专家。

这不是一个完美的解决方案,但在某些禁止使用常规查询日志的情况下,它已经为我做了诀窍。

答案 2 :(得分:0)

您可以使用触发器来实现:

delimiter |
CREATE TRIGGER trigger_name AFTER UPDATE ON table_name
FOR EACH ROW
BEGIN
     insert into tmp.my_log values(........);
END;|

原始值存储在OLD.column_name中,更新后的值是 存储在NEW.column_name中。您可以记录感兴趣的任何字段 进入另一张桌子。