业务系统执行某条sql的时候错误占比100%,sql返回码是4016

【 使用环境 】生产环境
【 OB or 其他组件 】OB
【 使用版本 】4.3.2.1
【问题描述】业务执行某条sql的错误占比100%,返回码为4016。但是通过客户端执行该sql能正常执行。通过trace_id查询的日志如下:
OB_LOG_ob_pro_3_10.252.210.166_20250417151613_20250417161613.zip (4.1 KB)

查询sql如下:

SELECT
  /*+READ_CONSISTENCY(WEAK)*/
  DISTINCT eb.billaccount_id,
  eb.billaccount_code,
  eb.billaccount_name,
  eb.billaccount_state,
  eb.prv_id,
  eb.prv_sname,
  eb.preg_id,
  eb.preg_name,
  eb.reg_id,
  eb.reg_name,
  eb.auditing_state,
  eb.billaccount_type,
  eb.calc_multi,
  eb.plan_date,
  eb.use_startdate,
  eb.billaccount_remarke,
  eb.billaccount_note,
  eb.search_keywords,
  eb.delete_reason,
  eb.cost_center_name,
  ecb.elecontract_id,
  ecb.relation_state,
  dc.contract_id,
  dc.contract_code,
  dc.contract_name,
  dc.data_from,
  IF(
    dc.data_from = ?,
    dc.contract_status,
    dc.contract_state
  ) AS contract_status,
  dc.contract_startdate,
  dc.contract_enddate,
  db.baseresource_id,
  db.baseresource_code,
  db.baseresource_name,
  db.baseresource_cuid,
  db.room_owner,
  db.room_property,
  IF(
    db.baseresource_type = ?,
    dbs.service_site_type,
    db.service_site_type
  ) AS service_site_type,
  db.baseresource_type,
  db.equipment_power,
  db.tower_equipment_power,
  db.airconditioner_power,
  db.baseresource_state,
  db.tower_site_code,
  de.meter_id,
  de.meter_code,
  de.account_number,
  de.meter_state,
  de.is_share,
  de.electricmeter_multiply,
  sd.dep_name,
  ec.supply_method,
  ec.paymentperiod_id,
  ec.price_type,
  ec.loss_type,
  ec.is_include_all,
  ec.elecontract_price,
  ec.flat_price,
  ec.peak_price,
  ec.valley_price,
  ec.top_price,
  ec.contract_total_amount,
  s.supplier_code,
  s.supplier_name,
  dd.contract_code AS contract_code1,
  dd.contract_name AS contarct_name1,
  dd.contract_status AS contarct_state1,
  ebe.cmcc_ratio,
  eb.cost_center,
  eb.cost_center_name,
  eb.tele_cmn_serv_sys_ratio,
  eb.tele_cmn_serv_actual_ratio,
  eb.tele_cmn_serv_remark,
  eb.last_billamount_startdate,
  eb.last_billamount_enddate,
  eb.basesite_ele_share_startdate
FROM
  ele_billaccount eb
  LEFT JOIN ele_billaccountbaseresource ebb ON eb.billaccount_id = ebb.billaccount_id
  AND ebb.relation_state = ?
  LEFT JOIN dat_baseresource db ON db.prv_id = ?
  AND db.baseresource_id = ebb.baseresource_id
  LEFT JOIN ele_baseresourceelectricmeter ebe ON db.baseresource_id = ebe.baseresource_id
  AND ebe.relation_state = ?
  AND ebe.billaccount_id = eb.billaccount_id
  LEFT JOIN dat_electricmeter de ON ebe.meter_id = de.meter_id
  LEFT JOIN ele_contractbillaccount ecb ON eb.billaccount_id = ecb.billaccount_id
  AND ecb.relation_state = ?
  LEFT JOIN ele_contract ec ON ec.elecontract_id = ecb.elecontract_id
  LEFT JOIN dat_contract dc ON dc.contract_id = ec.contract_id
  LEFT JOIN dat_contract dd ON dc.contract_id_rel = dd.contract_id
  LEFT JOIN dat_supplier s ON ec.supplier_id = s.supplier_id
  LEFT JOIN sys_department sd ON eb.belong_dept = sd.dep_id
  LEFT JOIN dat_basesite dbs ON dbs.basesite_id = db.basesite_id
  LEFT JOIN sys_user u ON eb.stay_auditing_user_id = u.user_loginname
  AND u.user_state = ?
