oceanbase数据表由于使用多值索引导致Canal报错导致无法同步数据

【 使用环境 】测试环境
【 OB or 其他组件 】Oceanbase
【 使用版本 】4.3.5 bp1
【问题描述】
由于我们MySQL版本中,使用了MySQL 8.0 多值索引这一特性。
多值索引表结构如下:

然后,我们在Oceanbase 4.3.5中使用多值索引,表结构却略有差异:

本来也没什么关系,但是我们这边使用了Canal,Canal这端却报错了。

然后,我们发现无法正常在kafka中捕获到这个表的数据变更。
我们尝试在oceanbase这段剔除这个索引,数据可以正常捕获。

初步断定,这个语法好像没被canal识别。

请问如何能让我们有多值索引的表,可以正常被canal捕获呢?

【复现路径】如上所示

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

1 个赞

根据您的描述,问题可能与 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’}”

请按照上述命令采集日志,并将生成的日志压缩包提供给我们以进一步分析问题。

另外,为了更好地帮助您解决问题,请您提供以下信息:

  1. 是否可以提供发生错误时的具体 SQL 语句?
  2. Canal 在同步数据时是否涉及多值索引的创建或更新操作?
  3. 是否可以提供完整的错误堆栈信息(com.alibaba.druid.sql.parser.ParserException 的详细内容)?
  4. OceanBase 数据库和 Canal 的版本号是否匹配?是否存在兼容性问题?
  5. 是否在其他表或场景下也遇到了类似的问题?

感谢您的配合!

附上敏捷诊断工具 obdiag 使用帮助链接

1 个赞

后面我们尝试维护Canal这边的元数据,剔除对应的索引,貌似又正常了。

感谢。

1 个赞

根据您的后续反馈,通过维护 Canal 元数据并剔除对应的多值索引后,问题得到了解决。这表明问题的根本原因可能是 Canal 在解析 OceanBase 数据库的多值索引时存在兼容性问题。

问题总结与建议:

  1. Canal 兼容性问题
    Canal 当前版本可能无法正确解析或处理 OceanBase 中的多值索引(如 JSON_QUERY 函数生成的虚拟列索引)。这种不兼容性导致了 Canal 在同步数据时出现解析错误。

  2. 临时解决方案
    您提到通过剔除多值索引后,Canal 能够正常捕获数据变更。这验证了问题确实与多值索引相关。如果业务允许,可以考虑在生产环境中暂时移除多值索引以确保 Canal 同步正常。

  3. 长期解决方案

    • 升级 Canal 版本:检查是否有更高版本的 Canal 支持对 OceanBase 多值索引的解析。如果存在,请尝试升级。
    • 自定义 Canal 解析器:如果升级不可行,可以考虑修改 Canal 的 SQL 解析器逻辑,使其能够正确处理 OceanBase 的多值索引语法。
    • OceanBase 社区反馈:将此问题反馈给 OceanBase 社区或技术支持团队,确认是否存在已知的兼容性问题,并获取官方建议。
  4. 注意事项
    如果多值索引对业务逻辑至关重要,建议在剔除索引的同时,评估是否可以通过其他方式(如应用层逻辑)实现类似功能,以避免对业务造成影响。

如果您有更多问题或需要进一步的技术支持,欢迎随时联系 OceanBase 社区或技术支持团队!

具体信息可参考以下文档:

  1. 9000 ~ 9499
  2. 取消租户恢复
  3. 清理未初始化的集群
  4. 删除 OBProxy
  5. 删除资源池
  6. 创建索引
  7. 4500 ~ 4999

(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)

1 个赞


如果你是ocp部署的binlog服务 如果在页面选了 ddl 兼容性,binglog 就会在 odp 那里加个参数 如果不是ocp部署的 可以在odp配置文件中增加这个参数

2 个赞

:+1: :+1: :+1: :+1:

老师,我们已经配置了 _show_ddl_in_compat_mode,

但是,针对多值索引这个部分,我们发现配置了 _show_ddl_in_compat_mode =1 的情况下,Canal仍然是不识别。

1 个赞

老师,是这个配置吗?
我们配置后,整体是没问题的,但是,只是对于多值索引的这个表结构有问题。

1 个赞

是的 你配置完 重启了吧

重启了,只是针对使用了这个特性的表结构会出现这样的问题。