首批通过分布式安全可靠测评,为关键业务系统打造
租户命名空间下存在多个同名(包括为空串)的约束,导致 OBServer core
更新时间:2026-06-04 09:56
问题现象
使用 ODC V3.4.0 及 V3.4.0 BP 版本 ODC 的 "新建" 功能创建约束时,若不指定约束名,则会生成约束名为空串的 DDL 示例如下。
CREATE TABLE "TEST"."T1" ( "C1" INTEGER NULL, "C2" INTEGER NULL, CONSTRAINT "" PRIMARY KEY ("C1") );在问题版本 OBServer 中, 当某租户命名空间内(Oracle 模式为 user 内, MySQL 模式下为 DB 内) 含多个同名 (包括为空串) 的约束时, 可能导致 schema 刷新异常 或 OBServer core。
问题原因
在 ODC 3.4.0 及 3.4.0 BP 版本中,由于“新建”功能内部行为变化,导致创建约束时若不指定约束名,则在生成的 DDL 中该约束名为空串(即"")。
在问题版本 OBServer 中创建约束时,由于部分内核模块缺少对 空串名拦截 及 同名约束检查 的 bug,导致一个租户下的命名空间可内能创建出多个同名(包括为空串)的约束,进而又会触发 schema 刷新线程不清理上下文的 bug,从而导致 OBServer schema 刷新 hang 住,甚至 OBServer core 掉。
问题的风险及影响
当某租户的命名空间 (Oracle 模式为 user 内,MySQL 模式下为 DB 内) 内含有多个同名(包括为空串)的约束时,可能会导致 OBServer schema 刷新异常 或 OBServer core 掉。
影响的版本
- OceanBase 数据库 V2.2.77 BP15 (oceanbase-2.2.77-115000012023010607)、V3.1.2 BP11 (oceanbase-3.1.2-111000052023010412)、V3.1 OpenSource 未发版、V3.2.3 BP7 (oceanbase-3.2.3.3-107000092023011911)、V3.2.4 BP1 (oceanbase-3.2.4.1-101000052023010822)、V4.0.0.0 BP2 (oceanbase-4.0.0.0-102000022023011212) 之前版本。
- ODC V3.4.0 和 V3.4.0 BP。
解决方法及规避方式
解决方法:
- 问题发生前,请升级相关产品至问题已修复版本。目前已修复的版本包括:
- OceanBase 数据库 V2.2.77 BP15 (oceanbase-2.2.77-115000012023010607)、V3.1.2 BP11 (oceanbase-3.1.2-111000052023010412)、V3.1 OpenSource 未发版、V3.2.3 BP7 (oceanbase-3.2.3.3-107000092023011911)、V3.2.4 BP1 (oceanbase-3.2.4.1-101000052023010822)、V4.0.0.0 BP2 (oceanbase-4.0.0.0-102000022023011212)、V4.1 (oceanbase-4.1.0.0-100001122023040322) 及后续版本。
- ODC V3.4.0 BP 后续版本
- 问题发生后,请尽快联系 OceanBase 技术支持进行处理。
- 问题发生前,请升级相关产品至问题已修复版本。目前已修复的版本包括:
规避方式:
不创建任何名字为空的对象。
检查不同租户模式下的约束来判断集群是否有隐患,发现问题后请尽快联系 OceanBase 技术支持进行处理。
针对 Oracle 租户,同一 user 内不能出现多个同名约束(包括为空串)。在 sys 租户下查询下表。
SELECT *FROM OCEANBASE.__ALL_VIRTUAL_CONSTRAINT;针对 MySQL 租户,同一 DB 内不能出现多个同名约束(包括为空串)。在本租户下查询下表以检查。
SELECT* FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS;注意
由于内核对空串名拦截实现的原因,OBServer 不能保证在其他模块创建对象时对空串名的有效拦截。因此,请在创建任何对象时指定非空的对象名。