MySQL的information_schema.innodb_trx表


1. 简介

innodb_trx表是innodb引擎提供的事务相关的信息表,主要记录了当前事务的相关信息,包括事务id、事务状态、事务开始时间、事务结束时间、事务持续时间、事务锁定时间、事务锁定类型、事务锁定对象、事务锁定行数、事务锁定行数据、事务锁定行数据键值等。


information_schema.innodb_trx是MySQL中记录innodb事务相关信息的表。

它包含以下重要字段:

  • trx_id - 事务的ID
  • trx_state - 事务的状态(RUNNING, LOCK WAIT, ROLLING BACK等)
  • trx_started - 事务的启动时间
  • trx_requested_lock_id - 事务正在等待的锁的ID
  • trx_wait_started - 事务开始等待的时间
  • trx_weight - 事务的权重
  • trx_mysql_thread_id - 该事务线程的ID
  • trx_query - 事务执行的最后一条查询语句
  • trx_operation_state - 事务是否正在执行(正在执行或已执行完成)
  • trx_tables_in_use - 事务访问的表数量
  • trx_tables_locked - 事务持有锁的表数量
  • trx_lock_structs - 事务持有的锁数量
  • trx_lock_memory_bytes - 事务锁占用的内存量
  • trx_rows_locked - 事务锁定的行数
  • trx_rows_modified - 事务修改的行数

这些信息可以用来监控和分析事务的状态,找出长时间运行和等待锁的事务,分析事务开销,排查事务相关问题。

例如,可以用trx_state查看哪些事务卡住,trx_wait_started查看等待时间,trx_query查看事务执行的语句。


对于innodb_trx表来说,记录数为0是正常的情况。

information_schema.innodb_trx表用来记录InnoDB存储引擎的当前事务执行信息的快照。

这个表中的数据不是持久存储的,而是在查询该表时动态生成的。所以当没有活跃的事务时,该表明细会为空(记录数为0)。

也就是说,如果没有InnoDB事务正在执行,这个表的正常状态就是为空。一旦有事务激活,该表就会动态反映出当前活跃事务的详细数据。


shenpeng说执行事务操作时,一直超时

之后又好了

select t1.id,t1.name,t1.owner_id,t1.campaign_type,t1.supported_terminal,t1.image,t1.google_recaptcha,t1.extensible,t1.eligibility_expression,t1.is_landing_campaign,t1.is_exclusive_campaign,t2.campaign_level,t2.visible,t2.current_round_id,t2.weight,t2.is_draft,t2.is_removed,t2.remove_by,t2.is_end,t2.is_private,t2.end_time,t2.audit_result,t2.cohost_under_review,t3.id,t3.start_time,t3.end_time,t3.max_qualifiers,t3.max_winners,t3.winner_generate_method,t3.qualifier_generate_method,t3.min_finished_optional_task_num,t3.min_finished_optional_task_points,t3.winner_rewards from campaign_basics t1 left join campaign_status_infos t2 on t1.id=t2.campaign_id left join campaign_rounds t3 on t2.current_round_id=t3.id left join b_side_users t4 on t1.owner_id = t4.user_id where t2.visible=1 and t2.is_draft=0 and t2.is_removed=0 and t2.is_private=0 and t4.verified=1 and t2.audit_result=2 and t1.supported_terminal=0 and t1.is_landing_campaign=0 and t1.is_exclusive_campaign=0 and t1.campaign_type=0 and t2.is_end=0 and t3.start_


可以 kill trx_mysql_thread_id 解决

https://blog.51cto.com/u_15103035/2649913

这篇不错

https://blog.horus-k.com/2020/03/09/Mysql/INFORMATION-SCHEMA-INNODB-TRX-%E8%AF%A6%E8%A7%A3-%E8%A1%A8-%E9%94%81-%E7%AD%89%E5%BE%85%E8%B6%85%E6%97%B6/

TRX_STATE 事务执行状态,允许值为RUNNING, LOCK WAIT, ROLLING BACK, and COMMITTING.

https://blog.csdn.net/CaptHua/article/details/126398502

https://www.modb.pro/db/412052

mysql information_schema.innodb_trx 表如何能看出是否有表锁等待或者死锁

在 MySQL 中,information_schema.innodb_trx 表提供了有关当前正在 InnoDB 存储引擎中执行的事务的信息。要判断是否存在表锁等待或者死锁,你可以通过检查这个表的某些列来获取线索。以下是一些关键的列和它们的作用:

  1. trx_state: 显示事务的当前状态。如果一个事务处于锁等待状态,这个列会显示为 ‘LOCK WAIT’。

  2. trx_wait_started: 如果事务正在等待锁,此列显示等待开始的时间。

  3. trx_mysql_thread_id: 这个列与 MySQL 的 PROCESSLIST 表中的 ID 列相关联,可用于确定哪个线程在等待锁。