WHERE
  eb.prv_id = ?
  AND eb.is_special = ?
  AND eb.billaccount_state IN (?, ?, ?)
  AND eb.reg_id IN (?, ?, ?, ?, ?, ?, ?, ?, ?)
  AND eb.auditing_state IN (?, ?, ?, ?, ?, ?, ?, ?)
  AND eb.billaccount_type IN (?, ?, ?, ?)

【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

根据您提供的信息,SQL 返回码为 4016,但在检索到的文档片段中并未找到与该错误码相关的描述。以下是对问题的分析和可能的解决方案:


1. 问题分析

  • SQL 执行环境差异:您提到通过客户端执行该 SQL 能正常运行,但在业务系统中执行时返回错误码 4016。这可能表明问题与以下因素有关:

    • 数据一致性(如读一致性级别设置不同)。
    • 参数绑定值在业务系统中与客户端存在差异。
    • 网络或分布式事务相关问题。
  • 日志分析:通过 trace_id 查询的日志未显示明显的错误信息,且 obdiag 分析结果显示无异常 (PASS)。这可能意味着问题并非由底层数据库日志直接记录,而是与业务逻辑或参数绑定相关。

  • 错误码缺失:当前文档库中未包含关于错误码 4016 的具体描述,因此无法直接从文档中获取解决方法。


2. 可能的原因

结合您的问题描述和已知信息,以下是可能导致问题的原因:

  • 参数绑定问题:SQL 中使用了多个 ? 占位符,如果业务系统传递的参数值与预期不符(如类型不匹配或值为空),可能会导致执行失败。
  • 读一致性设置:SQL 中指定了 /*+READ_CONSISTENCY(WEAK)*/ 提示,但业务系统可能未正确解析或应用该提示,导致查询失败。
  • 分布式事务问题:虽然错误码未明确指向分布式事务,但复杂的多表联结查询可能涉及多个分区或节点,网络不稳定或节点状态变化可能导致执行失败。
  • 版本兼容性问题:您使用的版本为 4.3.2.1,某些功能或行为可能与早期版本存在差异,需确认是否为已知问题。

3. 建议的排查步骤

为了进一步定位问题,请按照以下步骤进行排查:

(1) 检查参数绑定值

  • 确认业务系统传递的参数值是否与 SQL 预期一致。
  • 尝试将参数值显式替换为实际值后重新执行 SQL,观察是否仍报错。

(2) 验证读一致性设置

  • 暂时移除 /*+READ_CONSISTENCY(WEAK)*/ 提示,观察 SQL 是否能正常执行。
  • 如果移除后正常,则可能是读一致性设置与业务系统配置冲突。

(3) 检查分布式事务状态

  • 确认业务系统是否涉及分布式事务,以及事务状态是否正常。
  • 如果涉及分布式事务,可参考文档片段 1 和文档片段 8 的内容,检查是否存在网络不稳定或节点宕机的情况。

(4) 升级或回滚版本

  • 如果问题仅出现在特定版本中,建议联系 OceanBase 技术支持团队,确认是否存在已知问题或补丁。

4. 结论

抱歉,无法从检索到的文档中找到关于错误码 4016 的具体描述。基于上述分析,建议优先检查参数绑定值和读一致性设置,并尝试通过简化 SQL 或调整业务逻辑定位问题。

如果问题仍未解决,建议联系 OceanBase 的人工答疑团队,提供更详细的日志和诊断信息以获取进一步支持。

详情请参考:

  1. 4500 ~ 4999
  2. 6000 ~ 6999
  3. 7000 ~ 7999
  4. 0001 ~ 3999
  5. 10000 ~ 12000

(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)

先把SQL工作区调大试试,实在不行就换最新版本,最新版本好像有这方面的优化。

1 个赞

生产环境不敢随便升级啊,万一升级升挂了就玩完了,容灾集群还没有建好

是什么场景呢。20%很高吗?

是java程序么?还是其他程序执行的报错?业务程序是通过obproxy么?如果有obproxy 版本号发一下
如果能复现 如果程序通过obproxy连接的话 提供obproxy.log的日志和observer.log日志 在trace_id抓取一下observer.log的日志