data_locks表
该data_locks
表显示了持有和请求的数据锁。有关哪些锁定请求被哪些保持的锁定阻止的信息,请参见“ data_lock_waits表”。
数据锁信息示例:
mysql>SELECT *FROM performance_schema.data_locks\G *************************** 1. row*************************** ENGINE: INNODB ENGINE_LOCK_ID: 139664434886512:1059:139664350547912 ENGINE_TRANSACTION_ID: 2569 THREAD_ID: 46 EVENT_ID: 12 OBJECT_SCHEMA: test OBJECT_NAME: t1 PARTITION_NAME: NULL SUBPARTITION_NAME: NULL INDEX_NAME: NULL OBJECT_INSTANCE_BEGIN: 139664350547912 LOCK_TYPE: TABLE LOCK_MODE: IX LOCK_STATUS: GRANTED LOCK_DATA: NULL *************************** 2. row*************************** ENGINE: INNODB ENGINE_LOCK_ID: 139664434886512:2:4:1:139664350544872 ENGINE_TRANSACTION_ID: 2569 THREAD_ID: 46 EVENT_ID: 12 OBJECT_SCHEMA: test OBJECT_NAME: t1 PARTITION_NAME: NULL SUBPARTITION_NAME: NULL INDEX_NAME: GEN_CLUST_INDEX OBJECT_INSTANCE_BEGIN: 139664350544872 LOCK_TYPE: RECORD LOCK_MODE: X LOCK_STATUS: GRANTED LOCK_DATA: supremum pseudo-record
与大多数Performance Schema数据收集不同,没有用于控制是否收集数据锁定信息或用于控制数据锁定表大小的系统变量的工具。性能架构收集服务器中已经可用的信息,因此没有内存或CPU开销来生成此信息,也不需要控制其收集的参数。
使用该data_locks
表可帮助诊断在高并行负载下发生的性能问题。对于InnoDB
,请参见“ InnoDB INFORMATION_SCHEMA事务和锁定信息”中有关此主题的讨论。
该data_locks
表包含以下列:
ENGINE
持有或请求锁定的存储引擎。
ENGINE_LOCK_ID
存储引擎持有或请求的锁的ID。(
ENGINE_LOCK_ID
,ENGINE
)值的元组是唯一的。锁ID格式是内部的,随时可能更改。应用程序不应依赖具有特定格式的锁ID。
ENGINE_TRANSACTION_ID
请求锁定的事务的存储引擎内部ID。可以将其视为锁的所有者,尽管锁可能仍处于挂起状态,但尚未实际授予(
LOCK_STATUS='WAITING'
)。如果事务尚未执行任何写操作(仍被视为只读),则该列包含用户不应尝试解释的内部数据。否则,该列为交易ID。
对于
InnoDB
,要获取有关交易的详细信息,请将此列与表的TRX_ID
列连接在一起INFORMATION_SCHEMA
INNODB_TRX
。THREAD_ID
创建锁的会话的线程ID。要获取有关线程的详细信息,请将此列与
THREAD_ID
“性能模式”threads
表的列连接在一起。THREAD_ID
可以与一起使用,EVENT_ID
以确定在内存中创建锁定数据结构的事件。(如果数据结构用于存储多个锁,则此事件可能在此特定的锁请求发生之前发生。)EVENT_ID
导致锁定的Performance Schema事件。(
THREAD_ID
,EVENT_ID
)值的元组隐式标识其他性能模式表中的父事件:- 表中的父级等待事件
events_waits_xxx
- 表中的父阶段事件
events_stages_xxx
- 表中的父语句事件
events_statements_xxx
- 在父事务事件
events_transactions_current
表
要获取有关父事件的详细信息,请在相应的父事件表中将
THREAD_ID
和EVENT_ID
列与名称相似的列连接在一起。- 表中的父级等待事件
OBJECT_SCHEMA
包含锁定表的架构。
OBJECT_NAME
锁定表的名称。
PARTITION_NAME
锁定分区的名称(如果有);
NULL
除此以外。SUBPARTITION_NAME
锁定的子分区的名称(如果有);
NULL
除此以外。INDEX_NAME
锁定索引的名称(如果有);
NULL
除此以外。在实践中,
InnoDB
总是创建索引(GEN_CLUST_INDEX
),所以INDEX_NAME
是不NULL
为InnoDB
表。OBJECT_INSTANCE_BEGIN
锁的内存中的地址。
LOCK_TYPE
锁的类型。
该值取决于存储引擎。对于
InnoDB
,允许的值RECORD
用于行级锁,TABLE
用于表级锁。LOCK_MODE
如何请求锁定。
该值取决于存储引擎。为
InnoDB
,允许值是S[,GAP]
,X[,GAP]
,IS[,GAP]
,IX[,GAP]
,AUTO_INC
,和UNKNOWN
。如果存在,则除AUTO_INC
和以外的其他锁定模式UNKNOWN
表示间隙锁定。有关信息S
,X
,IS
,IX
,和差距锁,请参阅第15.7.1,“InnoDB的锁定”。LOCK_STATUS
锁定请求的状态。
该值取决于存储引擎。对于
InnoDB
,允许的值为GRANTED
(锁定被保持)和WAITING
(锁定正在等待)。LOCK_DATA
与锁关联的数据(如果有)。该值取决于存储引擎。例如
InnoDB
,如果LOCK_TYPE
是RECORD
,则显示一个值,否则为NULL
。显示了锁定记录的主键值,以表示放置在主键索引上的锁。显示锁定记录的二级索引值,并在二级索引上附加锁的主键值。如果没有主键,则根据控制规则,LOCK_DATA
显示所选唯一索引的键值或唯一InnoDB
内部行ID号InnoDB
聚集索引的使用(请参见“聚集索引和二级索引”)。LOCK_DATA
报告“最高伪记录”以获取对最高伪记录的锁定。如果包含锁定记录的页面不在缓冲池中,因为它是在持有锁定时被写入磁盘的,InnoDB
则不会从磁盘中获取页面。而是LOCK_DATA
报告NULL
。
该data_locks
表具有以下索引:
- (
ENGINE_LOCK_ID
,ENGINE
)上的主键 - 在(
ENGINE_TRANSACTION_ID
,ENGINE
)上的索引 - 在(
THREAD_ID
,EVENT_ID
)上的索引 - 在指数(
OBJECT_SCHEMA
,OBJECT_NAME
,PARTITION_NAME
,SUBPARTITION_NAME
)
TRUNCATE TABLE
不允许用于该data_locks
表。