cloudcanal同步ob数据到Mysql检测失败

【 使用环境 】生产环境
【 OB or 其他组件 】OBServer,OBlogproxy,Cloudcanal
【 使用版本 】OBServer-4.2.4,OBlogproxy2.0.2,Cloudcanal-4.4.0.0
【问题描述】使用cloudcanal同步Oceanbase租户到mysql失败,任务创建后提示如下:
Console task execute with error. Context is {“resources”:[],“tryTimes”:null,“paramType”:null,“consoleJobId”:0,“dataJobId”:9,“singleGenJob”:false}.
Exception stack is 远程获取任务初始位点失败。错误信息为:invoke rcontroller method failed.Request id:b3c8c1e2-8c2d-11ef-97b4-8d5dd374eb93msg:SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near ‘master status’ at line 1. target sidecar is 172.31.238.4, route name is oceanbase_rdbFetchSrcIncrePosition
at com.clougence.cloudcanal.console.component.rsocket.service.impl.OceanBaseMetaRServiceImpl.fetchCurrentBinlogPos(OceanBaseMetaRServiceImpl.java:67)
at com.clougence.cloudcanal.console.component.consoletask.handler.createdatajob.oceanbase.ObInitCdcHandler.initSrcMySqlFileBasePos(ObInitCdcHandler.java:92)
at com.clougence.cloudcanal.console.component.consoletask.handler.createdatajob.oceanbase.ObInitCdcHandler.execute(ObInitCdcHandler.java:71)
at com.clougence.cloudcanal.console.component.consoletask.handler.createdatajob.oceanbase.ObInitCdcHandler.execute(ObInitCdcHandler.java:38)
at com.clougence.cloudcanal.console.component.consoletask.service.ConsoleJobManagerImpl.doExecuteJob(ConsoleJobManagerImpl.java:229)
at com.clougence.cloudcanal.console.component.consoletask.service.ConsoleJobManagerImpl.lambda$doExecuteJobAsync$1(ConsoleJobManagerImpl.java:183)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:750)
cloudcanal Oceanbase数据源已选择的是binlog模式,任务创建步骤时cloudcanal提示的名称却是cdc


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

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

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

根据您提供的信息,您正在使用 CloudCanal 同步 OceanBase 租户到 MySQL,但在任务创建过程中遇到了错误。错误信息显示在尝试获取任务初始位点时失败,并且具体的错误信息是 SQL 语法错误,提示在 'master status' 附近存在语法错误。此外,您提到在 CloudCanal 中配置的数据源是 binlog 模式,但在任务创建步骤中看到的是 cdc。

分析与建议

  1. SQL 语法错误:

    • 错误信息 You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near 'master status' at line 1 表明在执行 SQL 语句时出现了语法错误。'master status' 是 MySQL 中用于获取主库状态的命令,但在 OceanBase 中可能不适用或语法不同。
    • 解决方案:
      • 请检查 CloudCanal 在连接 OceanBase 时使用的 SQL 语句是否正确。您可以尝试手动执行相同的 SQL 语句,看看是否能成功。
      • 确认 CloudCanal 是否支持您当前使用的 OceanBase 版本(4.2.4)。您可以查阅 CloudCanal 的官方文档或联系 CloudCanal 的技术支持团队,确认是否有已知的兼容性问题。
  2. CDC 与 Binlog 模式:

    • 您提到在 CloudCanal 中配置的数据源是 binlog 模式,但在任务创建步骤中看到的是 cdc。这可能是配置问题或 CloudCanal 的内部逻辑问题。
    • 解决方案:
      • 请仔细检查 CloudCanal 的配置,确保在创建任务时选择了正确的数据源类型(binlog 模式)。
      • 如果配置无误,建议联系 CloudCanal 的技术支持团队,提供详细的错误日志和配置信息,以便他们能够帮助您排查问题。

具体操作步骤

  1. 检查 SQL 语句:

    • 打开 OceanBase 的命令行工具(如 obclient),尝试手动执行 SHOW MASTER STATUS; 或类似的命令,看看是否能成功。
    • 如果命令失败,请查阅 OceanBase 的官方文档,确认正确的语法。
  2. 检查 CloudCanal 配置:

    • 登录 CloudCanal 控制台,进入任务创建页面,确保选择了正确的数据源类型(binlog 模式)。
    • 查看任务创建日志,确认是否有其他错误信息或警告。
  3. 联系技术支持:

    • 如果上述步骤无法解决问题,建议联系 CloudCanal 的技术支持团队,提供详细的错误日志和配置信息,以便他们能够帮助您进一步排查问题。

希望这些建议对您有所帮助。如果还有其他问题或需要进一步的帮助,请随时联系 OceanBase 的人工答疑。

更多信息请查看:

  1. 0001 ~ 3999
  2. 使用 CloudCanal 从 MySQL 数据库迁移数据到 OceanBase 数据库
  3. 4000 ~ 4499

从上面的 CloudCanal 日志来看,程序是执行 SHOW MASTER STATUS 时报错了,但是任务界面显示的是 CDC,我不太了解 CloudCanal 里的任务名称定义,这里您能确定程序是按照哪个模式访问的吗?

另外,通过 OBProxy 连接到对应的租户后执行 SHOW MASTER STATUS 能够正常返回结果吗?

