我是靠谱客的博主 拼搏发夹,最近开发中收集的这篇文章主要介绍mysql触发器中记录当前正在执行的sql语句.,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

mysql触发器, 很常见, 但是常规的两个变量只有New和OLD, 两个, 如何才能取得当前正在执行的sql语句呢?

因为我想知道这条数据的状态是哪个sql修改的. 我好修补bug…
那么这个需求就非常的合理又有说服力. 可惜mysql目前好像没有给触发器增加这个变量
那么唯一的办法就是另寻他法了.

于是目标转移到mysql日志上.
或者全局变量上. 或许全局变量有关于当前sql的变量.
首先映入 眼帘的是 开启日志记录功能

-- 开启日志记录功能
SET GLOBAL general_log = ON; 


-- 设置日志输出到 table 而不是文件, 输出到table就输出到了mysql.general_log表中
SET GLOBAL log_output = 'table'; 

-- 查询当前正在执行的sql语句, 第一条.
SELECT * FROM mysql.general_log ORDER BY event_time DESC LIMIT 1;

OK, 至此已完成.日志的记录工作, 那么只需要在触发器中,读取这个日志,然后插入到某个表中即可

触发器中的主日志代码示例


insert into record_log  set 
`record_id` = new.`record_id`, 
`newai`=new.`ai`, 
`oldai` = old.`ai`,
`new_status`=new.`status`,
`sql` = (SELECT argument FROM mysql.general_log ORDER BY event_time DESC LIMIT 1 )

用完记得要关闭日志跟踪, 因为日志跟踪很耗资源.很慢.

SET GLOBAL general_log = OFF;

注意, 此方法在高频率的生产环境可能不是很合适, 因为触发器在执行的时候说不定,其它sql也执行了. 取到的第一条sql日志不一定就是当前的SQL语句, 所以此方法在低频率的开发环境用来定位问题语句还是可以的. 在高并发的环境还是要慎重判断对应的sql是否就是对应的sql. 当然也可以采取记录下时间戳然后再查询general_log 表前后5秒内的sql日志.进行分析判断. 但这就需要人工来进行判断了… 总值这条思路基本上可以查询定位问题了.

清空表
不允许使用delete删除mysql.general_log,只能用truncate

truncate table mysql.general_log;

方式2:通过查看information_schema.PROCESSLIST

可以用具体的SQL语句进行查看,通过where条件过滤把不相关的信息过滤掉。

具体语句如下:

mysql> select * from information_schema.PROCESSLIST where info is not null ORDER BY time desc;

这里有必要介绍下processlist各列的含义和用途:

1、id列:用户登录mysql时,系统分配的"connection_id",可以使用函数connection_id()查看;kill一个语句时会用到,语句为:kill id;MySQL的id相当于Oracle的sid和SERIAL#;

2、user列:显示当前用户。如果不是root,此命令就只显示用户权限范围的sql语句;

3、host列:显示这个语句是从哪个ip的哪个端口上发的,可以用来跟踪出现问题语句的用户;4、db列:显示这个进程目前连接的是哪个数据库;

5、command列:显示当前连接的执行的命令,一般取值为休眠(sleep),查询(query),连接(connect)等;

6、time列:显示这个状态持续的时间,单位是秒;

7、state列:显示使用当前连接的sql语句的状态,很重要的列,后续会有所有的状态的描述,请注意,state只是语句执行中的某一个状态,一个sql语句,已查询为例,可能需要经过copying to tmp table,Sorting result,Sending data等状态才可以完成;

8、info列:显示这个sql语句,因为长度有限,所以长的sql语句就显示不全,但是一个判断问题语句的重要依据。

上述两种方式,刚才也提到过只能查看正在执行的sql语句,对应历史记录,查看不到。

参考链接:https://blog.csdn.net/weixin_39562327/article/details/113222800

下面这个语句也能查询到一些当前的sql语句, 但是更新太快没啥实用价值.

select info from information_schema.`PROCESSLIST` where id = @@pseudo_thread_id

最后

以上就是拼搏发夹为你收集整理的mysql触发器中记录当前正在执行的sql语句.的全部内容,希望文章能够帮你解决mysql触发器中记录当前正在执行的sql语句.所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部