暂无图片
mysql 8.0 如何 根据information_schema.innodb_trx.trx_id 查询事务执行了哪些SQL?
我来答
分享
wzf0072
2023-05-23
mysql 8.0 如何 根据information_schema.innodb_trx.trx_id 查询事务执行了哪些SQL?

mysql 8.0 如何 根据information_schema.innodb_trx.trx_id 查询事务执行了哪些SQL?

问题描述:发现一个事务执行了半小时尚未提交,锁了544条记录,需要根据trx_id 找到事务执行的SQL。



我来答
添加附件
收藏
分享
问题补充
1条回答
默认
最新
金同学
暂无图片

引发这个现象大致分两类原因

第1类:

开发程序在事务设计时,没有正常提交导致的。显示启动一个事务后,innodb_trx会记录到事务信息,但是由于该事务包含的所有sql已经执行完成,所以看不见正在运行的SQL。

解决思路:根据mysql两阶段锁协议,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放, 而是要等到事务结束时才释放。所以你可以看到了锁了544条记录的信息。针对这类问题,建议dba直接杀掉事务。


第2类:

程序在运行一个非常大的事务,例如for循环1亿次等,事务一直在运行中,只是因为每次执行的sql非常小。DBA每次查看innodb_trx的时刻很难捕捉到正在运行的SQL。


针对上面的现象,虽然当前没有运行的SQL,但是我们可以以下SQL查看到该事务的上一条运行的sql。

select trx_id,trx_operation_state,trx_mysql_thread_id prs_id,now(),
trx_started,to_seconds(now())-to_seconds(trx_started) trx_es_time,
user,db,host,command,state,Time,info current_sql,PROCESSLIST_INFO 
last_sql,t4.ROWS_AFFECTED 'ROWS_AFFECTED(last)',t4.ROWS_SENT as 'ROWS_SENT(last)' 
,t4.ROWS_EXAMINED as 'ROWS_EXAMINED(last)',t1.trx_rows_locked,t1.trx_rows_modified 
from information_schema.innodb_trx t1,information_schema.processlist t2,performance_schema.threads  
t3,performance_schema.events_statements_current t4 where t1.trx_mysql_thread_id=t2.id  and   
t1.trx_mysql_thread_id=t3.PROCESSLIST_ID and t1.trx_mysql_thread_id!=connection_id() and   
t3.THREAD_ID = t4.THREAD_ID and to_seconds(now())-to_seconds(trx_started) >= 5;





暂无图片 评论
暂无图片 有用 0
暂无图片
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