首批通过分布式安全可靠测评,为关键业务系统打造
如何定位内部 SQL 导致的 ret=-5001 报错
更新时间:2026-05-29 08:46
问题现象
在执行业务 SQL 过程中,有时候会遇到 Parse error 或者 syntax error,但是引起报错的并不是业务 SQL 本身。这种情况下,往往是执行业务 SQL 执行过程中调用了 inner sql,但是 inner sql 执行遇到诸如反拼失败的错误,最终导致了业务 SQL 执行失败。
案例一:
业务执行 SQL,偶现报错 -4016,根据报错 trace_id 定位到报错来自动态采样 SQL 在解析分区键值时,反拼动态采样 SQL 报错 syntax error,最终执行报错 -5001。

案例二:
系统升级后,执行旁路导入报错 ERROR 1064 (42000): Parse error,但是同样的 SQL 在旧版本执行没有问题。
关键诊断信息
报错为 syntax error 或者 parse error 但是 SQL 本身没有语法问题。这时需要定位到具体出错的 SQL,之后可以单独执行出错的 SQL,验证是否有语法错误。
由于报错的 inner SQL 不一定是在相同的 trace_id 下执行,这时可以通过过滤 ret=\-5001 定位到最开始解析报错的 error。
inner sql 执行返回 syntax error,往往是 BUG,确定可以重现后,可以查看是否有已知 BUG 或者反馈给 OceanBase 数据库技术支持团队获取帮助。
问题原因
案例一:
动态采样的 SQL 会显式指定裁剪后的分区,当分区名称为纯数字时,需要进行分区转义。默认反拼语句对数字类型的分区键没有加上引号。此外,分区名称需要转义符或者是非 utf8 字符集时,也会报错。
简化复现 case。
obclient [test]> CREATE TABLE t014 (
c1 bigint(20),
c2 bigint(20)
)
partition by list columns(c1)
(partition `1`values in (1),
partition `2` values in (2),
partition `3` values in (3));
Query OK, 0 rows affected (4.294 sec)
obclient [test]> select /*+ dynamic_sampling(1) */ * from t014 where c1 = '1' ;
Empty set (0.123 sec)
查询中通过添加动态采样 Hint,触发动态采样。对应日志报错如下。
[2025-01-04 21:20:21.611949] INFO [SQL.PARSER] parse_sql (ob_parser.cpp:952) [62516][T1004_L0_G0][T1004][xxxxx-xxxxx-xxxxx-xxxxx] [lt=5] fail
ed to parse stmt as sql(stmt=SELECT /*+ NO_REWRITE NO_PARALLEL DYNAMIC_SAMPLING(0) QUERY_TIMEOUT(996439) OPT_PARAM('USE_DEFAULT_OPT_STAT','TRUE') */ COUNT(*), SUM(CASE WHEN (`c1` =
'1') THEN 1 ELSE 0 END) FROM `test`.`t014` partition( 1), ret=-5001)
案例二:
报错的 inner SQL 不在相同的 trace_id 下执行,这时可以通过过滤 ret=\-5001 定位到最开始解析报错的 error。
该问题是因为旁路导入重建索引时,内部拼的补数据 SQL 没有对分区名做引号处理,导致报错。
observer.log:[2025-01-07 20:28:16.303722] INFO [SQL.PARSER] parse_sql (ob_parser.cpp:971) [69509][T1004_L5_G0][T1004][xxxxx-xxxxx-xxxxx-xxxxx] [lt=23] failed to parse stmt as sql(stmt_str=INSERT /*+ monitor enable_parallel_dml parallel(16) opt_param('ddl_execution_id', 1) opt_param('ddl_task_id', 399706) opt_param('enable_newsort', 'false') use_px */INTO `test`.`__idx_500148_hc_other_hold_hst_01l` PARTITION(20241011,20241230,20241231,20250102,20250103,20250106,20250107)(`data_date`, `no`, `archive_key`) SELECT /*+ index(`__hidden_500148_500055table_schema` primary) */ `data_date` AS `data_date`, `no` AS `no`, `archive_key` AS `archive_key` from `test`.`__hidden_500148_500055table_schema` PARTITION(20241011,20241230,20241231,20250102,20250103,20250106,20250107) as of snapshot 1736252893399717000 order by 1, 2, 3, ret=-5001)
问题的风险及影响
内部 SQL 执行失败影响业务 SQL 的执行。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 MySQL 租户,对于 Oracle 租户无影响。
影响版本
OceanBase 数据库 V4.2.x 系列中 V4.2.2 GA(oceanbase-4.2.2.0-100000082024011317)及之后版本。
OceanBase 数据库 V4.2.x 系列中 V4.3.2(oceanbase-4.3.2.0-100000442024071321)及之后版本。
解决方法
案例一:
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库 V4.2.1 BP10 Hotfix5(oceanbase-4.2.1.10-110050012025011614)及之后版本、V4.2.5 BP2(oceanbase-4.2.5.2-102000122025011711)。
案例二:
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库 V4.2.5 BP2(oceanbase-4.2.5.2-102000122025011711)及之后版本、V4.3.5 BP1(oceanbase-4.3.5.1-101000292025030623)及之后版本。
规避方式
案例一:
关闭动态采样 /*+dynamic_sampling(0)*/。
案例二:
不使用旁路导入。