概述
INFORMATION_SCHEMA提供对数据库元数据的访问、关于MySQL服务器的信息,如数据库或表的名称、列的数据类型或访问权限。其中有一个关于InnoDB数据库引擎表的集合,里面有记录数据库事务和锁的相关表,InnoDB INFORMATION_SCHEMA表可以用来监视正在进行的InnoDB活动,在它们变成问题之前检测低效,或者对性能和容量问题进行故障排除。在实际开发和应用中,会碰到和数据库事务相关的问题,比如事务一直未结束,出现行锁,表锁以及死锁等情况,这时我们就需要有一个快速定位问题行之有效的方法,所以我们来系统了解下INFORMATION_SCHEMA和定位事务问题。
INFORMATION_SCHEMA中与事务和锁相关的表
INFORMATION_SCHEMA中与事务和锁相关的表有如下几个:
- INFORMATION_SCHEMA.INNODB_TRX
- INFORMATION_SCHEMA.INNODB_LOCKS
- INFORMATION_SCHEMA.INNODB_LOCK_WAITS
- INFORMATION_SCHEMA.PROCESSLIST
INFORMATION_SCHEMA.INNODB_TRX
INNODB_TRX表提供了关于当前在InnoDB中执行的每个事务(不包括只读事务)的信息,包括事务是否等待锁、事务何时启动以及事务正在执行的SQL语句(如果有的话)。INNODB_TRX表有以下字段:
Field | Comment |
---|---|
TRX_ID | 自增id |
TRX_WEIGHT | 事务权重,反映(但不一定是准确的计数)事务更改的行数和锁定的行数。为了解决死锁,InnoDB选择权重最小的事务作为要回滚的“受害者” |
TRX_STATE | 事务执行状态。允许的值包括运行(RUNNING)、锁等待(LOCK WAIT)、回滚(ROLLING BACK)和提交(COMMITTING)。 |
TRX_STARTED | 事务开始时间 |
TRX_REQUESTED_LOCK_ID | 事务当前等待的锁的ID,如果TRX_STATE为LOCK WAIT;否则无效。要获取关于锁的详细信息,请将此列与INNODB_LOCKS表的LOCK_ID列关联 |
TRX_WAIT_STARTED | 事务开始等待锁的时间,如果TRX_STATE为锁等待(LOCK WAIT);否则无效。 |
TRX_MYSQL_THREAD_ID | MySql事务线程id,要获取关于线程的详细信息,与INFORMATION_SCHEMA PROCESSLIST表的ID列关联 |
TRX_QUERY | 事务正在执行的SQL语句 |
TRX_OPERATION_STATE | 事务当前操作 |
TRX_TABLES_IN_USE | 处理此事务的当前SQL语句使用的InnoDB表的数量 |
TRX_TABLES_LOCKED | 当前SQL语句具有行锁(row locks)的InnoDB表的数量(因为这些是行锁(row locks),而不是表锁(table locks),所以表通常仍然可以由多个事务读写,尽管有些行被锁定了) |
TRX_LOCK_STRUCTS | 事务保留的锁的数量 |
TRX_LOCK_MEMORY_BYTES | 此事务在内存中的锁结构占用的总大小 |
TRX_ROWS_LOCKED | 此事务锁定的近似数目或行。该值可能包括物理上存在但对事务不可见的删除标记行 |
TRX_ROWS_MODIFIED | 此事务中修改和插入的行数量 |
TRX_CONCURRENCY_TICKETS | 指示当前事务在换出之前可以做多少工作的值,由innodb_concurrency_tickets系统变量指定 |
TRX_ISOLATION_LEVEL | 事务隔离级别 |
TRX_UNIQUE_CHECKS | 是否为当前事务打开或关闭唯一性检查 |
TRX_FOREIGN_KEY_CHECKS | 是否为当前事务打开或关闭外键检查 |
TRX_ADAPTIVE_HASH_LATCHED | 自适应哈希索引是否被当前事务锁定 |
TRX_ADAPTIVE_HASH_TIMEOUT | 是否立即放弃自适应哈希索引的搜索锁存器,还是在来自MySQL的调用之间保留它 |
TRX_IS_READ_ONLY | 值为1表示只读事务 |
TRX_AUTOCOMMIT_NON_LOCKING | 值1表示事务是一个SELECT语句,它不使用FOR UPDATE或LOCK IN SHARED MODE子句,并且在执行时启用了autocommit,因此事务将只包含这一条语句。当这个列和TRX_IS_READ_ONLY都为1时,InnoDB优化事务,以减少与更改表数据的事务相关的开销。 |
INFORMATION_SCHEMA.PROCESSLIST
PROCESSLIST表记录了每个MySql线程的用户,地址以及操作的表等其他信息。具体字段如下:
Field | Comment |
---|---|
ID | 标识ID。这与在SHOW PROCESSLIST语句的Id列、Performance Schema threads表的PROCESSLIST_ID列中显示的值类型相同,并由CONNECTION_ID()函数返回 |
USER | 发出该语句的mysql用户 |
HOST | 发出该语句的客户机的主机名(系统用户除外,没有主机)。 |
DB | 默认数据库 |
COMMAND | 线程正在执行的命令的类型 |
TIME | 线程处于当前状态的时间(以秒为单位) |
STATE | 指示线程正在执行的操作、事件或状态 |
INFO | 线程正在执行的语句,如果没有执行任何语句,则为NULL |