我想记录所有访问特定表或特定表列表的SQL语句,但不记录所有表。
这在MySQL中可能吗?
否-常规查询日志是记录查询的唯一选项-这是服务器范围的。。。尽管您可以登录到一个表,然后删除结果,但您不需要
这可以使用Percona Toolkit的pt查询摘要实现。
如果您想监视my_database
上接触table_one
、table_two
和table_three
的所有SELECT
、UPDATE
和JOIN
,那么在数据库服务器上运行这样的操作就可以了:
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中。您可以记录任何感兴趣的字段放在另一张桌子上。