TDSQL Boundless DATA_LOCKS

PERFORMANCE_SCHEMA.DATA_LOCKS 用于展示集群中所有 hybrid 节点的 TDStore 上所有已成功加锁的悲观锁信息。

相关产品
TDSQL Boundless 产品页,含版本规格、价格与购买入口。

一、功能

在用户没有查询 DATA_LOCKS 表的时候,DATA_LOCKS 不会带来额外的开销。用户不需要将 performance_schema 系统变量设置为 ON,即可查询 DATA_LOCKS 表。

二、支持版本

适用于 TDSQL Boundless V18.0.0 及以上版本。

各版本变更如下:

·V18.0.0:首次引入 DATA_LOCKS。

·V21.2.0:新增 processlist_id、node_id、node_name 字段,分别代表 MySQL 会话连接 ID、请求锁的 SQLEngine 节点 ID 和 名称;修改 thread_id 字段与原生 MySQL 语义对齐,代表 performance_schema.threads 表的主键 ID。

·V21.2.4:新增 OBJECT NAME、OBJECT SCHEMA 字段。

·V21.6.1.0:OBJECT_SCHEMA 列的值从 NULL 变更为表对应的 database 名称;OBJECT_NAME 列的值从 NULL 变更为表名称。

三、字段说明

字段名 类型 描述
ENGINE varchar(32) 存储引擎。对于 TDStore 为 RocksDB。
ENGINE_LOCK_ID varchar(128) 悲观锁的唯一标识符。对于 TDStore,其格式为 <持有锁的事务 ID>_<锁范围>。<锁范围>的格式是:如果锁的范围是一个单条的 key,则<锁范围>为 key 的十六进制表示。例如:锁标识符 28673778183569468_00002797 表示 ID 为 28673778183569468 的事务在十六进制编码为 00002797 的 key 上加了一个悲观锁。如果锁的范围是一个 key 区间,则<锁范围>格式为 [<hex_start_key>,<hex_end_key>)(左闭右开)或 (<hex_start_key>,<hex_end_key>)(开区间)。例如:锁标识符 28673778183569468_[00002797,00002798),表示 ID 为 28673778183569468 的事务在 [00002797,00002798) 区间加了一个悲观锁。当 key 的十六进制编码过长的时候,可能无法在128字符内表示完全。这个时候,字段值的后两个字符会被置为 ..,表示这不是一个完整的锁标识符。这种情况下,用户通过 ENGINE_LOCK_ID 查询悲观锁信息时,也需要使用带有..的字段值做查询。
ENGINE_TRANSACTION_ID bigint unsigned 持有悲观锁的事务的唯一标识符。如果这个悲观锁是读锁,被多个事务共同持有,则只会展示其中一个事务的唯一标识符。
THREAD_ID bigint unsigned Performance Schema 的内部线程 ID,在 Performance Schema 的生命周期内唯一,可用于可靠地关联 Performance Schema 的各类事件表。
EVENT_ID bigint unsigned 导致加锁的 Performance Schema 事件 ID。对于 TDStore 为 NULL。
OBJECT_SCHEMA varchar(64) 悲观锁对应的数据库名。
OBJECT_NAME varchar(64) 悲观锁对应的表名。
PARTITION_NAME varchar(64) 悲观锁对应的分区名。对于 TDStore 为 NULL。
SUBPARTITION_NAME varchar(64) 悲观锁对应的子分区名。对于 TDStore 为 NULL。
INDEX_NAME varchar(64) 悲观锁对应的索引名。对于 TDStore 为 NULL。
OBJECT_INSTANCE_BEGIN bigint unsigned 悲观锁在内存中的地址。
LOCK_TYPE varchar(32) 悲观锁的类型。对于 TDStore,KEY 值代表对单条 key 加锁,PRE_RANGE 值代表对 key 区间加锁。
LOCK_MODE varchar(32) 悲观锁的读写模式。对于 TDStore,Write 值代表加写锁,Read 值代表加读锁。
LOCK_STATUS varchar(32) 悲观锁的状态。对于 TDStore,值为 GRANTED,即加锁成功。正在加的锁不会展示在 data_locks 表中,该信息可以通过查询 data_lock_waits 表获取。
LOCK_DATA varchar(8192) 额外的信息,值由各个存储引擎自行决定。对于 TDStore,值为 NULL。
START_KEY varchar(128) 对于单条 key 上的锁,值为 NULL;对于 key 区间上的锁,值代表 key 区间的左边界的十六进制编码。
END_KEY varchar(128) 对于单条 key 上的锁,值代表该 key 的十六进制编码;对于 key 区间上的锁,值代表 key 区间的右边界的十六进制编码。
EXCLUDE_START_KEY tinyint(1) 当且仅当悲观锁范围是一个 key 区间,且该区间为开区间时,值为1;否则,值为0。
BLOCKING_TRANSACTION_NUM bigint unsigned 在该悲观锁上等待加锁的事务数量。
BLOCKING_CHECK_READ_TRANSACTION_NUM bigint unsigned 在该悲观锁上等待快照读的事务数量。当持有悲观锁的事务进入提交流程的时候,悲观锁会阻塞快照读请求。
READ_LOCKED_NUM bigint unsigned 该悲观锁上读锁的数量。
TINDEX_ID int unsigned 悲观锁对应的 tindex ID。通过这个字段的值,我们可以执行 SELECT * FROM information_schema.statistics WHERE tindex_id=… 从系统表中获取 tindex ID 对应的表信息。
DATA_SPACE_TYPE varchar(32) 悲观锁对应的 data space。DATA_SPACE_TYPE_USER 值代表对用户表的部分数据加锁,DATA_SPACE_TYPE_SYSTEM 值代表对系统表的部分数据加锁。
REPLICATION_GROUP_ID bigint unsigned 悲观锁对应的 replication group ID。
KEY_RANGE_REGION_ID bigint unsigned 悲观锁对应的 key range region ID。
PROCESSLIST_ID bigint unsigned 对应开启该事务的会话连接(session)ID。
NODE_ID bigint unsigned 开启该事务的 SQLEngine 节点 ID。
NODE_NAME varchar(64) 开启该事务的 SQLEngine 节点名称。

