首批通过分布式安全可靠测评,为关键业务系统打造
重名约束(含空串)导致 OBServer core 掉
更新时间:2024-01-16 11:56
问题现象
OceanBase 数据库的同一个租户下,如果存在同名的约束(含空串),则可能触发了 schema 刷新线程不清理上下文的 bug,导致 OBServer core 掉。
问题原因
约束为空串的可能原因有两个。
特定版本 ODC 的 “新建” 功能创建约束时若不指定约束名,则可能在 OceanBase 数据库中创建名为空串(即"")的约束。
通过 OBClient 等客户端工具直接执行 DDL 操作时,由于创建约束时部分内核模块缺少对空串名拦截及同名约束检查的 bug,使得不同租户模式下的命名空间可能含有多个同名(包括为空串)的约束。
错误示范例子如下。
obclient > create table u_ltest.test_table_null( c1 number(10), c2 number(10) not null, CONSTRAINT "" PRIMARY KEY (c1));注意
此语句为错误示范,不要在生产环境执行。
适用版本
OceanBase 数据库 V2.x、V3.x 版本。
解决方法
规范操作,创建任何对象时,无比使用非空的名字,这才是规避本问题的关键。
对于怀疑出现本问题的系统,可通过下述思路进行排查。
查询相关数据字典。
针对 Oracle 租户,同一 user 内不能出现多个同名约束(包括为空串)。在 sys 租户下查询下表以检查:
obclient> select * from oceanbase.__all_virtual_constraint;针对 MySQL 租户,同一 database 内不能出现多个同名约束(包括为空串)。在本租户下查询下表以检查:
obclient > select * from information_schema.table_constraints;注意
MySQL 租户下不记录主键约束名,均默认为 PRIMARY。
搜索 RS 日志:日志中包含以下 Trying so hard to die 的 ERROR 级别日志时,代表集群已经出现了问题。
对于已出现本问题的系统,可通过升级解决,其余情况则需要联系 OceanBase 技术支持进行解决。
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库企业版 V2.2.77 BP11 (oceanbase-2.2.77-20220502140811) 及之后版本、V3.1.2 BP11 (oceanbase-3.1.2-111000052023010412) 及之后版本、V3.2.3 BP7 (oceanbase-3.2.3.3-107000092023011911)、V3.2.4 BP1 (oceanbase-3.2.4.1-101000052023010822) 及之后版本。