在过去的4个小时里,我一直在网上寻找解决方案,但我所能找到的是:
你不能。不可能。不会发生的。
我不喜欢这种方法。
我的理论是,如果它在某个时刻存储在information_schema.processlist中,那么一定有某种方法来获取它。我试着让一个触发器在processlist表上运行,但是不能工作,我想是因为它是一个视图。运行日志不是一种选择,因为这将影响已经裁剪的服务器上的性能,而且有许多查询正在运行,我希望它只在特定表上记录,然后只在更新时记录。
这就是传说中的stackoverflow!在那里你可以找到所有问题的解决方案,因为它充满了天才!
所以,我求求你,天才在哪里!展示你们自己!!:-)
谢谢,佐德
发布于 2012-05-18 22:05:18
这里的问题是MySQL触发器的作用域是行级的,而不是语句级的。因此,在触发器中,您可以访问给定行中每列的旧值和新值,但不能访问导致触发器触发的语句。
关于information_schema.processlist,实际上没有什么东西被“存储”(持久化)在该视图中。它只是一个指向进程列表的SQL接口,而触发触发器的语句在触发器的作用域内是不可访问的。
您说过不想启用通用查询日志,但由于多种原因(包括event_Time的粒度为1秒),这种方法并不完美,但这里有一个使用general_log表重写触发器的示例:
SET GLOBAL GENERAL_LOG='ON';
SET GLOBAL LOG_OUTPUT='TABLE';
DELIMITER ||
CREATE TRIGGER DEBUG_DATE BEFORE UPDATE ON db.tbl FOR EACH ROW
BEGIN
DECLARE Q MEDIUMTEXT;
SELECT argument INTO Q
FROM mysql.general_log
where thread_id = connection_id()
order by event_time desc
limit 1;
INSERT INTO db.tbl_log (INFO)
VALUES (Q);
END ||
DELIMITER ;发布于 2014-10-28 17:03:58
我们已经调查了这个问题,发现"DECLARE“在上面的示例中不起作用,而且应该在服务器上启用general_log标志。最后,我们有以下触发器代码:
DELIMITER $$
DROP TRIGGER IF EXISTS `our_trigger`$$
CREATE TRIGGER `our_trigger`
BEFORE UPDATE ON `our_table_for_debug`
FOR EACH ROW BEGIN
SELECT argument INTO @tquery FROM mysql.general_log where thread_id = connection_id() and argument like 'update%' order by event_time desc limit 1;
INSERT INTO `our_log_table` (`query`) VALUES (@tquery);
END IF;
END$$
DELIMITER ;"our_log_table“是具有一个名为query的媒体文本字段的表。要启用通用日志,您应该运行以下查询: general_log = 1;或者直接在mysql设置中启用它。
发布于 2012-05-18 19:17:21
SELECT INFO FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ... ;https://stackoverflow.com/questions/10651114
复制相似问题