问题现象
在 OceanBase 数据库中,当设置 lower_case_table_names=0 并尝试创建索引时,如果 RS 和表的 Leader 不在同一台机器上,可能会遇到错误 OB_DDL_SCHEMA_VERSION_NOT_MATCH,具体表现为创建索引失败。
关键信息
错误代码:
OB_DDL_SCHEMA_VERSION_NOT_MATCH,Table doesn't exist。触发条件:
lower_case_table_names=0,RS 和用户表的 Leader 不在同一个机器上。诊断确认: 两个 Schema 确实属于大小写不同的表。
问题原因
此问题是由于 OceanBase 内核的一个 BUG 引起。在 lower_case_table_names=0 的设置下,数据库名和表名应该是大小写敏感的。但是,lower_case_table_name 这个 session 变量不是 query sensitive 的,导致序列化 sesssion 的时候不会主动把这个序列化,所以目前的一些 inner sql 处理上并没有标记 session lower_case_table_name,导致 SQL 解析将 db/table name 统一转成小写形式了。这种转换在 RS 和表的 Leader 位于不同服务器时,会导致用错表(全都使用小写的表名),从而引发错误。
问题的风险及影响
创建索引操作失败。
可能影响后续依赖于该索引的数据操作和查询性能。
适用版本
OceanBase 数据库 V4.2.5 BP4(oceanbase-4.2.5.4-104000082025052817)及之后版本、V4.4.1(oceanbase-4.4.1.0-100000242025092415)及之后版本。
注意
OceanBase 数据库 V4.3.x 版本正常。
解决方法
修复版本: 升级到问题已修复版本。目前已修复的版本包含 OceanBase 数据库 V4.2.5 BP6 Hotfix3(oceanbase-4.2.5.6-106030012025112319)版本、V4.2.5 BP7 Hotfix1(oceanbase-4.2.5.7-107010032025112814)版本。
应急方法:
将
lower_case_table_names设置为非 0 值,以确保数据库名和表名的大小写不敏感,避免因大小写问题导致的schema_version不匹配错误。将 RS 切到租户主上。
规避方式
在创建租户时,不要指定
lower_case_table_names=0,或者确保所有数据库名和表名都使用小写形式,以避免大小写敏感性问题。对于已经设置了
lower_case_table_names=0的环境,建议评估是否可以接受将该参数调整为非 0 值,以规避此问题。如果必须保持大小写敏感性,需确保资源池和表的 Leader 在同一台机器上,但这可能不是一种长期可行的解决方案。