obbinlog 数据同步异常

【 使用环境 】生产环境
【 OB or 其他组件 】obbinlogV4.0.1 OceanBase 4.2.5.1 OBProxy4.3.2
【 使用版本 】社区版
【问题描述】使用binlog服务同步数据,同步任务中有一张表的数据来源于多张表 业务SQL如下:insert into A select * from B join C ,表A的数据来源于表B和表C。当表B里的数据记录修改后,下游是可以查到的,同步正常,但是表A的数据里的记录仍然是原记录。查看binlog实例的libcdc日志中没有 EDIAG 与 ERROR记录,全是INFO,obbinlog支持这种形式的同步吗
【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

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

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

2 个赞

根因分析场景: SQL 执行出错
根因分析命令: obdiag rca run --scene=sql_execution_error
日志采集场景: SQL性能问题
日志采集命令: obdiag gather scene run --scene=observer.perf_sql --env “{db_connect=’-h127.0.0.1 -P2881 -utest@test -p****** -Dtest’, trace_id=‘Yxx’}”

为了更好地诊断此问题,请您按照上述命令进行日志采集,并将生成的日志压缩包提供给我们。这些日志将帮助我们确认 binlog 同步过程中可能存在的问题。

另外,为了确定具体的问题,在此需要您提供一些信息:

  1. 您是否在执行 INSERT INTO A SELECT * FROM B JOIN C 时设置了特定的事务参数(如隔离级别)?
  2. 是否可以提供一个简单的测试用例或 SQL 脚本,以便我们复现该问题?
  3. 下游表 A 的结构是否与上游表 B 和 C 的结构完全兼容?例如字段类型、数量等是否一致?
  4. 是否可以确认 libcdc 日志中确实没有任何关于此操作的警告或错误记录?
  5. 您的 OceanBase 集群是否启用了 GTID 或其他同步相关的配置?如果是,请提供相关配置信息。

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

1 个赞

libcdc日志中频繁出现此类告警

1 个赞

根据您提供的 libcdc 日志内容,频繁出现的告警信息中包含 ret=-4169 和 ret=-4152 的错误代码。这些错误可能与 OceanBase 内部模块的日志解析或数据获取有关。以下是具体分析和建议:


1. 错误代码含义

  • ret=-4169:
    根据日志中的上下文,该错误通常表示未能找到子模块(sub_mod)或无法解析日志级别(log level)。这可能是由于配置文件中某些模块的名称或参数设置不正确导致的。

  • ret=-4152:
    该错误出现在 get_uint 函数调用中,表示在尝试从 MySQL 结果集中获取值时失败。这可能与 binlog 数据的序列化或反序列化过程有关。


2. 问题定位

结合您的问题描述和日志内容,以下是一些可能的原因:

  • binlog 同步机制限制:
    OceanBase 的 binlog 服务目前主要支持基于行变更的同步。对于复杂的 SQL 操作(如 INSERT INTO A SELECT * FROM B JOIN C),binlog 可能无法完全捕获所有依赖表的数据变更。因此,当表 B 的数据修改后,表 A 的记录未更新可能是由于 binlog 未正确记录相关依赖关系。

  • 日志解析问题:
    日志中频繁出现的 ret=-4169 错误可能表明 libcdc 在解析某些模块的日志时遇到了问题。这可能与 OceanBase 集群的版本兼容性或配置有关。

  • 数据类型不匹配:
    如果表 A 的字段类型与表 B 和表 C 的字段类型不完全一致,可能会导致 binlog 同步过程中数据丢失或异常。


3. 解决方案

短期解决方法

  1. 检查 binlog 配置:
    确保 binlog 配置正确,特别是 binlog_row_image 参数是否设置为 FULL。可以通过以下命令查看当前配置:

    SHOW VARIABLES LIKE 'binlog_row_image';
    

    如果不是 FULL,可以尝试将其设置为 FULL:

    SET GLOBAL binlog_row_image = 'FULL';
    
  2. 验证表结构一致性:
    确保表 A 的字段类型、数量等与表 B 和表 C 完全一致。如果不一致,可以尝试调整表结构以避免同步问题。

  3. 重启 binlog 服务:
    如果日志中频繁出现 ret=-4169 或 ret=-4152 错误,可以尝试重启 binlog 服务以清除潜在的缓存问题。

长期优化建议

  1. 升级版本:
    当前使用的 OceanBase 社区版 4.2.5.1 和 obbinlog V4.0.1 属于较新的版本,但仍可能存在一些已知问题。建议关注官方发布的补丁或新版本,及时升级以修复潜在的 bug。

  2. 使用 OMS 工具:
    如果条件允许,可以考虑使用 OceanBase Migration Service (OMS) 替代 obbinlog 进行数据同步。OMS 提供了更强大的数据复制功能,能够更好地处理复杂 SQL 场景。

  3. 调整业务逻辑:
    如果 binlog 同步确实无法满足需求,可以考虑调整业务逻辑,将复杂的 SQL 操作拆分为多个简单操作,确保每一步都能被 binlog 正确记录。


4. 进一步排查

如果上述方法仍无法解决问题,建议按照以下步骤进行进一步排查:

  1. 采集诊断日志:
    使用 obdiag 工具采集详细的诊断日志,包括 observer 和 libcdc 的日志:

    obdiag gather scene run --scene=observer.perf_sql --env "{db_connect='-h127.0.0.1 -P2881 -utest@test -p****** -Dtest', trace_id='Yxx'}"
    
  2. 联系技术支持:
    将采集到的日志压缩包提交给 OceanBase 技术支持团队,以便进一步分析问题根因。


5. 总结

根据现有信息,OceanBase 的 binlog 服务可能无法完全支持复杂的多表关联操作(如 INSERT INTO A SELECT * FROM B JOIN C)。建议先检查 binlog 配置和表结构一致性,并尝试重启服务或升级版本。如果问题仍未解决,可以使用 OMS 工具或调整业务逻辑作为替代方案。

如果您需要更多帮助,请随时提供更多信息或日志内容,我们将尽力为您解答!

详情请参考:

  1. 查看转储信息

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

1 个赞

按照理解 是操作问题吧 但是这个操作应该不符合事务吧 如果你直接修改A表的数据 应该是可以的吧

1 个赞

不支持是吧。我让业务改一下

1 个赞

还有就是我们数据同步不全,目标端跟源端数据有差距,libcdc里重复报这些告警信息
image

1 个赞

把这四个日志信息发一下吧 具体看看什么问题
binlog_instance.log

libobcdc.log

logproxy.log

obproxy.log

1 个赞

不用了,数据量不一致的原排查出来了

1 个赞

好的 下次再有问题 可以把上面的日志 直接提供好一下 方便排查