如何配置Oracle GoldenGate将字段视为二进制/BLOB处理?
解决Oracle GoldenGate CDC处理VARCHAR存储二进制内容的字符解码错误
问题根源
你碰到的MalformedInputException是因为OGG默认会把VARCHAR字段按数据库的EBCDIC字符集解码成字符数据,再执行@BINARY转换——但你的字段实际存的是二进制内容(不是合法的EBCDIC字符),解码环节直接失败。
解决方案
要让OGG直接读取字段的原始字节、跳过字符集转换,按以下步骤调整配置:
1. 在Extract进程中指定字段为原始二进制类型
修改Extract的参数文件,针对目标表的特定字段使用@RAW函数,强制OGG以原始字节形式读取,不做字符解码:
TABLE your_schema.your_table, COLS ( col1, col2, -- 其他正常字段 myNonBinaryField = @RAW(myNonBinaryField) );
@RAW函数会直接获取字段的原始字节流,完全绕过字符集转换逻辑,从根源避免解码错误。
2. 配置Kafka Connect Handler映射二进制类型
确保Kafka Connect Handler把RAW类型的字段映射为Kafka的二进制(bytes)类型,在Handler的配置文件中添加:
gg.handler.kafkaconnect.columnMapping=myNonBinaryField:bytes
这样下游服务就能接收到原样的二进制字节流。
3. 全局禁用字符集转换(可选)
如果你的表中大部分VARCHAR字段都用来存储二进制内容,可以在Extract参数中全局禁用字符集转换:
FETCHOPTIONS NOCHARSETCONVERSION
⚠️ 注意:这个参数会影响所有字符类型字段,只有当所有VARCHAR都存二进制时才用,否则会导致正常字符字段无法正确转换编码。
验证
启动Extract进程后,检查OGG日志是否不再出现MalformedInputException错误,同时通过Kafka消费者查看消息,确认myNonBinaryField的内容是原始二进制字节,没有被字符转换。
内容的提问来源于stack exchange,提问作者Domenico Lorusso
相关产品推荐
相关产品推荐

