OB Binlog Service,Canal访问报错“CanalParseException: command : 'show master status' has an error”错误

【 使用环境 】测试环境
【 OB or 其他组件 】Oceanbase Binlog Service
【 使用版本 】
1、oceanbase 4.2.3.1
2、obproxy 4.3.2
3、ob binlog service 4.0.1
【问题描述】
1、部署ob binlog service服务,通过binlog servcie配置,无问题,且确认binlog日志正常生成;
2、接入canal,启动instance,报错“CanalParseException: command : ‘show master status’ has an error”,截图如下。
3、通过2883端口访问,确实报语法错误。

截图2,

截图3,

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

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

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

根据您提供的信息,您在使用 Canal 访问 OceanBase Binlog Service 时遇到了 CanalParseException 错误,具体错误信息为 command : 'show master status' has an error。此外,您还提到通过 2883 端口访问时也出现了相同的语法错误。

分析与解决方案

  1. 错误原因

    • show master status 是 MySQL 中用于显示主服务器二进制日志文件的状态的命令。然而,OceanBase 并不支持这个命令,因此会导致语法错误。
    • 在 OceanBase 中,获取类似信息的方式有所不同。
  2. 解决方案

    • 使用 OceanBase 的替代命令

      • 在 OceanBase 中,您可以使用 SHOW PHYSICAL BACKUP LOGSHOW BACKUP LOG 来获取类似于 MySQL 中 show master status 的信息。
      • 例如:
        SHOW PHYSICAL BACKUP LOG;
        
      • 请参考 OceanBase 官方文档以获取更多关于这些命令的详细信息。
    • 配置 Canal

      • 由于 Canal 依赖于 show master status 命令来获取二进制日志的位置,您需要对 Canal 进行一些配置调整,使其能够适应 OceanBase 的环境。
      • 一种可能的解决方案是修改 Canal 的配置文件,使其能够正确解析 OceanBase 的日志信息。具体步骤如下:
        1. 打开 Canal 的配置文件 canal.properties
        2. 找到并修改 canal.instance.master.address 配置项,确保其指向正确的 OceanBase 地址和端口。
        3. 修改 canal.instance.dbUsernamecanal.instance.dbPassword,确保使用具有足够权限的用户。
        4. 如果需要,可以添加自定义的 SQL 查询来获取日志位置信息,并在 Canal 的配置中指定这些查询。
  3. 验证

    • 在完成上述配置后,重新启动 Canal 实例,检查是否仍然出现相同的错误。
    • 如果问题仍然存在,建议使用 obclient 工具手动执行 SHOW PHYSICAL BACKUP LOG 命令,确保能够正确获取日志信息。

总结

根据文档库中的信息,OceanBase 不支持 show master status 命令。因此,您需要使用 OceanBase 提供的替代命令来获取二进制日志信息,并相应地调整 Canal 的配置。希望这些建议能帮助您解决问题。如果仍有疑问,建议联系 OceanBase 的官方技术支持获取进一步的帮助。

更多信息请查看:

  1. 4000 ~ 4499
  2. 0001 ~ 3999
  3. 900.9000-9499-of-mysql-mode.md
  4. 4500 ~ 4999

1、发一下 observer.log日志 日志比较大 压缩上传一下

感谢老师协助,相关日志已压缩。

observer.log.tar.gz (20.4 MB)

感谢您上传了日志文件。为了帮助您更好地分析和解决问题,我们可以使用 obdiag 工具来解压和查看这些日志文件。以下是具体步骤:

使用 obdiag 工具解压和查看日志文件

  1. 安装 obdiag 工具
    如果您还没有安装 obdiag 工具,可以通过以下命令进行安装:

    # 下载并安装 obdiag
    wget https://mirrors.aliyun.com/oceanbase/obdiag/obdiag_latest.tar.gz
    tar -zxvf obdiag_latest.tar.gz
    cd obdiag
    
  2. 解压日志文件
    使用 obdiag 工具解压日志文件:

    ./obdiag gather log --tar-file /path/to/observer.log.tar.gz --output-dir /path/to/output
    

    其中 /path/to/observer.log.tar.gz 是您上传的日志文件的路径,/path/to/output 是您希望解压后日志文件存放的目录。

  3. 查看解压后的日志文件
    解压完成后,您可以使用 catlessvim 等工具查看日志文件。例如:

    cat /path/to/output/observer.log
    

