【发布时间】:2012-03-13 15:38:33
【问题描述】:
我想记录访问特定表或特定表列表的所有 SQL 语句,但不是所有表。
这在 MySQL 中是否可行?
【问题讨论】:
我想记录访问特定表或特定表列表的所有 SQL 语句,但不是所有表。
这在 MySQL 中是否可行?
【问题讨论】:
不 - general query log 是您记录查询的唯一选项 - 这是服务器范围内的......尽管您可以登录到表然后删除不需要的结果
【讨论】:
这可以使用 Percona Toolkit 的 pt-query-digest。
如果您想监控所有SELECTs、UPDATEs 和 JOINs 在my_database 上触摸table_one、table_two 和table_three,请在您的数据库服务器可以解决问题:
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 监控所有传入的数据库流量,并将其通过管道传输到pt-query-digest 工具,然后该工具会尝试将其过滤到这些表上的查询中。输出看起来像 MySQL 的慢查询日志。
您需要调整--filter 参数中的正则表达式以满足您的需要。与大多数正则表达式一样,会有很多边缘情况。我试图介绍其中的一些,但在正则表达式方面我绝不是专家。
这不是一个完美的解决方案,但它在某些禁止使用通用查询日志的情况下为我解决了问题。
【讨论】:
你可以用触发器来做到这一点:
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 中。您可以记录您感兴趣的任何字段 到另一张桌子。
【讨论】: