mysql触发器中记录当前正在执⾏的sql语句.editor assigned是什么意思
mysql触发器, 很常见, 但是常规的两个变量只有New和OLD, 两个, 如何才能取得当前正在执⾏的sql语句呢?
因为我想知道这条数据的状态是哪个sql修改的. 我好修补bug…
那么这个需求就⾮常的合理⼜有说服⼒. 可惜mysql⽬前好像没有给触发器增加这个变量
那么唯⼀的办法就是另寻他法了.
于是⽬标转移到mysql⽇志上.
或者全局变量上. 或许全局变量有关于当前sql的变量.
⾸先映⼊ 眼帘的是 开启⽇志记录功能
-- 开启⽇志记录功能
SET GLOBAL general_log =ON;
-- 设置⽇志输出到 table ⽽不是⽂件, 输出到table就输出到了al_log表中
SET GLOBAL log_output ='table';
-- 查询当前正在执⾏的sql语句, 第⼀条.
SELECT*al_log ORDER BY event_time DESC LIMIT1;
OK, ⾄此已完成.⽇志的记录⼯作, 那么只需要在触发器中,读取这个⽇志,然后插⼊到某个表中即可
触发器中的主⽇志代码⽰例
insert into record_log  set
`record_id` =new.`record_id`,
`newai`=new.`ai`,
bootstrap是什么方法`oldai` = old.`ai`,
`new_status`=new.`status`,
`sql` =(SELECT argument al_log ORDER BY event_time DESC LIMIT 1)
⽤完记得要关闭⽇志跟踪, 因为⽇志跟踪很耗资源.很慢.
SET GLOBAL general_log =OFF;
注意, 此⽅法在⾼频率的⽣产环境可能不是很合适, 因为触发器在执⾏的时候说不定,其它sql也执⾏了. 取到的第⼀条sql⽇志不⼀定就是当前的SQL语句, 所以此⽅法在低频率的开发环境⽤来定位问题语句还是可以的. 在⾼并发的环境还是要慎重判断对应的sql是否就是对应的sql.当然也可以采取记录下时间戳然后再查询general_log 表前后5秒内的sql⽇志.进⾏分析判断. 但这就需要⼈⼯来进⾏判断了… 总值这条思路基本上可以查询定位问题了.
清空表
不允许使⽤delete删除al_log,只能⽤truncate
truncate al_log;
⽅式2:通过查看information_schema.PROCESSLIST
可以⽤具体的SQL语句进⾏查看,通过where条件过滤把不相关的信息过滤掉。mysql语句转oracle
collected怎么读具体语句如下:
springer医学期刊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语句,对应历史记录,查看不到。
下⾯这个语句也能查询到⼀些当前的sql语句, 但是更新太快没啥实⽤价值.
select info from information_schema.`PROCESSLIST`where id = @@pseudo_thread_id
程序员必看的十大电影

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。