执行了master status返回是empty,那是oblogproxy没有配置成功?

这个模式选的是binlog吗?已有的链路修改OB数据源那里,可以看到这个参数

根据您提供的信息,执行 SHOW MASTER STATUS; 返回空结果,这可能意味着 OceanBase 的增量日志(binlog)功能没有正确配置或启用。这确实可能导致 CloudCanal 在尝试获取初始位点时失败。

分析与建议

  1. 检查 OBLogproxy 配置:

    • 确保 OBLogproxy 已正确配置并运行。OBLogproxy 是 OceanBase 数据库的增量日志代理服务,负责获取和传输增量日志。
    • 检查 OBLogproxy 的配置文件 conf/conf.json,确保以下关键配置项正确:
      • service_port: 服务端口,默认为 2983。
      • ob_sys_usernameob_sys_password: 系统租户的用户名和密码密文。
      • allow_all_tenant: 是否允许订阅所有租户,默认为 true
      • auth_user: 是否鉴权连接用户,默认为 true
      • auth_use_rs: 是否通过 root server 鉴权用户,默认为 false
      • auth_allow_sys_user: 是否允许订阅系统租户,默认为 true
  2. 检查 OceanBase 集群配置:

    • 确保在 OceanBase 集群的 sys 租户中创建了一个带密码的用户,并授予了必要的权限。
    • 示例 SQL 语句:
      obclient [(none)]> SHOW TENANT;
      +---------------------+
      | Current_tenant_name |
      +---------------------+
      | sys                 |
      +---------------------+
      1 row in set
      
      obclient [(none)]> CREATE USER sys_user001 IDENTIFIED BY 'your_password';
      Query OK, 0 rows affected
      
      obclient [(none)]> GRANT ALL PRIVILEGES ON *.* TO sys_user001 WITH GRANT OPTION;
      Query OK, 0 rows affected
      
  3. 检查 OBLogproxy 日志:

    • 查看 OBLogproxy 的日志文件,确认是否有任何错误或警告信息。日志文件通常位于 logs 目录下。
    • 日志文件可以帮助您确定 OBLogproxy 是否成功连接到 OceanBase 集群,并获取增量日志。
  4. 检查 CloudCanal 配置:

    • 确保 CloudCanal 配置中正确指定了 OBLogproxy 的地址和端口。
    • 确认 CloudCanal 与 OBLogproxy 之间的网络连接正常。

具体操作步骤

  1. 检查 OBLogproxy 配置文件:

    • 打开 conf/conf.json 文件,确保配置项正确。
    • 示例配置文件内容:
      {
        "service_port": 2983,
        "ob_sys_username": "4B9C75F64934174F4E77EE0E9A58****",
        "ob_sys_password": "DCE2AF09D006D6A440816880B938****",
        "allow_all_tenant": true,
        "auth_user": true,
        "auth_use_rs": false,
        "auth_allow_sys_user": true
      }
      
  2. 检查 OceanBase 集群配置:

    • 登录到 OceanBase 的 sys 租户,确保用户已创建并授予权限。
    • 执行以下 SQL 语句:
      obclient -h <OBServer_IP> -P <OBServer_Port> -u root@sys -p <root_password>
      CREATE USER sys_user001 IDENTIFIED BY 'your_password';
      GRANT ALL PRIVILEGES ON *.* TO sys_user001 WITH GRANT OPTION;
      
  3. 检查 OBLogproxy 日志:

    • 查看 logs 目录下的日志文件,确认是否有任何错误或警告信息。
    • 示例命令:
      tail -f /path/to/oblogproxy/logs/oblogproxy.log
      
  4. 检查 CloudCanal 配置:

    • 确保 CloudCanal 配置中正确指定了 OBLogproxy 的地址和端口。
    • 示例配置:
      {
        "source": {
          "type": "oceanbase",
          "host": "<OBLogproxy_IP>",
          "port": 2983,
          "username": "sys_user001",
          "password": "your_password"
        },
        "target": {
          "type": "mysql",
          "host": "<MySQL_IP>",
          "port": 3306,
          "username": "mysql_user",
          "password": "mysql_password"
        }
      }
      

希望这些建议对您有所帮助。如果还有其他问题或需要进一步的帮助,请随时联系 OceanBase 的人工答疑。

更多信息请查看:

  1. oblogproxy 文档
  2. 使用 Canal 从 OceanBase 数据库迁移数据到 MySQL 数据库

详情请参考:

  1. 配置文件
  2. 使用安装包安装部署 oblogproxy
  3. 使用源码构建 oblogproxy
  4. 使用 Canal 从 OceanBase 数据库同步数据到 MySQL 数据库
  5. 删除 OBProxy
  6. 使用 Flink CDC 从 OceanBase 数据库迁移数据到 MySQL 数据库
  7. 启动 OBProxy
  8. CDC 概述

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

是binlog

调整后,在cloudcanal的服务器上用obproxy访问ob,执行show master status可以看到了,但cloudcanal任务启动还是报一样的错误

问题已解决
原因:由于cloudcanal ob数据源默认使用cdc方式,无法读取binlog,导致一直报错
解决方法:改为使用mysql数据源对接obproxy,可以正常解析到binlog