功能
TDSTORE_PART_CTX用于展示集群中所有 hybrid 节点的 TDStore 上所有悲观锁等待信息。字段说明
字段名 | 类型 | 是否可以为 NULL | 描述 |
trans_id | bigint unsigned | 否 | 事务的唯一标识符。 |
state | varchar(16) | 否 | 参与者的状态。 RUNNING:参与者正处于读写阶段(即还未进入提交流程),且未被悲观锁阻塞。WAIT LOCK:参与者正处于读写阶段,且正在被悲观锁阻塞(此时 requested_lock_id 和 blocking_lock_id 一定不为 NULL)。COMMITTING:参与者正在尝试提交(并不意味着事务最终一定会提交成功)。ROLLING BACK:参与者正在回滚。 |
commit_state | varchar(10) | 否 | 参与者的提交状态。 INIT:参与者还未进入提交流程,或者已进入提交流程但正在同步 redo/prepare log。FAILED:参与者 prepare 失败。PREPARE:参与者 2PC prepare 成功。COMMIT:参与者 2PC commit 成功。ABORT:参与者 2PC prepare 成功,但在第二阶段 abort 了。CLEAR:参与者 commit 或 abort 后,即将释放参与者上下文(这个状态十分短暂)。状态的推进关系如下图所示: ![]() |
snapshot_ts | bigint unsigned | 否 | 参与者的快照读时间戳。 |
prepare_ts | bigint unsigned | 是 | 事务的 prepare 时间戳。事务的所有已经 prepare 了的参与者,prepare 时间戳相同。当参与者还未 prepare 的时候,值为 NULL。 |
commit_ts | bigint unsigned | 是 | 事务的 commit 时间戳。事务的所有已经 commit 了的参与者,commit 时间戳相同。当参与者还未 commit 的时候,值为 NULL。 |
is_replay | int | 否 | 如果值为 1,代表参与者正在通过 replay raft log 来推进 2PC,这一般发生在 Follower 上,但也有可能发生在 Leader 上任之前。 |
data_space_type | varchar(32) | 否 | 参与者对应的 data space。 DATA_SPACE_TYPE_USER代表参与者访问了用户表,DATA_SPACE_TYPE_SYSTEM代表参与者访问了系统表。 |
replication_group_id | bigint unsigned | 否 | 参与者对应的 replication group ID。 |
coordinator_replication_group_id | bigint unsigned | 是 | 协调者对应的 replication group ID。当参与者还未 prepare 的时候,值为 NULL。 |
expired_time | datetime | 否 | 参与者超时释放时间。 |
requested_lock_id | varchar(128) | 是 | 唯一标识正在申请的悲观锁,或者正在读取的 key 范围。格式参考 data_locks 表的 ENGINE_LOCK_ID 字段。如果没有正在等待悲观锁,值为 NULL。 |
blocking_lock_id | varchar(128) | 是 | 唯一标识正在等待的悲观锁。格式参考 data_locks 表的 ENGINE_LOCK_ID 字段。如果没有正在等待悲观锁,值为 NULL。 |
lock_wait_milliseconds | bigint unsigned | 否 | 累计等待悲观锁花费的耗时(单位:毫秒)。 |
single_keys_locked | bigint unsigned | 否 | 持有的单条 key 悲观锁的数量。 |
ranges_locked | bigint unsigned | 否 | 持有的 key 区间悲观锁的数量。 |
write_batch_size | bigint unsigned | 是 | write batch 大小(单位:字节)。 NULL 值代表着收集参与者信息的 bthread 没能获取到参与者的锁,因此没能获取到相关信息,此时大概率参与者正在等待某个悲观锁的释放。 |
lock_memory_usage | bigint unsigned | 是 | 悲观锁消耗的内存大小(单位:字节)。 NULL 值代表着收集参与者信息的 bthread 没能获取到参与者的锁,因此没能获取到相关信息,此时大概率参与者正在等待某个悲观锁的释放。 |
isolation_level | varchar(16) | 否 | 隔离级别。TDStore 仅支持两种隔离级别, REPEATABLE_READ和READ_COMMITTED。 |
submit_pending_log_num | bigint unsigned | 是 | 正在同步的 raft 日志数量。 NULL 值代表着收集参与者信息的 bthread 没能获取到参与者的锁,因此没能获取到相关信息,此时大概率参与者正在等待某个悲观锁的释放。 |
note | varchar(256) | 否 | 备注信息。 空字符串:无备注信息。 fail to acquire participant lock:获取参与者锁失败。这种情况下,部分字段(如 write_batch_size )的值为 NULL。 |
node_name | varchar(256) | 是 | 开启该事务参与者的 SQLEngine 节点名称。 |
thread_id | bigint unsigned | 否 | 运行该事务参与者的线程 ID。这是 Performance Schema 的内部线程 ID,在 Performance Schema 的生命周期内唯一,可用于可靠地关联 Performance Schema 的各类事件表。 |
sql_session_id | bigint unsigned | 否 | 对应开启该事务参与者的会话连接(session)ID。 |
示例
输出示例:
tdsql [(none)]> SELECT * FROM information_schema.tdstore_part_ctx LIMIT 3\\G*************************** 1. row ***************************trans_id: 28707112062290305state: RUNNINGcommit_state: INITsnapshot_ts: 28707112062290305prepare_ts: NULLcommit_ts: NULLis_replay: 0data_space_type: DATA_SPACE_TYPE_USERreplication_group_id: 257coordinator_replication_group_id: NULLexpired_time: 2024-03-22 11:23:37requested_lock_id: NULLblocking_lock_id: NULLlock_wait_milliseconds: 0single_keys_locked: 4ranges_locked: 0write_batch_size: 3219lock_memory_usage: 1008isolation_level: REPEATABLE_READsubmit_pending_log_num: 0note:node_name: node-1-001thread_id: 65sql_session_id: 1048736*************************** 2. row ***************************trans_id: 28707112062290205state: COMMITTINGcommit_state: PREPAREsnapshot_ts: 28707112062290205prepare_ts: 28707112062290205commit_ts: 28707112062290368is_replay: 0data_space_type: DATA_SPACE_TYPE_USERreplication_group_id: 257coordinator_replication_group_id: 257expired_time: 2024-03-22 11:23:37requested_lock_id: NULLblocking_lock_id: NULLlock_wait_milliseconds: 0single_keys_locked: 7ranges_locked: 0write_batch_size: NULLlock_memory_usage: NULLisolation_level: REPEATABLE_READsubmit_pending_log_num: NULLnote: fail to acquire participant locknode_name: node-1-001thread_id: 65sql_session_id: 1048736*************************** 3. row ***************************trans_id: 28707111676413643state: LOCK WAITcommit_state: INITsnapshot_ts: 28707111676413643prepare_ts: NULLcommit_ts: NULLis_replay: 0data_space_type: DATA_SPACE_TYPE_USERreplication_group_id: 257coordinator_replication_group_id: NULLexpired_time: 2024-03-22 11:23:14requested_lock_id: 28707111676413643_0000279C80018657blocking_lock_id: 28707111676413316_0000279C80018657lock_wait_milliseconds: 0single_keys_locked: 4ranges_locked: 0write_batch_size: NULLlock_memory_usage: NULLisolation_level: REPEATABLE_READsubmit_pending_log_num: NULLnote: fail to acquire participant locknode_name: node-1-002thread_id: 65sql_session_id: 1048704
查询示例:
-- 查询当前节点上参与者的数量SELECT COUNT(*) FROM information_schema.tdstore_part_ctx \\G-- 查询当前节点上,replication group 257 的参与者信息SELECT * FROM information_schema.tdstore_part_ctx WHERE replication_group_id = 257 \\G-- 查询当前节点上正在提交流程中的参与者信息SELECT * FROM information_schema.tdstore_part_ctx WHERE state = 'COMMITTING' \\G-- 查询当前节点上执行时间超过 5s 的事务的信息(目前 trans_id 右移 24 位得到的结果,是事务开始时间的 unix timestamp)SELECT * FROM information_schema.tdstore_part_ctx WHERE trans_id >> 24 < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 5 SECOND)) \\G-- 查询当前节点上 write batch 大小超过 128 MB 的大事务的信息(事务写过的数据,存储于 write batch 中)SELECT * FROM information_schema.tdstore_part_ctx WHERE write_batch_size > 128 * 1024 * 1024 \\G