要检测死锁,可以使用以下方法:

  • 查看 InnoDB 状态: 通过执行 SHOW ENGINE INNODB STATUS,可以获取关于最近发生的死锁的详细信息。这个命令输出中的 “LATEST DETECTED DEADLOCK” 部分会描述最近检测到的死锁。

  • 检查错误日志: MySQL 通常会在其错误日志中记录死锁信息。

  • 使用 Performance Schema: 如果启用了 Performance Schema,可以查询相关的表来获取有关锁定和死锁的详细信息。

对于 information_schema.innodb_trx 表来说,虽然它提供了正在进行的事务的信息,但它并不直接显示死锁。死锁通常需要通过分析事务之间的锁定关系来检测。

要查询是否存在锁等待,可以使用如下 SQL 查询:

1
SELECT * FROM information_schema.innodb_trx WHERE trx_state = 'LOCK WAIT';

这将列出所有当前处于锁等待状态的事务。但请记住,要获得更全面的锁定和死锁分析,可能需要结合使用多种工具和查询。


如果trx_state一直running

如果在 information_schema.innodb_trx 表中,trx_state 列的值为 RUNNING,这意味着事务目前是活跃的且正在执行中。在这种情况下,要判断是否存在锁等待或死锁,你可以考虑以下几个方面:

  1. 长时间运行的事务: 如果一个事务一直处于 RUNNING 状态且运行时间异常长,这可能是由于它在等待某些资源(如行锁)或者是执行了一些耗时的操作(如大批量数据处理)。

  2. 检查锁等待:

    • 使用 SHOW ENGINE INNODB STATUS 命令可以查看更多关于锁的详细信息,包括哪些锁被持有,哪些锁正在等待。
    • 也可以查询 information_schema.innodb_locksinformation_schema.innodb_lock_waits 表来获取当前的锁情况和锁等待情况。
  3. 死锁检测:

    • 虽然 trx_stateRUNNING 并不直接表明存在死锁,但你可以通过 SHOW ENGINE INNODB STATUS 命令检查是否有死锁发生。
    • 检查 MySQL 的错误日志,因为死锁信息通常会被记录在那里。
  4. 性能分析:

    • 考虑使用 Performance Schema 或者其他第三方工具来分析长时间运行的事务,了解它们为何没有完成。
  5. 应用程序日志:

    • 检查应用程序日志可能会提供事务为何长时间运行的线索,尤其是在应用程序层面上是否有逻辑导致事务被不必要地持有。
  6. 优化查询和索引:

    • 如果某个事务长时间运行,也可能是因为涉及的查询需要优化,或者涉及的表缺乏合适的索引。

在处理这类问题时,通常需要综合考虑数据库的性能指标、查询优化以及应用程序逻辑,以确保有效地解决问题。

如果trx_state一直running,什么原因?如何解决?

如果在 MySQL 的 information_schema.innodb_trx 表中,trx_state 列的值一直显示为 RUNNING,这表明事务正在执行中,但它没有指明该事务是否遇到了问题。以下是一些可能导致事务长时间运行的原因以及相应的解决方法:

原因

  1. 长时间执行的查询:

    • 事务可能包含耗时的查询操作,特别是在处理大量数据或复杂的连接时。
  2. 锁争用:

    • 事务可能在等待锁资源,例如,其他事务持有行锁,而当前事务需要等待这些锁释放。
  3. 资源限制:

    • 数据库服务器的资源限制(如 CPU、内存、IO 等)可能导致事务执行缓慢。
  4. 应用程序逻辑:

    • 应用程序逻辑可能导致事务保持开启状态,尤其是在使用 ORM 框架时,可能由于编程错误或设计不佳而未能及时提交或回滚事务。
  5. 网络延迟或中断:

    • 在分布式系统或网络数据库中,网络问题可能导致事务执行中断或延迟。

解决方法

  1. 优化查询:

    • 检查并优化长时间运行的查询。使用 EXPLAIN 分析查询计划,确保索引得到有效使用。
  2. 监控和解决锁争用:

    • 使用 SHOW ENGINE INNODB STATUS 来监控锁情况。
    • 检查 information_schema.innodb_locksinformation_schema.innodb_lock_waits 表来确定锁争用情况。
    • 调整事务逻辑,减少锁争用。
  3. 提高资源效率:

    • 检查和升级服务器资源。
    • 调整数据库配置,如内存分配、缓存大小等。
  4. 代码审查和调整:

    • 审查和调整应用程序逻辑,确保事务在适当的时间被提交或回滚。
    • 避免在一个事务中执行过多的操作。
  5. 处理网络问题:

    • 在分布式环境中,确保网络稳定且响应时间可接受。
  6. 定期监控和维护:

    • 定期监控数据库性能。
    • 实施定期的数据库维护,如清理旧数据、重建索引等。

通过这些方法,可以诊断并解决导致事务长时间处于 RUNNING 状态的问题。重要的是要综合考虑数据库性能、查询优化和应用程序设计,以确保数据库的健康运行。