该data_locks
表显示持有和请求的数据锁。有关哪些锁定请求被哪些持有的锁阻止的信息,请参阅
第 27.12.13.2 节,“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 数据收集不同,没有用于控制是否收集数据锁信息的工具或用于控制数据锁表大小的系统变量。Performance Schema 收集服务器中已有的信息,因此没有内存或 CPU 开销来生成此信息,也不需要控制其收集的参数。
使用该data_locks
表可帮助诊断在并发负载较重时发生的性能问题。对于,请参阅第 15.15.2 节“InnoDB INFORMATION_SCHEMA 事务和锁定信息”InnoDB
中对此主题的讨论
。
该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
Performance Schemathreads
表的列连接起来。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
列与相应父事件表中名称相似的列连接起来。请参阅 第 27.19.2 节,“获取父事件信息”。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
则显示一个值,否则该值为 。对于放置在主键索引上的锁,显示锁定记录的主键值。锁定记录的二级索引值显示为附加在二级索引上的锁的主键值。如果没有主键, 则根据管理规则显示所选唯一索引的键值或唯一 内部行 ID 号LOCK_TYPE
RECORD
NULL
LOCK_DATA
InnoDB
InnoDB
聚簇索引使用(参见 第 15.6.2.1 节,“聚簇索引和二级索引”)。LOCK_DATA
报告在 supremum 伪记录上获取的锁的“ supremum pseudo-record ”。如果包含锁定记录的页面不在缓冲池中,因为它是在持有锁时写入磁盘的,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
表。
在 MySQL 8.0.1 之前,表中提供了类似于 Performance Schemadata_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
表需要全局PROCESS
权限。该data_locks
表需要通常的 Performance Schema 权限SELECT
才能从中选择表。
下表显示了从
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 |