如何显示 MySQL长事务

如何显示 MySQL长事务

2022年9月6日

最近,有人问我如何在MySQL中找到长时间运行的事务。

我已经有了一个MySQL Shell插件,它允许您查找按时间排序的当前事务。该插件还允许您获取所需事务的详细信息。请参见 check.getRunningStatements()

让我们看看如何轻松找到那些对DBA来说可能是噩梦的长事务(参见 MySQL History List Length post

SELECT thr.processlist_id AS mysql_thread_id,
       concat(PROCESSLIST_USER,'@',PROCESSLIST_HOST) User,
       Command,
       FORMAT_PICO_TIME(trx.timer_wait) AS trx_duration,
       current_statement as `latest_statement`
  FROM performance_schema.events_transactions_current trx
  INNER JOIN performance_schema.threads thr USING (thread_id)
  LEFT JOIN sys.processlist p ON p.thd_id=thread_id
 WHERE thr.processlist_id IS NOT NULL 
   AND PROCESSLIST_USER IS NOT NULL 
   AND trx.state = 'ACTIVE'
 GROUP BY thread_id, timer_wait 
 ORDER BY TIMER_WAIT DESC LIMIT 10;

在这里插入图片描述

我们可以看到,目前我们有一个活跃的事务打开了超过43分钟,而且似乎什么也没做。

休眠会话实际上是造成问题最多的会话,因为它们可能是已被遗忘的交互式会话,默认情况下会保持较长时间(8小时,interactive_timeout)。

如果启用performance_schema_events_statements_history_size开关,还可以列出此事务中执行的语句(默认情况下限制为10条):

UPDATE performance_schema.setup_consumers 
       SET enabled = 'yes' 
  WHERE name LIKE 'events_statements_history_long' 
     OR name LIKE 'events_transactions_history_long';

启用后,我们可以使用以下语句查看所有新事务的历史记录:

SELECT DATE_SUB(now(), INTERVAL (
         SELECT variable_value 
           FROM performance_schema.global_status 
           WHERE variable_name='UPTIME')-TIMER_START*10e-13 second) `start_time`,
       SQL_TEXT 
  FROM performance_schema.events_statements_history  
 WHERE nesting_event_id=(
               SELECT EVENT_ID 
                 FROM performance_schema.events_transactions_current t   
                 LEFT JOIN sys.processlist p ON p.thd_id=t.thread_id  
                 WHERE conn_id=<VALUE OF mysql_thread_id COLUMN>) 
 ORDER BY event_id;

让我们试试看:

在这里插入图片描述

如您所见,我们可以得到在这个长事务中执行的先前语句的列表。 再一次,Performance_Schema包含了我们需要的所有内容。 享受MySQL,避免长事务!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值