我想记录访问特定表或特定表列表的所有SQL语句,但不记录所有表。
这在MySQL中甚至可能吗?
答案 0 :(得分:6)
否 - general query log是您记录查询的唯一选项 - 这是服务器范围的...虽然您可以登录到表然后删除您不需要的结果
答案 1 :(得分:2)
这可以使用Percona Toolkit的pt-query-digest。
如果您想要监控所有SELECT
,UPDATE
和JOIN
的{{1}},table_one
和table_two
在table_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中。您可以记录感兴趣的任何字段 进入另一张桌子。