Drainer下放给kafka的binlog日志乱码

tidb:v3.0.0

问题过程: 1、向tidb插入一条数据:

2、pump日志: 3、drainer日志: 4、使用kafka的java客户端从主题拉去消息: 5、kafak监控得到的消息: 6、使用kafak客户端查看消息也是乱码的:

可以看到kafka里边的消息都是乱码的。

为了排除是kafak本身乱码的问题,我们自己新建了一个topic,往里边发送了中文,消费的时候能正常消费中文消息,即,kafka的编码设置是OK的: 建立主题,生产中文消息:

消费中文消息: 数据库和表编码格式都是utf-8: image
请问在哪里设置binlog的编码? binlog的格式自定义的详细文档有吗?

tidb 中表的字符集是什么样?

建立数据库语句: create schema schema_test character set utf8 COLLATE utf8_bin;

建表语句: CREATE TABLE test_code_a(id int AUTO_INCREMENT, name varchar(100),update_time datetime, create_time datetime, PRIMARY KEY (id) ) CHARACTER SET utf8 COLLATE utf8_bin;

tidb字符集: image

检查下 client 端有没有特殊设置

client指的是navicat还是其他的东西?

代码里读 kafka 时候有没有做设置

代码里边没有和编码相关的设置。使用kafka的命令行客户端也是乱码的,感觉不是java客户端的问题。

kafka客户端乱码:

写入的时候没有乱码,只有在 kafka 读出来的时候出现了乱码,推测就不是 TiDB 的问题,tidb-binlog 本身没有字符集设置。

我做了测试,6717826900501472462_obinlog这个主题是tidb生成的,然后我往里边发送了一条中文的消息"我是社会主义接班人。":


然后在kafka的java客户端消费者去消费的时候,可以看到能正常的得到中文的内容:
这样是否能证明drainer发送到kafka的消息是乱码的?

发给 kafka 的消息是用 Protobuf 编码成二进制的,用 Protobuf decode 之前就是二进制的内容,不是可以直接用肉眼看的字符串之类的内容。https://github.com/pingcap/tidb-tools/blob/master/tidb-binlog/slave_binlog_proto/proto/binlog.proto 看下这里。

看下官方文档介绍哈:https://pingcap.com/docs-cn/v3.0/reference/tools/tidb-binlog/binlog-slave-client/#配置-kafka-drainer

换成 ByteArrayDeserializer 而不是String 试试,参考 Java解析drainer发送到kafka中的binlog异常