注意:说明:

注意:TDSQL Boundless 暂未支持在 data_locks 表中直接展示库名、表名等信息。如果需要查看表信息,可以根据 TINDEX_ID 字段的值,直接从 information_schema.statistics 表查询。

四、示例

·输出示例:

tdsql [(none)]> SELECT * FROM performance_schema.data_locks \\G*************************** 1. row *************************** ENGINE: RocksDB ENGINE_LOCK_ID: 28681376014270466_(0000279780000006,00002798) ENGINE_TRANSACTION_ID: 28681376014270466 THREAD_ID: 44 EVENT_ID: NULL OBJECT_SCHEMA: testdb OBJECT_NAME: test PARTITION_NAME: NULL SUBPARTITION_NAME: NULL INDEX_NAME: NULL OBJECT_INSTANCE_BEGIN: 140502282795216 LOCK_TYPE: PRE_RANGE LOCK_MODE: Write LOCK_STATUS: GRANTED LOCK_DATA: NULL START_KEY: 0000279780000006 END_KEY: 00002798 EXCLUDE_START_KEY: 1 BLOCKING_TRANSACTION_NUM: 0BLOCKING_CHECK_READ_TRANSACTION_NUM: 0 READ_LOCKED_NUM: 0 TINDEX_ID: 10135 DATA_SPACE_TYPE: DATA_SPACE_TYPE_USER REPLICATION_GROUP_ID: 257 KEY_RANGE_REGION_ID: 7312 PROCESSLIST_ID: 2097282 NODE_ID: 2 NODE_NAME: node-1-002*************************** 2. row *************************** ENGINE: RocksDB ENGINE_LOCK_ID: 28681376014270466_0000279780000006 ENGINE_TRANSACTION_ID: 28681376014270466 THREAD_ID: 44 EVENT_ID: NULL OBJECT_SCHEMA: testdb OBJECT_NAME: test PARTITION_NAME: NULL SUBPARTITION_NAME: NULL INDEX_NAME: NULL OBJECT_INSTANCE_BEGIN: 140507882943448 LOCK_TYPE: KEY LOCK_MODE: Write LOCK_STATUS: GRANTED LOCK_DATA: NULL START_KEY: NULL END_KEY: 0000279780000006 EXCLUDE_START_KEY: 0 BLOCKING_TRANSACTION_NUM: 0BLOCKING_CHECK_READ_TRANSACTION_NUM: 0 READ_LOCKED_NUM: 0 TINDEX_ID: 10135 DATA_SPACE_TYPE: DATA_SPACE_TYPE_USER REPLICATION_GROUP_ID: 257 KEY_RANGE_REGION_ID: 7312 PROCESSLIST_ID: 1048704 NODE_ID: 1 NODE_NAME: node-1-001

