【问题标题】:How to enable per table sql statement logging in mysql如何在mysql中启用每表sql语句日志记录
【发布时间】:2012-03-13 15:38:33
【问题描述】:

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

这在 MySQL 中是否可行?

【问题讨论】:

    标签: mysql logging


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      如果您想监控所有SELECTs、UPDATEs 和 JOINs 在my_database 上触摸table_onetable_twotable_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 参数中的正则表达式以满足您的需要。与大多数正则表达式一样,会有很多边缘情况。我试图介绍其中的一些,但在正则表达式方面我绝不是专家。

      这不是一个完美的解决方案,但它在某些禁止使用通用查询日志的情况下为我解决了问题。

      【讨论】:

        【解决方案3】:

        你可以用触发器来做到这一点:

        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 中。您可以记录您感兴趣的任何字段 到另一张桌子。

        【讨论】:

          猜你喜欢
          • 2015-01-19
          • 2018-11-08
          • 1970-01-01
          • 2013-12-11
          • 2018-04-10
          • 2017-02-04
          • 2018-07-23
          相关资源
          最近更新 更多