首批通过分布式安全可靠测评,为关键业务系统打造
内部 SQL 返回 4018 触发 DDL 提前返回结果给客户端,实际未执行完成的问题
更新时间:2026-07-17 07:16
问题现象
客户端 DDL 语句提前返回(之前某个 DDL 的失败错误码),实际 DDL 还没执行完成,如执行
truncate table客户端返回成功后,表上还有数据。影响的 DDL 有 drop/truncate partition/table/database、加删除索引/约束、改列类型等。
关键诊断信息
事后诊断
-- SYS 租户下查询
select tenant_id, task_id, count(*) from __all_virtual_ddl_error_message where target_object_id = -1 group by tenant_id, task_id having count(*) > 1;
这个查询有结果则说明 task id 有重复,之前某些 DDL 已经提前返回了。
如果这个结果里面有 task id = 2 的记录,则是此问题(因为这个问题是 task id 必回退到 2)。
否则可能是新问题,需要找研发再看下。
问题原因
内部 SQL 返回 4018 触发代码逻辑 BUG 导致 __all_sys_stat 的 ob_max_used_ddl_task_id 重置为 1,具体场景未知。
问题的风险及影响
该问题会导致 DDL 语句提前返回,业务误认为 DDL 已经完成但实际上还在执行过程中,最终可能成功也可能失败。
影响租户
影响 OceanBase 数据库中的 Oracle 租户和 MySQL 租户,对于 SYS 租户无影响。
影响版本
OceanBase 数据库企业版 V4.1.0 GA(oceanbase-4.1.0.0-100001122023040322)及之后版本。
解决方法及规避方式
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库企业版 V4.1.0 BP4(oceanbase-4.1.0.2-104000032023092119)及之后版本。
如下是让后续发起的 DDL 使用尚未使用过的 task id,但后续依旧有可能再次回退,建议升级。
-- 在 SYS 租户下 --查到所有租户下最大的 ddl task id select max(task_id) from oceanbase.__all_virtual_ddl_error_message; --更新 SYS 租户内部表,后续 DDL task id 会从此之后开始分配 update oceanbase.__all_sys_stat set value = $MAX_TASK_ID where name = 'ob_max_used_ddl_task_id';警告
更新内部表
__all_sys_stat存在风险,请勿自行操作。如果需要修改,请咨询 OceanBase 技术支持。