Canal协议解析

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:
【 TiDB 使用环境】4.0.9

如下,我只拿到了一条TRANSACTIONBEGIN事件,不应该是RowChange事件吗?
代码片段:


17:51:40.069 [main] DEBUG c.m.r.s.c.p.TiCDCCanalBatchProcessor - entry : entryType: TRANSACTIONBEGIN
3: 7
3: 7
5: {
  2: {
    1: {
      1: 1
      5: {
        10: 0x382d4654
      }
      6: 1628070095085
      7: 2
      8: "feature"
      9: "mtxx_feed_media"
      11: 1
      12: {
        1: "rowsCount"
        2: "1"
      }
    }
    2: 2
    3: {
      2: 1
      10: 0
      12: {
        2: {
          2: 12
          3: {
            13: 0x61696465
          }
          4: 1
          5: 1
          6: 0
          8: "3"
          10: "varchar"
        }
        2: {
          2: 93
          3: "create_time"
          5: 1
          6: 0
          8: "2021-08-04 17:41:35"
          10: "timestamp"
        }
        2: {
          2: 93
          3: "update_time"
          5: 1
          6: 0
          8: "2021-08-04 17:41:35"
          10: "timestamp"
        }
        2: {
          2: 12
          3: "media_id_old"
          5: 1
          6: 1
          10: "text"
        }
        2: {
          2: 12
          3: "media_id"
          5: 1
          6: 1
          10: "text"
        }
        2: {
          2: 12
          3: "media_content_tag_two"
          5: 1
          6: 0
          8: "aaa"
          10: "text"
        }
      }
    }
  }
}
5: {
  2: {
    1: {
      1: 1
      5: {
        10: 0x382d4654
      }
      6: 1628070125435
      7: 2
      8: "feature"
      9: "mtxx_feed_media"
      11: 1
      12: {
        1: "rowsCount"
        2: "1"
      }
    }
    2: 2
    3: {
      2: 1
      10: 0
      12: {
        2: {
          2: 12
          3: {
            13: 0x61696465
          }
          4: 1
          5: 1
          6: 0
          8: "4"
          10: "varchar"
        }
        2: {
          2: 93
          3: "create_time"
          5: 1
          6: 0
          8: "2021-08-04 17:42:05"
          10: "timestamp"
        }
        2: {
          2: 93
          3: "update_time"
          5: 1
          6: 0
          8: "2021-08-04 17:42:05"
          10: "timestamp"
        }
        2: {
          2: 12
          3: "media_id_old"
          5: 1
          6: 1
          10: "text"
        }
        2: {
          2: 12
          3: "media_id"
          5: 1
          6: 1
          10: "text"
        }
        2: {
          2: 12
          3: "media_content_tag_two"
          5: 1
          6: 0
          8: "aaa"
          10: "text"
        }
      }
    }
  }
}

17:51:40.202 [main] DEBUG c.m.r.s.c.p.TiCDCCanalBatchProcessor - header: false
17:51:40.203 [main] DEBUG c.m.r.s.c.p.TiCDCCanalBatchProcessor - value: false

HI ~ 可以完善一下前后文背景信息么?建议详细描述一下背景,操作,遇到的问题。以及现在现象报错 。

遇到的问题是这边解析pb的byte数组不大理解;怀疑是我解析的有问题;这边实际进行的操作是update了多次了;但解析出来的是TRANSACTIONBEGIN类型;难道每个字段都要parseFrom一下吗?不是parseFrom一次之后可以拿到所有字段

大概场景如前代码所示,我想要从pb的字节数组中解析出CanalEntry对象;但是我这边解析出来的明显有问题,比如hasHeader是false,hasStoreValue也是false

你只是说明了你遇到的问题,但是没描述你的问题相关的场景,以及相关的组件,以及你的预期和实际的差异…

这样也帮不了你的…

:dog:场景是tidb+ticdc+kafka,消费kafka同步到下游redis
ticdc选择了canal协议,这边离线测试方便先python写字节流到了文件中
预期是解析字节数组为CanalEntry的Entry对象,
实际使用parseFrom函数,解析出来乱七八糟

Canal 你选择的什么格式来进行传递的?Json 还是别的?

如果你怀疑CDC这边传递的数据格式不对,不妨用Json的格式先看看,

在CDC 的日志,以及Kafka 的 topic 中的数据是否一致

json是带有观测性的,可以解决你的问题

ProtoBuffer
请问Canal-json协议怎么指定呢?是哪个参数,可以给个例子吗?
确实json更简单些,没想到parse PB走了不少弯路,阿里给的例子也不大适合



官网上好像有文档有这块的说明,你可以搜下

https://docs.pingcap.com/zh/tidb/dev/troubleshoot-ticdc#ticdc-是否支持输出-canal-格式的变更数据

确认下哈,protocol=canal-json就可以使用json对吧