2010-02-08 29 views
4

我试图找出一个特定的MySQL用户是否仍然在我们的系统中使用(以及它正在执行什么查询)。MySQL只触发某个mysql用户

所以我想写一个触发器,在用户X执行查询的任何时候都会触发,并且它会将查询记录在日志表中。

我该怎么做? 我知道如何为特定的表编写查询,但不知道特定的用户(任何表)。

感谢

+0

有没有那么一种方法,使MySQL的日志,但只是针对一个用户? – 2010-02-08 19:22:19

+0

我已经添加了一个基于代理的解决方案,可能可以做你需要的东西(还有很多,更多) – Unreason 2010-04-15 16:05:57

+0

请看我的帖子从2012年1月25日,因为我认为它提供了一个更完整的答案,新的解决方案问题。 – 2012-01-26 17:58:43

回答

3

记录你可以在分支的USER()触发功能。

+0

这是最有意义的。现在唯一的问题是我需要触发ALL表的所有操作。对于整个数据库... – 2010-03-05 03:05:04

2

最简单的办法是有触发总是火,但前提是用户X.

+0

如何触发任何表任何操作? – 2010-02-08 18:44:17

+1

@nute:你不用 - 对于MySQL,你必须分别触发每个表和事件;此外,您只能在INSERT,UPDATE或DELETE上触发。 (REPLACE = DELETE + INSERT) – Piskvor 2010-02-08 18:58:56

+0

哦,那不行,那么太多的表 – 2010-02-08 19:17:48

-1

是的,消失了,但只要特定用户(userID,class)与您的凭证相匹配,就可以使用任何系统来查看用户是什么(cookies,session)。

+0

我们正在讨论核心MySQL用户,而不是应用程序用户。 – 2010-02-08 18:45:04

0

也有其他的方法,你可以解决这个问题,例如使用MySQL proxy

在代理,你可以做有趣的事情 - 从记录到转化的查询,pattern matching(检查此链接也为如何测试细节/开发脚本)

-- set the username 
local log_user = 'username' 

function read_query(packet) 
    if proxy.connection.client.username == log_user and string.byte(packet) == proxy.COM_QUERY then 
     local log_file = '/var/log/mysql-proxy/mysql-' .. log_user .. '.log' 
     local fh = io.open(log_file, "a+") 
     local query = string.sub(packet, 2) 
     fh:write(string.format("%s %6d -- %s \n", 
      os.date('%Y-%m-%d %H:%M:%S'), 
      proxy.connection.server["thread_id"], 
      query)) 
     fh:flush() 
    end 
end 

上述内容已经过测试,它做什么,它应该是(虽然这是一个简单的变型,不记录成功或失败,只记录proxy.COM_QUERY,见名单全部constants查看什么被跳过并根据您的需要进行调整)

0

我想看看这些选项:

A)写入审计插件,过滤基于用户名的事件。

为简单起见,用户名可以在插件本身中硬编码,或者为了优雅,可以通过插件变量配置,以防再次出现此问题。

http://dev.mysql.com/doc/refman/5.5/en/writing-audit-plugins.html

B)调查--init-Connect服务器选项。

例如,调用存储过程,检查user()/ current_user()的值, ,如果看到用户的连接,则将跟踪写入日志(插入到表中)。

见 ​​

这可能是最接近的一个连接触发。

C)使用性能架构工具。

这假设为5.6。

使用表performance_schema.setup_instrument仅启用语句检测。 使用表performance_schema.setup_actors仅为此用户的会话进行测试。

然后,系统已经运行了一段时间后,看看活动该用户下表:

  • 表performance_schema.users将告诉我们,如果有在所有
  • 表中的某些活动performance_schema.events_statements_history_long将显示最后执行的查询
  • 表performance_schema.events_statements_summary_by_user将显示有关此用户执行的每个语句类型(SELECT,INSERT,...)的聚合统计信息。

假设你有一个用户定义为'old_app'@'%',一个可能的后续问题将是找出这个旧应用程序仍然连接的位置(哪个主机)。

performance_schema.accounts会显示:如果看到该用户的流量,它将显示每个用户名@主机名流量来源。 也有统计由帐户汇总,查找'%_by_account%'表。

http://dev.mysql.com/doc/refman/5.6/en/performance-schema.html