jdk8的项目,使用flyway集成OceanBase失败

【 使用环境 】测试环境
【 OB or 其他组件 】OceanBase_CE + Flyway
【 使用版本 】5.7.25-OceanBase_CE-v4.2.1.8
【问题描述】
1、按照官方文档集成失败。出现FUNCTION RELEASE_LOCK does not exist这种错误
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002940686
2、由于使用的jdk是1.8版本,所以下降相关版本,pom如下:

org.flywaydb
flyway-core

  <!-- 替换为 9.22.3(JDK 8 兼容的最新版本) -->
  <version>9.22.3</version>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.47</version>
</dependency>
<dependency>
  <groupId>org.flywaydb</groupId>
  <artifactId>flyway-database-oceanbase</artifactId>
  <!-- 9.22.3 是 Flyway 9.x 最后版本,适配 JDK 8 -->
  <version>9.22.3</version>
</dependency>

【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)

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

根据您的描述,Flyway 在集成 OceanBase CE 版本 5.7.25-OceanBase_CE-v4.2.1.8 时遇到了 FUNCTION RELEASE_LOCK does not exist 的错误。这可能是因为某些 MySQL 兼容的函数在 OceanBase 中还没有完全支持,或者是在特定版本中尚未实现。对于此类问题,通常我们需要先收集更多的诊断信息来确定具体的原因。

推荐操作:

  1. 日志采集:为了进一步分析该问题,建议使用 obdiag 工具收集与 SQL 执行相关的日志信息。

    日志采集场景: SQL 执行出错
    日志采集命令:

    obdiag gather scene run --scene=observer.sql_err --env "{db_connect='-h127.0.0.1 -P2881 -utest@test -p****** -Dtest', trace_id='Yxx'}"
    

    注意:请替换命令中的 -h127.0.0.1 -P2881 -utest@test -p****** -Dtest 为您实际的数据库连接信息,并将 trace_id 替换为实际的事务追踪ID或保持默认值以收集尽可能多的相关日志。

  2. 问题补充:为了更有效地帮助您解决问题,请回答以下问题:

    1. 您使用的 Flyway 版本是什么?
    2. 能否提供完整的错误堆栈信息?
    3. 您尝试执行的具体 SQL 语句是什么?
    4. 在遇到这个问题之前,是否有进行过任何配置更改或数据库结构的修改?
    5. 您是否尝试过直接在 OceanBase 上执行 RELEASE_LOCK 函数,其结果如何?

以上信息将有助于我们更准确地定位问题并提供解决方案。感谢您的配合!

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

flyway 9.x没有不支持oceanbase,如果使用mysql驱动会被识别为mysql数据库,但是具体细节上有差异,oceanbase的插件包下载地址如下https://mvnrepository.com/artifact/org.flywaydb/flyway-database-oceanbase,不支持jdk1.8,具体原因是https://github.com/flyway/flyway-community-db-support,官方提供了一个插件库不再接收直接集成,而这个插件库也是从10.0.1开始支持的,未提供历史代码,无法修改历史代码进行集成

从报错看不支持这个函数,可以使用以下sql测试
– 获取锁(名称为 “my_lock”,等待 10 秒)

SELECT GET_LOCK(‘my_lock’, 10);

– 释放锁

SELECT RELEASE_LOCK(‘my_lock’);
测试ob 4.2.1.x不支持上述sql,4.2.5.x及以上支持上述sql