oceanbase的社区版本4.3.1统计某个库的某个表正在运行的事务数量的sql是什么,有兼容方式吗,不同版本都不一样
根据文档库中的信息,OceanBase 数据库提供了系统视图来查询事务相关的统计信息。以下是对您问题的详细解答:
1. 查询正在运行的事务数量
在 OceanBase 社区版 4.3.1 中,可以通过查询 GV$OB_TRANSACTION
系统视图来获取当前正在运行的事务信息。具体 SQL 示例如下:
SELECT COUNT(*) AS running_transactions_count
FROM oceanbase.GV$OB_TRANSACTION
WHERE tenant_id = <目标租户ID> AND table_id = <目标表ID>;
-
tenant_id
:指定目标租户的 ID。 -
table_id
:指定目标表的 ID。可以通过查询__all_table
系统表获取表的table_id
。
例如,查询某个表的 table_id
:
SELECT table_id FROM oceanbase.__all_table WHERE table_name = '<表名>';
2. 兼容方式
不同版本的 OceanBase 数据库可能对事务统计的视图和字段有所调整,但核心逻辑保持一致。如果需要兼容多个版本,可以尝试以下通用方法:
方法一:通过 GV$OB_SQL_AUDIT
统计
GV$OB_SQL_AUDIT
视图记录了 SQL 的执行审计信息,可以通过过滤条件统计当前正在运行的事务数量。示例如下:
SELECT COUNT(*)
FROM oceanbase.GV$OB_SQL_AUDIT
WHERE tenant_id = <目标租户ID>
AND sql_id = <目标SQL_ID>
AND is_running = 1;
-
is_running
:标识事务是否正在运行(1 表示正在运行)。
方法二:通过 GV$OB_TRANSACTION
统计
如果目标版本支持 GV$OB_TRANSACTION
视图,则可以直接使用该视图进行统计。这是推荐的方式,因为它是专门为事务统计设计的。
3. 注意事项
-
租户隔离:确保查询时指定正确的
tenant_id
,以避免跨租户数据干扰。 -
表 ID 获取:如果不确定目标表的
table_id
,可以通过查询__all_table
系统表获取。 - 版本差异:不同版本的 OceanBase 数据库可能对视图字段有所调整,请参考对应版本的官方文档确认字段名称和含义。
4. 总结
- 如果您的目标是统计某个库的某个表正在运行的事务数量,建议优先使用
GV$OB_TRANSACTION
视图。 - 如果需要兼容多个版本,可以结合
GV$OB_SQL_AUDIT
和其他相关视图实现统计。
如果您需要进一步的帮助,请提供更多上下文信息,例如具体的租户 ID 或表名。
详情请参考:
麻烦提供一下你之前查询使用的哪些表,这边看看内部表是否可以涵盖
SELECT COUNT(*) AS active_trans_count
FROM oceanbase.GV$OB_SQL_AUDIT a
WHERE a.tenant_id = (
SELECT tenant_id
FROM oceanbase.__all_tenant
WHERE tenant_name = ‘ob_icm’ – 租户名
)
AND query_sql LIKE ‘%sys_app%’
AND state = ‘ACTIVE’;目前是使用这个,但是state字段值不对,没找到哪个值可以去判断事务正在运行
select * from oceanbase.__all_virtual_trans_stat;
select * from oceanbase.__all_virtual_trans_lock_stat;
select * from GV$OB_TRANSACTION_SCHEDULERS;
您发起事务,看下这几个表
obdiag 的一键洞察可以试试,对应的文档: https://www.oceanbase.com/docs/common-obdiag-cn-1000000002488237
对应的SQL:
https://github.com/oceanbase/obdiag/blob/master/plugins/display/tasks/observer/long_transaction.yaml
SQL 记录的是执行完的SQL,查询这个没啥意思,正在运行的事务需要查询 gV$OB_TRANSACTION_PARTICIPANTS