首批通过分布式安全可靠测评,为关键业务系统打造
OBServer core 在 ObSSTableMultiVersionRowMultiGetter::inner_get_next_row
更新时间:2026-06-04 09:56
问题现象
指定逆序多主键查询,且存在多版本 SSTable,并且当前的读版本小于转储 SSTable 的 snapshot version 时(某一个只读事务,拿了读版本,过了一段时间再去读数据,中间发生了转储),可能触发 core。
执行计划如下:
explain select * from t1 as of snapshot 1686831938362055 where c1 in (0,10,20,30,40) order by c1 desc;
+--------------------------------------------------------------------------------------+
| Query Plan |
+--------------------------------------------------------------------------------------+
| ================================================ |
| |ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)| |
| ------------------------------------------------ |
| |0 |TABLE GET|t1(Reverse)|5 |12 | |
| ================================================ |
| Outputs & filters: |
| ------------------------------------- |
| 0 - output([t1.c1]), filter(nil), rowset=256 |
| access([t1.c1]), partitions(p0) |
| is_index_back=false, is_global_index=false, |
| range_key([t1.c1]), range[0 ; 0], [10 ; 10], [20 ; 20], [30 ; 30], [40 ; 40], |
| range_cond([t1.c1 IN (0, 10, 20, 30, 40)]) |
+--------------------------------------------------------------------------------------+
12 rows in set (0.05 sec)
- 指定 as of snapshot 让读版本小于转储 sstable 的 snapshot version。
- TABLE GET 表明是主键查询。
- range 多个表明是多个主键查询。
- Reverse 表明是逆序。
问题原因
ObSSTableMultiVersionRowMultiGetter 没有正确处理多个 range 的 range_idx。
问题的风险及影响
导致 OBServer core。
影响版本
OceanBase 数据库 V2.2.77 BP17 Hotfix2 之前的所有版本。
解决方法及规避方式
- 升级到问题已修复版本,目前已修复的版本包含 OceanBase 数据库 V2.2.77 BP17 Hotfix2 及之后的版本。
- 本身遇到概率很小,并且读版本小于转储 SSTable 的 snapshot version 可能也是瞬时的状态,只能根据 core 找到对应的SQL,禁掉 SQL。