如何查询某一行数据落在哪一台机器

【 使用环境 】生产环境
【 OB or 其他组件 】
OB
【 使用版本 】
v3.1.2
【问题描述】
背景:现在想查某一行数据可能涉及变更了多次,想知道每一次变更的实际更新时间,只能通过解析clog的方式得知数据的实际成功写入的时间点
问题:不知道某一行数据落在哪一台机器上,建表时使用的是partitions by hash(col1,col2)这样的方式,有办法定位到这行数据在哪台机器上吗?
【复现路径】问题出现前后相关操作
【问题现象及影响】

【附件】

1 个赞

我的理解应该至少需要两个步骤才能找打:

第一步:确定这一行记录在哪个分区。
使用explain select * from x where column1=‘xxx’;
执行计划中以下部分能看到具体分区名。

 access([t1.c2], [t1.c1]), partitions(p0)
 EXPLAIN SELECT * FROM t1,t2 WHERE t1.c2=t2.c2 AND t2.c1 > 4\G
*************************** 1. row ***************************
Query Plan: =======================================
|ID|OPERATOR   |NAME|EST. ROWS|COST   |
---------------------------------------
|0 |HASH JOIN  |    |9801000  |5933109|
|1 | TABLE SCAN|t2  |10000    |6219   |
|2 | TABLE SCAN|t1  |100000   |68478  |
=======================================

Outputs & filters: 
-------------------------------------
0 - output([t1.c1], [t1.c2], [t2.c1], [t2.c2]), filter(nil), 
    equal_conds([t1.c2 = t2.c2]), other_conds(nil)
1 - output([t2.c2], [t2.c1]), filter(nil), 
    access([t2.c2], [t2.c1]), partitions(p0)
2 - output([t1.c2], [t1.c1]), filter(nil), 
    access([t1.c2], [t1.c1]), partitions(p0)

第二步:确定分区主副本所在机器。
执行以下SQL:查看某个实例(租户)下库表分区主副本的位置和大小

SELECT  t.tenant_id, a.tenant_name, t.table_name, d.database_name,  tg.tablegroup_name , t.part_num , t2.partition_id, t2.ZONE, t2.svr_ip , round(t2.data_size/1024/1024/1024) data_size_gb
	, a.primary_zone	  , IF(t.locality = '' OR t.locality IS NULL, a.locality, t.locality) AS locality	
FROM oceanbase.__all_tenant AS a  
	JOIN oceanbase.__all_virtual_database AS d ON ( a.tenant_id = d.tenant_id  ) 
	JOIN oceanbase.__all_virtual_table AS t  ON (t.tenant_id = d.tenant_id AND t.database_id = d.database_id)	
	JOIN oceanbase.__all_virtual_meta_table t2 ON (t.tenant_id = t2.tenant_id AND (t.table_id=t2.table_id OR t.tablegroup_id=t2.table_id)  AND t2.ROLE IN (1) )
	LEFT JOIN oceanbase.__all_virtual_tablegroup AS tg ON (t.tenant_id = tg.tenant_id and  t.tablegroup_id = tg.tablegroup_id) 
WHERE a.tenant_id IN (1006 ) AND  t.table_type IN (3)  
-- AND d.database_name = 'T_FUND60PUB' 
-- and table_name in ('BMSQL_HISTORY')
ORDER BY t.tenant_id, tg.tablegroup_name, d.database_name, t.table_name, t2.partition_id
;
备注:

role : 1 表示 主副本; 2 表示备副本
tablegroup_name 为空,表示没有用到表分组。

这样应该能找到某一行记录所在的机器了。

2 个赞

如果要追踪每一笔修改的时间和节点信息,最好的做法就是近实时的把OB的 gv$sql_audit记录取走放到专门的数据库里进行后期分析和加工。企业版里这个数据被OCP抽到OCP的性能数据库里进行分析。
这个数据信息非常丰富,包含时间,节点,各环节耗时,等待事件。可以在上面做全链路跟踪,性能问题分析,智能化诊断等等。