·查询示例:

— 查询所有节点的悲观锁数量SELECT COUNT(*) FROM performance_schema.data_locks \\G– 查询所有节点上,replication group 257 的 key range region 7312 的所有的悲观锁信息(仅指定 key_range_region_id 也可查询,但效率较差,无法利用索引加速查询)SELECT * FROM performance_schema.data_locks WHERE replication_group_id = 257 AND key_range_region_id = 7312 \\G– 查询所有节点上,和 [0000279780000003, 0000279780000004] 有交集的所有悲观锁的信息SET @left = "0000279780000003";SET @right = "0000279780000004";SELECT * FROM performance_schema.data_locks WHERE (lock_type = 'KEY' AND @left <= end_key AND end_key <= @right) OR — 如果是单条 key 上的悲观锁,那么对应的 key 存储在 end_key 字段上,只要 end_key 在区间内即可 (lock_type = 'PRE_RANGE' AND @left < end_key AND (start_key < @right OR (NOT exclude_start_key and start_key = @right))) \\G — 如果是 key 区间上的悲观锁,那么需要根据 exclude_start_key,判断 [start_key, end_key) 或 (start_key, end_key) 和区间是否有交集– 查询所有节点上,testdb.test 表所有悲观锁的信息– 第一步:获取 testdb.test 的 tindex_idSELECT tindex_id FROM information_schema.statistics WHERE table_schema = 'testdb' AND table_name = 'test';– 第二步:使用第一步获取到的 tindex_id 查询锁信息SELECT * FROM performance_schema.data_locks WHERE tindex_id = 12345;– 或直接使用tableName databaseName查询相关悲观锁信息SELECT * FROM performance_schema.data_locks WHERE OBJECT_SCHEMA = 'testdb' AND OBJECT_NAME = 'test';– 查询所有节点上,事务 28681535313936395 所加所有悲观锁的信息SELECT * FROM performance_schema.data_locks WHERE engine_transaction_id = 28681535313936395 \\G– 查询所有节点上,阻塞了事务的所有悲观锁的信息SELECT * FROM performance_schema.data_locks WHERE blocking_transaction_num > 0 OR blocking_check_read_transaction_num > 0

·展示被阻塞的参与者信息:

下面展示了三个并发执行的 session。在这个例子中,session B 和 session C 的查询语句会被 session A 在表 t 上加的范围悲观锁阻塞。

·session A:

BEGIN;SELECT a FROM t FOR UPDATE;SELECT SLEEP(100);

·session B:

SELECT b FROM t FOR UPDATE;

·session C:

SELECT c FROM t FOR UPDATE;

此时,使用以下查询语句去查询哪些事务正在等待,以及它们正在被哪些事务阻塞。

SELECT blocking_engine_transaction_id, blocking_engine_lock_id, requesting_engine_transaction_id, requesting_engine_lock_id, tindex_id, replication_group_id, key_range_region_id FROM performance_schema.data_lock_waits \\G

结果如下:

blocking_engine_transaction_id blocking_engine_lock_id requesting_engine_transaction_id requesting_engine_lock_id tindex_id replication_group_id key_range_region_id
28687218495193155 28687218495193155_[00002819,0000281A) 28687218897846327 28687218897846327_[00002819,0000281A) 10265 257 103181
28687218495193155 28687218495193155_[00002819,0000281A) 28687218746851349 28687218746851349_[00002819,0000281A) 10265 257 103181
赞 (0)
上一篇 4天前
下一篇 4天前