问题现象
问题 1 :当在问题版本的用户租户 mysql db 内,手动创建了与系统租户 mysql db 内
help_topic、help_category、help_keyword、help_relation同名(比较大小写不敏感)的多张表后(如在 mysql db 内创建两个名为help_topic的表),可能会导致 schema 刷新异常。引申问题 2 :当在问题版本的 oracle 租户的 sys db 内,创建和已有内部表同名的表 (比较大小写不敏感,如
DBA_OBJECTS和dba_objects认为是同名)会导致 schema 刷新异常。引申问题 3 :当在问题版本的租户的 oceanbase/mysql/information_schema/sys 库下创建和内部表同名的临时表(比较大小写不敏感),会导致 schema 刷新异常。
引申问题 4 :当出现各种同名冲突没拦住的情况,因为 RPM 版本
right_to_die()抛异常的行为,会导致第一现场无法保留以及可能会导致后续访问到非法内存而 core。
问题 1 :用户租户 mysql db下创建多张同名的表,会导致 schema 刷新异常
问题原因
OceanBase 数据库 V2.2.0 版本 schema 拆分引入的 bug:在用户租户的 mysql 库下多次创建名为 help_topic/help_category/ help_keyword/help_relation 的表时,OBServer 误将这些用户表识别成了系统表,导致建表时通过了 sys 租户的同名检测逻辑,而没有走到该租户的同名检测逻辑,从而没防住该租户下建同名表。
关键日志: build table name hashmap failed。
触发条件为在普通租户的系统 db 内、多次创建与 sys 租户 only 的内部表同名的表。由于普通租户的 oceanbase、information_schema 这两个 db 限制了建表,所以实际会触发问题的就只有 mysql db 内已有的四张 sys 租户 only 的表:help_topic/help_category/help_keyword/help_relation。
影响版本
OceanBase 数据库企业版 V2.2.77 BP11 (oceanbase-2.2.77-20220502140811) 之前版本、V3.1.2 BP8 (oceanbase-3.1.2-20220329234820) 之前的版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库企业版 V2.2.77 BP11 (oceanbase-2.2.77-20220502140811) 及之后版本、V3.1.2 BP8 (oceanbase-3.1.2-20220329234820) 及之后版本。
联系 OceanBase 技术支持通过修改内部表以及重启集群恢复。
引申问题 2 :oracle 租户的 sys db 内,创建和已有内部表同名的表,会导致schema刷新异常
问题原因
OceanBase 数据库 V2.2.x 版本 schema 拆分引入的问题,Oracle 租户下同时存在 MySQL 模式和 Oracle 模式的内部表,相关代码路径 compat_mode 设置不对,没有拦住和已有 sys db 内部表同名的表。
关键日志: build table name hashmap failed。
触发条件为 Oracle 租户下的 sys db,创建与已有内部表同名的表,如 "DBA_OBJECTS"、"dba_objects"。
影响版本
OceanBase 数据库企业版 V2.2.77 BP17 (oceanbase-2.2.77-117000112023051914) 之前版本、V3.1.2 及现有所有的 BP 版本、V3.2.3 BP8 (oceanbase-3.2.3.3-108000062023041511) 之前版本、V3.2.4 BP3 (oceanbase-3.2.4.3-103000032023041816) 之前版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库企业版 V2.2.77 BP17 (oceanbase-2.2.77-117000112023051914) 及之后版本、V3.2.3 BP8 (oceanbase-3.2.3.3-108000062023041511) 及之后版本、V3.2.4 BP3 (oceanbase-3.2.4.3-103000032023041816) 及之后版本。
联系 OceanBase 技术支持通过修改内部表以及重启集群恢复。
引申问题 3 :创建和已有内部表同名的临时表,会导致 schema 刷新异常
问题原因
OceanBase V2.2.x 版本 schema 拆分引入的问题,临时表对非临时表不可见,和内部表名的处理产生冲突,导致和已有内部表同名的临时表能多次创建出来。
关键日志: buil table hashmap failed。
触发条件为如系统租户下的 mysql db,创建 2 次及以上与已有内部表同名的临时表,如 "help_topic"。
影响版本
OceanBase 数据库企业版 V2.2.77 及现有所有的 BP 版本、V3.1.2 及现有所有的 BP 版本、V3.2.3 BP10 (oceanbase-3.2.3.3-110000092023091219)、V3.2.4 BP5 (oceanbase-3.2.4.5-105000012023081513) 之前版本。
OceanBase 社区版 V3.1.5 CE BP1 之前版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库企业版 V3.2.3 BP10 (oceanbase-3.2.3.3-110000092023091219) 及之后版本、V3.2.4 BP5 (oceanbase-3.2.4.5-105000012023081513) 及之后版本。
联系 OceanBase 技术支持通过修改内部表以及重启集群恢复。
应急解决方法:禁用创建和已有内部表同名的临时表。
引申问题 4 :schema 刷新的 right_to_die() 导致 OBServer core 或者集群不可用
问题原因
当触发了上述 bug(用户租户 mysql 库下创建多张与内部表同名的表,导致建表卡住)或者 租户命名空间内可以创建多个同名(包括为空串)约束 的 bug 后,会触发 schema 的 rebuild 逻辑并触发 right_to_die() 逻辑。然而由于 right_to_die() 逻辑的 bug,导致其抛异常释放当前线程后,可能会带来上下文没清理或内存泄漏等风险,进而导致 OBServer 的 schema 刷新异常或者 OBServer 访问到非法内存而 core 掉。
该问题触发后打印 right_to_die 的 ERROR 级别日志。
影响版本
OceanBase 数据库企业版 V2.2.77 GA(oceanbase-2.2.77-20210508211731)及之后版本、V3.1.2 GA(oceanbase-3.1.2-20210618150922)及之后版本、V3.2.3 GA(oceanbase-3.2.3-20220419)及之后版本、V3.2.4 GA(oceanbase-3.2.4.0-100000072022102819)及之后版本。
解决方法
事前
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库企业版 V2.2.77 BP15(oceanbase-2.2.77-115000012023010607)版本、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)版本。
事中
联系 OceanBase 技术支持通过修改内部表 + 重启集群恢复。
规避方式
问题版本中不要在任何租户的 oceanbase/information_schema/sys/mysql 库下创建和已有内部表(含系统租户)同名(比较大小写敏感)的用户表/视图/临时表等对象。