查看特定日志内容

如果您需要查看特定的日志内容,可以使用 grep 命令进行搜索。例如,查找包含 CanalParseException 的日志条目:

grep "CanalParseException" /path/to/output/observer.log

示例

假设您已经将日志文件解压到 /tmp/oblogs 目录下,以下是完整的示例命令:

# 安装 obdiag
wget https://mirrors.aliyun.com/oceanbase/obdiag/obdiag_latest.tar.gz
tar -zxvf obdiag_latest.tar.gz
cd obdiag

# 解压日志文件
./obdiag gather log --tar-file /path/to/observer.log.tar.gz --output-dir /tmp/oblogs

# 查看日志文件
cat /tmp/oblogs/observer.log

# 搜索特定日志内容
grep "CanalParseException" /tmp/oblogs/observer.log

分析日志

根据您之前的问题,我们重点关注 CanalParseExceptionshow master status 相关的错误信息。通过查看日志文件,我们可以进一步分析问题的具体原因。

如果您在解压和查看日志过程中遇到任何问题,或者需要进一步的帮助,请随时告诉我。希望这些步骤能帮助您解决问题。

检索到的文档如下:

  1. Alert 日志
  2. 日志
  3. 日志压缩与解压
  4. What’s New
  5. syslog_compress_func

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

从日志上看 语句解析失败

https://www.oceanbase.com/docs/community-oblogproxy-doc-1000000001493745#6-title-配置%20OBProxy

最后一步的配置 OBProxy 做了吗?结束之后要用 Binlog 订阅的租户连接 OBProxy 执行 SHOW MASTER STATUS。正常情况下,SHOW MASTER STATUS 应该是在 OBProxy 解析执行的,不应该会发到 observer 上。

老师,你好,最后处理了,报错“OBproxy connected Binlog Service failed”这样,

但是,我本地binlog 是正常生成的。

本地binlog确认有数据。

命令里面用的是明文密码。

使用 sys 或 proxysys 租户的账号连接 OBProxy,执行 SHOW PROXYCONFIG LIKE 'binlog_service_ip'; 有值吗?跟你的 binlog server 部署的服务 IP 和 端口一样不?

如果都正常的话,看下 ODP 的日志,有哪些报错信息。

好的。

SHOW PROXYCONFIG LIKE ‘binlog_service_ip’; 和我们的binlog server部署的服务IP和端口一样的。
1、obproxy 可访问 ob binlog service 2983端口

2、SHOW PROXYCONFIG LIKE ‘binlog_service_ip’;

3、binlog service服务及端口:

ODP日志烦请查阅附件
OBProxy connect binlog service failed.log (759 KB)

另外,同样依照2.0.2版本,服务就都是正常的。

看日志里有这个报错,我让 ODP 的同学看一下

[2024-11-04 14:37:47.944082] WDIAG [LIB] convert_ipv6_addr (ob_addr.cpp:60) [2993261][Y0-00007FFA9156EB70] [lt=0] [dc=0] convert ipv6 addr failed(ip="fe80::5054:ff:fee5:e9cf%eth0 172.18.96.196")
[2024-11-04 14:37:47.944084] WDIAG [PROXY] fetch_binlog_entry (ob_route_utils.cpp:2120) [2993261][Y0-00007FFA9156EB70] [lt=0] [dc=0] invalid ip or port in fetching binlog entry(ret=-4002)
[2024-11-04 14:37:47.944086] WDIAG [PROXY] handle_binlog_entry_resp (ob_table_entry_cont.cpp:658) [2993261][Y0-00007FFA9156EB70] [lt=0] [dc=0] fail to fetch binlog entry info(ret=-4002)

感谢老师。

连接到 Binlog Server,执行这两个命令,看下显示的 IP 对不对。

SHOW BINLOG SERVER FOR TENANT cluster.tenant;
SHOW BINLOG INSTANCES FOR cluster.tenant;

或者更直接一点,看看 binlog 部署目录的 conf/conf.json 文件里的 node_ip 是不是多了一个 ipv6 的地址。默认的部署脚本会通过 hostname -i 获取节点 ip,在机器有多个网卡时可能会获取到多个值,需要手动修正一下。