代码之家  ›  专栏  ›  技术社区  ›  GProst

如何在MySQL中查找并终止长时间运行的事务

  •  0
  • GProst  · 技术社区  · 2 月前

    我们的应用程序有一些长时间运行的操作,这些操作被包裹在一个事务中,在这样的事务中,它执行了数十个快速查询。

    最近,我们遇到了一个此类事务的问题——它更新了大量资源,因此在这些资源上获取了LOCK,这使得在长时间运行的事务完成之前,无法对这些资源执行其他更新操作。

    问题: 如果需要,我们如何找到该事务的进程ID并杀死它? 我想通过以下方式找到它 SHOW PROCESSLIST 输出(例如,可能只是找到一个执行时间较长的命令),但这似乎有问题:据我所知,已启动的事务将在 Sleep 状态,它不会有任何其他细节,并且假设我们有一个到DB的持久连接池(它也有 睡觉 状态和显示长执行时间)我不确定如何找到我想杀死的特定连接。

    这是供将来参考的,我们遇到问题的交易已经完成。

    希望这有道理。

    1 回复  |  直到 2 月前
        1
  •  0
  •   Ahmed S Issa    2 月前

    要识别并可能终止MySQL中长时间运行的事务,您可以按照以下步骤操作:

    步骤1:识别长期交易

    您可以使用以下查询查找长时间运行的事务的详细信息,包括其流程ID:

    1. 检查正在运行的事务:

      SELECT
          trx_id,
          trx_mysql_thread_id,
          trx_state,
          trx_started,
          trx_wait_started,
          trx_query,
          trx_operation_state
      FROM
          information_schema.innodb_trx
      WHERE
          trx_state = 'RUNNING'
      ORDER BY
          trx_started;
      
      • trx_id :交易的ID。
      • trx_mysql_thread_id :可用于终止事务的进程ID(或线程ID)。
      • trx_started :交易开始时。
      • trx_query :与交易关联的查询。
    2. 识别未结交易的休眠连接:

      SELECT 
          trx.trx_id,
          trx.trx_mysql_thread_id,
          trx.trx_started,
          p.USER,
          p.HOST,
          p.DB,
          p.COMMAND,
          p.TIME,
          p.STATE,
          p.INFO
      FROM 
          information_schema.innodb_trx trx
          JOIN information_schema.processlist p ON trx.trx_mysql_thread_id = p.ID
      WHERE 
          p.COMMAND = 'Sleep'
          AND trx.trx_state = 'RUNNING';
      

      这将有助于识别具有活动事务的休眠连接。

    第二步:终止交易

    一旦识别出有问题事务的进程ID(线程ID),就可以使用以下命令将其终止:

    KILL <process_id>;
    

    更换 <process_id> 使用从先前查询中获得的实际进程ID(或线程ID)。

    注意事项

    • 监控工具: 考虑使用以下监控工具 Percona Monitoring and Management (PMM)或 MySQL Enterprise Monitor 这可以提醒您长时间运行的事务和锁。
    • 超时: 如果这是一个常见的问题,您可能需要考虑为事务设置超时或检查逻辑以避免长期持有的锁。

    通过遵循这些步骤,您应该能够在将来有效地识别和管理长时间运行的事务。

    来源: MySQL文档 InnoDB Transaction Monitoring .