【 使用环境 】生产环境
【 OB or 其他组件 】
OB
【 使用版本 】
v3.1.2
【问题描述】
背景:现在想查某一行数据可能涉及变更了多次,想知道每一次变更的实际更新时间,只能通过解析clog的方式得知数据的实际成功写入的时间点
问题:不知道某一行数据落在哪一台机器上,建表时使用的是partitions by hash(col1,col2)这样的方式,有办法定位到这行数据在哪台机器上吗?
【复现路径】问题出现前后相关操作
【问题现象及影响】
【附件】
【 使用环境 】生产环境
【 OB or 其他组件 】
OB
【 使用版本 】
v3.1.2
【问题描述】
背景:现在想查某一行数据可能涉及变更了多次,想知道每一次变更的实际更新时间,只能通过解析clog的方式得知数据的实际成功写入的时间点
问题:不知道某一行数据落在哪一台机器上,建表时使用的是partitions by hash(col1,col2)这样的方式,有办法定位到这行数据在哪台机器上吗?
【复现路径】问题出现前后相关操作
【问题现象及影响】
【附件】
我的理解应该至少需要两个步骤才能找打:
第一步:确定这一行记录在哪个分区。
使用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 为空,表示没有用到表分组。
这样应该能找到某一行记录所在的机器了。
如果要追踪每一笔修改的时间和节点信息,最好的做法就是近实时的把OB的 gv$sql_audit记录取走放到专门的数据库里进行后期分析和加工。企业版里这个数据被OCP抽到OCP的性能数据库里进行分析。
这个数据信息非常丰富,包含时间,节点,各环节耗时,等待事件。可以在上面做全链路跟踪,性能问题分析,智能化诊断等等。