首批通过分布式安全可靠测评,为关键业务系统打造
通过 DBLink 去远端执行 SQL 语句时触发了嵌套 PL/SQL,导致执行 120s 后就会报 -4012 超时
更新时间:2026-06-03 03:01
本文主要介绍通过 DBLink 去远端执行 SQL 语句时,该 SQL 语句触发了嵌套的 PL 存储过程,导致执行超过 120s 后会报错 -4012 超时的具体原因及解决方法。
问题现象
在本地通过 DBLink 去远端执行全表 UPDATE 时,在远端的表上定义了一个 UPDATE 型 TRIGGER,该 TRIGGER 定义中会同步执行一系列相关的业务逻辑且耗时较长,导致在 120s 后出现超时报错 -4012:
UPDATE /*+ QUERY_TIMEOUT(3600000000) */ TBL1@ob_dblink1 SET CODE_VALUE = 'A'
-- 失败原因
ErrorCode = 600, SQLState = HY000, Details = OBE-00600: internal error code, arguments: -5975, dblink remote error code: 600, remote error msg: OBE-00600: internal error code, arguments: -4012, Timeout, query has reached the maximum query timeout: 3600000000(us), maybe you can adjust the session variable ob_query_timeout or query_timeout hint, and try again. at procedure PKG1.PRO_TEST1 , line :
详细说明
DBLink 连接默认的超时时间为 120s,且该配置项目前是硬编码的,不支持调整,因为从设计上期望通过 DBLink 向远端发送的 SQL 语句都会带上 timeout hint,所以预期这个系统变量不会被实际使用到。
hint 级 timeout 的优先级 > timeout 系统变量,只要在 SQL 语句中指定了 timeout hint,那么 timeout 系统变量就不会生效。
通过 DBLink 去远端执行 SQL 语句时,会根据当前剩余的超时时间,在 SQL 中加上 timeout hint,比如用户设置了 timeout 变量等于 1 小时,现在已经执行半小时了,那么通过 DBLink 向远端发的 SQL 语句里就会加上
query_timeout(1800000000)的 hint。嵌套 PL 内的 SQL 语句因为没有添加 query_timeout hint,会重新计算超时,超时计算逻辑为
min(current_time + query_timeout,顶层语句超时,因为 DBLink 连接默认的 query_timeout 是硬编码的 120s,在当前例子中总是比顶层语句的超时 hint 小,所以会取 120s 超时,最终导致远端语句超时报错。
因此,如果通过 DBLink 去远端间接执行耗时较长的嵌套 PL/SQL 语句时,在执行超过 120s 后,最外层会抛出超时错误 -4012。
适用版本
OceanBase 数据库 V3.x、V4.x 版本。
规避方式
采用在远端的嵌套语句里面通过 timeout hint 指定超时阈值,绕过该问题。