我试图找出一个特定的MySQL用户是否仍然在我们的系统中使用(以及它正在执行什么查询)。MySQL只触发某个mysql用户
所以我想写一个触发器,在用户X执行查询的任何时候都会触发,并且它会将查询记录在日志表中。
我该怎么做? 我知道如何为特定的表编写查询,但不知道特定的用户(任何表)。
感谢
我试图找出一个特定的MySQL用户是否仍然在我们的系统中使用(以及它正在执行什么查询)。MySQL只触发某个mysql用户
所以我想写一个触发器,在用户X执行查询的任何时候都会触发,并且它会将查询记录在日志表中。
我该怎么做? 我知道如何为特定的表编写查询,但不知道特定的用户(任何表)。
感谢
最简单的办法是有触发总是火,但前提是用户X.
如何触发任何表任何操作? – 2010-02-08 18:44:17
@nute:你不用 - 对于MySQL,你必须分别触发每个表和事件;此外,您只能在INSERT,UPDATE或DELETE上触发。 (REPLACE = DELETE + INSERT) – Piskvor 2010-02-08 18:58:56
哦,那不行,那么太多的表 – 2010-02-08 19:17:48
是的,消失了,但只要特定用户(userID,class)与您的凭证相匹配,就可以使用任何系统来查看用户是什么(cookies,session)。
我们正在讨论核心MySQL用户,而不是应用程序用户。 – 2010-02-08 18:45:04
也有其他的方法,你可以解决这个问题,例如使用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查看什么被跳过并根据您的需要进行调整)
我想看看这些选项:
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仅为此用户的会话进行测试。
然后,系统已经运行了一段时间后,看看活动该用户下表:
假设你有一个用户定义为'old_app'@'%',一个可能的后续问题将是找出这个旧应用程序仍然连接的位置(哪个主机)。
performance_schema.accounts会显示:如果看到该用户的流量,它将显示每个用户名@主机名流量来源。 也有统计由帐户汇总,查找'%_by_account%'表。
见 http://dev.mysql.com/doc/refman/5.6/en/performance-schema.html
有没有那么一种方法,使MySQL的日志,但只是针对一个用户? – 2010-02-08 19:22:19
我已经添加了一个基于代理的解决方案,可能可以做你需要的东西(还有很多,更多) – Unreason 2010-04-15 16:05:57
请看我的帖子从2012年1月25日,因为我认为它提供了一个更完整的答案,新的解决方案问题。 – 2012-01-26 17:58:43