的data_locks
表显示所持有和请求的数据锁。有关哪些锁请求被持有的锁阻塞的信息,请参见第27.12.13.2节“data_lock_waittable”.
数据锁信息示例:
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数据收集不同,没有控制是否收集数据锁信息的工具,也没有控制数据锁表大小的系统变量。Performance Schema收集服务器中已经存在的信息,因此不存在生成这些信息的内存或CPU开销,也不需要控制其收集的参数。
使用data_locks
表,以帮助诊断并发负载高时发生的性能问题。为InnoDB
,参见关于此主题的讨论第15.15.2节“InnoDB的事务和锁定信息”.
的data_locks
表有这些列:
引擎
持有或请求锁的存储引擎。
ENGINE_LOCK_ID
存储引擎持有或请求的锁的ID。元组(
ENGINE_LOCK_ID
,引擎
)值是唯一的。锁ID格式是内部的,随时可能更改。应用程序不应该依赖具有特定格式的锁id。
ENGINE_TRANSACTION_ID
请求锁的事务的存储引擎内部ID。这可以被认为是锁的所有者,尽管锁可能仍然是挂起的,实际上还没有授予(
LOCK_STATUS = '等待'
).如果事务还没有执行任何写操作(仍然被认为是只读的),则列包含用户不应该尝试解释的内部数据。否则,该列就是事务ID。
为
InnoDB
,以获取有关事务的详细信息,请将此列与TRX_ID
列的INFORMATION_SCHEMA
INNODB_TRX
表格THREAD_ID
创建锁的会话的线程ID。要获取关于线程的详细信息,请将此列与
THREAD_ID
的“性能架构”列线程
表格THREAD_ID
可以和?一起用吗EVENT_ID
确定在内存中创建锁数据结构的事件。(如果数据结构用于存储多个锁,则此事件可能在此特定锁请求发生之前发生。)EVENT_ID
导致锁定的性能架构事件。元组(
THREAD_ID
,EVENT_ID
)值隐式识别其他性能模式表中的父事件:中的父等待事件
events_waits_
表xxx
中的父阶段事件
events_stages_
表xxx
中的父语句事件
events_statements_
表xxx
控件中的父事务事件
events_transactions_current
表格
如需获取父事件的详细信息,请加入
THREAD_ID
而且EVENT_ID
适当的父事件表中具有相同名称的列。看到第27.19.2节“获取父事件信息”.OBJECT_SCHEMA
包含锁定表的模式。
OBJECT_NAME
锁定表的名称。
PARTITION_NAME
锁定分区的名称(如果有的话);
零
否则。SUBPARTITION_NAME
锁定子分区的名称,如果有的话;
零
否则。INDEX_NAME
锁定索引的名称(如果有的话);
零
否则。在实践中,
InnoDB
总是创建索引(GEN_CLUST_INDEX
),所以INDEX_NAME
是不零
为InnoDB
表。OBJECT_INSTANCE_BEGIN
锁在内存中的地址。
LOCK_TYPE
锁的类型。
取值与存储引擎相关。为
InnoDB
,允许值为记录
对于行级锁,表格
对于表级锁。LOCK_MODE
如何请求锁。
取值与存储引擎相关。为
InnoDB
,允许值为S(差距)
,X(差距)
,(差距)
,第九(差距)
,AUTO_INC
,未知的
.非锁定模式AUTO_INC
而且未知的
如果有间隙锁,指示间隙锁。和有关信息。年代
,X
,是
,9
,和间隙锁,参考第15.7.1节“InnoDB锁定”.LOCK_STATUS
锁请求的状态。
取值与存储引擎相关。为
InnoDB
,允许值为授予
(锁被持有)和等待
(正在等锁)。LOCK_DATA
与锁相关的数据(如果有的话)。取值与存储引擎相关。为
InnoDB
,则显示一个值LOCK_TYPE
是记录
,否则为零
.对于放在主键索引上的锁,显示锁定记录的主键值。锁定记录的二级索引值显示为附加在二级索引上的锁的主键值。如果没有主键,LOCK_DATA
显示所选惟一索引或惟一索引的键值InnoDB
内部行ID号,根据所控制的规则InnoDB
聚集索引的使用(参见第15.6.2.1节“群集索引和二级索引”).LOCK_DATA
报告”上确界pseudo-record”用于在最高伪记录上获取的锁。如果包含锁定记录的页面不在缓冲池中,因为它是在持有锁时写入磁盘的,InnoDB
不从磁盘取页。相反,LOCK_DATA
报告零
.
的data_locks
表有以下索引:
主键(
ENGINE_LOCK_ID
,引擎
)指数(
ENGINE_TRANSACTION_ID
,引擎
)指数(
THREAD_ID
,EVENT_ID
)指数(
OBJECT_SCHEMA
,OBJECT_NAME
,PARTITION_NAME
,SUBPARTITION_NAME
)
截断表
是不允许的data_locks
表格
在MySQL 8.0.1之前,与性能模式中的信息类似data_locks
表可在INFORMATION_SCHEMA。INNODB_LOCKS
表,该表提供了关于每个锁的信息InnoDB
事务已请求但尚未获得,以及正在阻塞另一个事务的事务所持有的每个锁。INFORMATION_SCHEMA。INNODB_LOCKS
已弃用,从MySQL 8.0.1起移除。data_locks
应该使用。
之间的差异INNODB_LOCKS
而且data_locks
:
如果一个事务持有一个锁,
INNODB_LOCKS
只有在另一个事务正在等待它时才显示锁。data_locks
显示锁,而不管是否有事务在等待它。的
data_locks
表中没有对应的列LOCK_SPACE
,LOCK_PAGE
,或LOCK_REC
.的
INNODB_LOCKS
表需要全局的过程
特权。的data_locks
表需要通常的性能模式特权选择
在要选择的桌子上。
下表显示了从INNODB_LOCKS
列data_locks
列。使用这些信息将应用程序从一个表迁移到另一个表。
表27.4从INNODB_LOCKS到data_locks列的映射
INNODB_LOCKS列 | data_locks列 |
---|---|
LOCK_ID |
ENGINE_LOCK_ID |
LOCK_TRX_ID |
ENGINE_TRANSACTION_ID |
LOCK_MODE |
LOCK_MODE |
LOCK_TYPE |
LOCK_TYPE |
LOCK_TABLE (结合模式/表名) |
OBJECT_SCHEMA (模式名称),OBJECT_NAME (表名) |
LOCK_INDEX |
INDEX_NAME |
LOCK_SPACE |
没有一个 |
LOCK_PAGE |
没有一个 |
LOCK_REC |
没有一个 |
LOCK_DATA |
LOCK_DATA |