首批通过分布式安全可靠测评,为关键业务系统打造
SQL 中含有 IN 的参数较多,返回报错 -5066 的原因及解决方法
更新时间:2026-05-29 08:46
问题现象
SQL 执行返回 errcode=-5066,根据 trace_id 可以看到 SQL 解析过程中,在 generate_plan_tree 阶段,包含大量的 IN 参数,最终报错 -5066。
问题原因
SQL 执行返回 errcode=-5066,根据 trace_id 可以看到 SQL 解析过程中,在 generate_plan_tree 阶段,包含大量的 IN 参数,最终报错 -5066。根据 trace_id,可以同时定位到 disconnect_state=4,为 TCP disconnect 客户端主动断开连接。

此时,可以查看超时相关参数,验证是否存在超时情况。 对应的JDBC连接串中,可以看到 connectTimeout/socketTimeout 均为 600000(10 mins)。
useUnicode=true&rewriteBatchedStatements=true&connectionCollation=utf8mb4_general_ci&socketTimeout=600000&connectTimeout=600000&serverTimezone=Asia/Shanghai&allowMultiQueries=true&characterEncoding=utf-8
另外,可以结合 trace 日志,查看开始/结束时间,是否为设置的超时时间,也可以通过 sql audit 中获取对应 trace 的开始/结束时间进一步验证超时导致的最终报错。
disconnect_state 具体含义:
0 DIS_INIT, // INIT
1 NORMAL_QUIT, // QUIT.
2 NORMAL_KILL_SESSION, // KILL SESSION.
3 SERVER_FORCE_DISCONNECT, // force_disconnect.
4 CLIENT_FORCE_DISCONNECT, // TCP disconnect.
关键信息
查看 session 断掉连接的具体原因/断连的发起者。
查看 timeout 相关参数。
对于大 IN SQL,注意参数的数量。
问题的风险及影响
SQL 执行报错,解析超时。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
适用版本
OceanBase 数据库 V4.x 版本。
解决方法
针对大 IN 解析超时的问题,可以通过设置 set _inlist_rewrite_threshold,减少大 IN 解析的数量来规避。
具体可参见:关于大 inlist 优化的说明和验证 。
规避方式
设置合理的超时时间和大 IN 参数的个数。