【 使用环境 】测试环境
【 OB or 其他组件 】Oceanbase
【 使用版本 】4.3.5 bp1
【问题描述】
由于我们MySQL版本中,使用了MySQL 8.0 多值索引这一特性。
多值索引表结构如下:
然后,我们在Oceanbase 4.3.5中使用多值索引,表结构却略有差异:
本来也没什么关系,但是我们这边使用了Canal,Canal这端却报错了。
然后,我们发现无法正常在kafka中捕获到这个表的数据变更。
我们尝试在oceanbase这段剔除这个索引,数据可以正常捕获。
初步断定,这个语法好像没被canal识别。
请问如何能让我们有多值索引的表,可以正常被canal捕获呢?
【复现路径】如上所示
【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!
3 个赞
论坛小助手
#3
根据您的描述,问题可能与 SQL 解析或执行有关。推荐使用 obdiag 工具进行日志采集,以便进一步分析问题。
根因分析场景: SQL 执行出错
根因分析命令: obdiag rca run --scene=sql_execution_error --env “{db_connect=’-h127.0.0.1 -P2881 -utest@test -p****** -Dtest’, trace_id=‘Yxx’}” (如果能提供具体的 trace_id
将更有助于定位问题)
日志采集场景: SQL 执行出错
日志采集命令: obdiag gather scene run --scene=observer.sql_err --env “{db_connect=’-h127.0.0.1 -P2881 -utest@test -p****** -Dtest’, trace_id=‘Yxx’}”
请按照上述命令采集日志,并将生成的日志压缩包提供给我们以进一步分析问题。
另外,为了更好地帮助您解决问题,请您提供以下信息:
- 是否可以提供发生错误时的具体 SQL 语句?
- Canal 在同步数据时是否涉及多值索引的创建或更新操作?
- 是否可以提供完整的错误堆栈信息(com.alibaba.druid.sql.parser.ParserException 的详细内容)?
- OceanBase 数据库和 Canal 的版本号是否匹配?是否存在兼容性问题?
- 是否在其他表或场景下也遇到了类似的问题?
感谢您的配合!
附上敏捷诊断工具 obdiag 使用帮助链接
2 个赞
后面我们尝试维护Canal这边的元数据,剔除对应的索引,貌似又正常了。
感谢。
2 个赞
论坛小助手
#5
根据您的后续反馈,通过维护 Canal 元数据并剔除对应的多值索引后,问题得到了解决。这表明问题的根本原因可能是 Canal 在解析 OceanBase 数据库的多值索引时存在兼容性问题。
问题总结与建议:
-
Canal 兼容性问题:
Canal 当前版本可能无法正确解析或处理 OceanBase 中的多值索引(如 JSON_QUERY
函数生成的虚拟列索引)。这种不兼容性导致了 Canal 在同步数据时出现解析错误。
-
临时解决方案:
您提到通过剔除多值索引后,Canal 能够正常捕获数据变更。这验证了问题确实与多值索引相关。如果业务允许,可以考虑在生产环境中暂时移除多值索引以确保 Canal 同步正常。
-
长期解决方案:
-
升级 Canal 版本:检查是否有更高版本的 Canal 支持对 OceanBase 多值索引的解析。如果存在,请尝试升级。
-
自定义 Canal 解析器:如果升级不可行,可以考虑修改 Canal 的 SQL 解析器逻辑,使其能够正确处理 OceanBase 的多值索引语法。
-
OceanBase 社区反馈:将此问题反馈给 OceanBase 社区或技术支持团队,确认是否存在已知的兼容性问题,并获取官方建议。
-
注意事项:
如果多值索引对业务逻辑至关重要,建议在剔除索引的同时,评估是否可以通过其他方式(如应用层逻辑)实现类似功能,以避免对业务造成影响。
如果您有更多问题或需要进一步的技术支持,欢迎随时联系 OceanBase 社区或技术支持团队!
具体信息可参考以下文档:
- 9000 ~ 9499
- 取消租户恢复
- 清理未初始化的集群
- 删除 OBProxy
- 删除资源池
- 创建索引
- 4500 ~ 4999
(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)
2 个赞
淇铭
#6
如果你是ocp部署的binlog服务 如果在页面选了 ddl 兼容性,binglog 就会在 odp 那里加个参数 如果不是ocp部署的 可以在odp配置文件中增加这个参数
2 个赞
老师,我们已经配置了 _show_ddl_in_compat_mode,
但是,针对多值索引这个部分,我们发现配置了 _show_ddl_in_compat_mode =1 的情况下,Canal仍然是不识别。
1 个赞
老师,是这个配置吗?
我们配置后,整体是没问题的,但是,只是对于多值索引的这个表结构有问题。
1 个赞
重启了,只是针对使用了这个特性的表结构会出现这样的问题。
淇铭
#13
ob集群上查看一下 这个变量 show variables like ‘%_show_ddl_in_compat_mode%’;
老师,您看看。
另外,我将MySQL完整的表结构贴出来哈。
Oceanbase展示的是:
而未配置_show_ddl_in_compat_mode,Oceanbase展示的是:
另外,Canal的报错如下:
淇铭
#15
你在直连查询一下这个变量 show variables like ‘%_show_ddl_in_compat_mode%’;
通过 proxy 连接,在创建上面多值索引表表的会话中查看 show variables like ‘%_show_ddl_in_compat_mode%’ 看看这个变量值
老师,好像没什么区别,感觉不是_show_ddl_in_compat_mode配置的问题。
1、直连2881查询 %_show_ddl_in_compat_mode%
但是,改了也是不对的。
2881直连的情况下。
2、通过proxy连接:
CREATE TABLE test
(
id_
bigint NOT NULL COMMENT ‘无业务意义主键’,
industry_type_
tinyint DEFAULT NULL COMMENT ‘’,
org_id_
bigint DEFAULT NULL COMMENT ‘’,
custom_fields_
json DEFAULT NULL COMMENT ‘自定义字段 JSON格式’,
PRIMARY KEY (id_
),
KEY idx_test_8
((cast(json_extract(custom_fields_
,_utf8mb4’$.thirdPlatformNumber’) as char(64) array)),org_id_
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT=‘test’
或者老师测试一下?
淇铭
#18
你先通过obproxy连接你创建的表 后面在obproxy上修改的_show_ddl_in_compat_mode这个变量
老师,您好,
我们是通过obproxy创建这个表的,并且,创建binlogproxy的时候,已经将_show_ddl_in_compat_mode配置为ON的状态。
但是,似乎多值索引的表结构和MySQL的有点区别,导致只有这个表在canal上出现了报错。
所以我们感觉是多值索引这部分可能还没兼容?毕竟这个是很小众的功能。
淇铭
#21
OB的json多值索引实现是基于JsonQuery实现的,目前show create table会打印内部的json_query语句,这个是符合预期的。
_show_ddl_in_compat_mode开启时没有变化,是当前没有适配这个参数,后期会适配。到时候发版会有说明。