首批通过分布式安全可靠测评,为关键业务系统打造
Location Cache 问题排查
更新时间:2024-06-17 03:21
前置条件
在开始排查前,请明确以下信息:
- 确认具体出现问题的 server ?
- 确认具体什么时间点出现的问题 ?
- 确认有问题的 PKey,即
table_id和partition_id的具体值。
适用版本
OceanBase 数据库 V3.2.X 及之前的版本。
排查步骤
排查主副本是否上任或无主。 执行如下命令,查看副本是否有主以及 leader 所在机器、上任时间。
select * from __all_virtual_clog_stat where table_id=xxx and partition_idx=xxx说明
若虚拟表不可查,可以用 PKey 去 election.log 日志文件中查询,确认那段时间是否发生无主选举(leader revoke)或者有主改选(leader changed),确认 leader 是否上任(on_leader_takeover),确认 leader 是谁。
确认 leader 是否汇报。
执行如下命令,查看副本何时汇报到
meta表中。如果__all_virtual_meta_table表中查不到,可以查__all_root_table表。select * from __all_virtual_meta_table where table_id=xxx and partition_id=xxx;若查询不到结果,通过
grep命令在 observer.log 中搜索相关日志,找到最早 role 为 1,且不为 [Y0-0000000000000000] 的trace_id。(table_id,partition_id替换为具体数值)。grep "fill partition replica.*_table_id_.*_partition_id_" observer.log若找不到上述日志,根据 table_id 分析是系统表还是用户表。若 pure_id < 10000 为系统表,否则为用户表。 计算公式如下:
pure_id = table_id & (~(0xFFFFFFFFFFFFFFFF<<40))若是系统表,执行如下命令。
grep "insert into __all_root_table.*_table_id_.*_partition_id_" observer.log若是用户表,执行如下命令。
grep "insert into __all_tenant_meta_table.*_table_id_.*_partition_id_" observer.log
用户表(V1.4.x 版本将
__all_tenant_meta_table改为__all_meta_table。)grep "insert into __all_tenant_meta_table.*_table_id_.*_partition_id_" observer.log展开
trace_id查看汇报是否成功。若汇报未成功,找到下一个满足条件的trace_id,直至找到最早的汇报成功日志,确定汇报成功的时间点。若汇报一直重试并报错,需根据错误码排查inner_sql失败的问题。
确认 location_cache 刷新。
执行如下命令,可以找到目标 partition 的 location_cache 刷新日志。
grep "partition_location_cache.*table_id.*partition_id" observer.log/rootservice.logRPC 刷新日志会被限流及限频次,一般认为 RPC 刷新没报错就是成功的。
若 RPC 刷新失败,会走 SQL 刷新 location_cache,故同一个
trace_id可以先忽略 RPC 刷新失败的报错,看最终 location_cache 是否通过inner_sql刷新成功。
若按照流程排查无果,可联系技术支持进一步定位问题原因。