首批通过分布式安全可靠测评,为关键业务系统打造
通过 DBLink 调用存储过程报错 -4019
更新时间:2026-07-31 09:11
问题现象
通过 DBLink 从一个数据库调用另一个数据库中的存储过程时,当存储过程参数数量较多,且调用方传入的参数值较大时,执行会报错:Size overflow,错误码为 -4019。该问题仅在通过 DBLink 调用时触发。在目标数据库本地直接执行相同的调用语句可以正常运行。问题可以稳定复现,且与参数列表的长度直接相关。

关键信息
错误日志信息如下:
[2026-02-02 09:20:28.865806] WDIAG [PL] print_dblink_ps_call_stmt (ob_pl_dblink_util.cpp:522) [653829] [T1044_L0_G0] [T1044] [xxxxx-xxxxx-xxxxx-xxxxx] [lt=4] [errcode=4019] fail to exec ::oceanbase::common::databuff_printf(buf, buf_len, pos,""%.*s"=>:in_basic_%ld", r_param->get_param_name().length(), r_param->get_param_name().ptr(), i + routine_info->get_param_start_idx())(ret=−4019)
问题原因
OceanBase 内核在通过 DBLink 调用远程存储过程时,会将调用语句拼接为一个匿名块(anonymous block)进行传输。在生成该匿名块的过程中,由于参数数量多、参数值较大,导致拼接后的字符串长度超过了内部硬编码的限制(1KB),从而触发 databuff_printf 函数返回 OB_SIZE_OVERFLOW 错误。
该 1KB 的长度限制在当前版本中为固定值,无法动态扩展,属于内核的功能性 BUG。
问题的风险及影响
SQL 执行报错(错误码 -4019)。
DBLink 调用失败。
存储过程无法远程执行。
影响依赖该远程调用的业务流程。
适用版本
OceanBase 数据库 V4.4.x 版本。
解决方法
应急处理:在远程存储过程所在的包中,定义一个重载的存储过程。将部分“固定可为空”或“不常用”的参数在重载过程的内部写死,不再由调用方显式传递,从而减少 DBLink 调用时的参数数量和序列化长度。
规避方式
在设计远程调用接口时,应避免通过 DBLink 传递过多参数。优先考虑将部分参数在远程包内部进行默认处理。
对于固定值或可通过其他方式推导的参数,通过重载过程在远程端写死,减少调用方需要传递的参数数量。
评估是否可以通过数据同步或本地执行等方式替代 DBLink 调用,以降低对高参数量远程调用的依赖。