首页 > 解决方案 > 将 KafkaConnect JdbcDriver 与 Oracle 11g(Strimzi 运算符)一起使用时出现无用的 ORA 错误

问题描述

我正在使用 srimzi Kafka 运算符与 Confluent Cluster 一起使用来自 Confluent 的 JdbcSourceConnector 来实现 Oracle2Kafka 类型的 KafkaConnector。

KafkaConnector规范_

# connector 
connection.url: jdbc:oracle:thin:@HOST:PORT/SERVICE
connection.user: USER
connection.password: PASS
dialect.name: OracleDatabaseDialect
topic.prefix: test-topic-
mode: bulk
db.timezone: Europe/Madrid
table.whitelist: TEST_TABLE

但是我在 srimzi-cluster-operator日志中收到以下错误。

io.strimzi.operator.cluster.operator.assembly.ConnectRestException: PUT /connectors/confluent-cluster-int-20200706-02/config returned 400 (Bad Request): Connector configuration is invalid and contains the following 2 error(s):
Invalid value java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 43
 for configuration Couldn't open connection to jdbc:oracle:thin:@***:1534/***
Invalid value java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 43
 for configuration Couldn't open connection to jdbc:oracle:thin:@***:1534/***
You can also find the above list of errors at the endpoint `/connector-plugins/{connectorType}/config/validate`
    at io.strimzi.operator.cluster.operator.assembly.KafkaConnectApiImpl.lambda$null$2(KafkaConnectApi.java:208) ~[io.strimzi.cluster-operator-0.18.0.jar:0.18.0]

如果我修改源代码,我会得到一个非常具体的堆栈跟踪

2020-07-14 09:33:46,636 ERROR SQLException (io.confluent.connect.jdbc.source.JdbcSourceConnectorConfig) [qtp742672280-21]
java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 43

    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:509)
    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:456)
    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:451)
    at oracle.jdbc.driver.T4CTTIfun.processError(T4CTTIfun.java:1123)
    at oracle.jdbc.driver.T4CTTIoauthenticate.processError(T4CTTIoauthenticate.java:552)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:553)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:269)
    at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:501)
    at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:1292)
    at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:1025)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:747)
    at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:793)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:57)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:747)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:562)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:208)
    at io.confluent.connect.jdbc.dialect.GenericDatabaseDialect.getConnection(GenericDatabaseDialect.java:223)
    at io.confluent.connect.jdbc.source.JdbcSourceConnectorConfig$TableRecommender.validValues(JdbcSourceConnectorConfig.java:606)
    at io.confluent.connect.jdbc.source.JdbcSourceConnectorConfig$CachingRecommender.validValues(JdbcSourceConnectorConfig.java:653)
    at org.apache.kafka.common.config.ConfigDef.validate(ConfigDef.java:607)
    at org.apache.kafka.common.config.ConfigDef.validate(ConfigDef.java:622)
    at org.apache.kafka.common.config.ConfigDef.validate(ConfigDef.java:530)
    at org.apache.kafka.common.config.ConfigDef.validateAll(ConfigDef.java:513)
    at org.apache.kafka.common.config.ConfigDef.validate(ConfigDef.java:495)
    at org.apache.kafka.connect.connector.Connector.validate(Connector.java:135)

我已经检查过的一些事情

Dockerfile

FROM strimzi/kafka:0.18.0-kafka-2.5.0
USER root:root
COPY ./kafka-connect-jdbc-5.4.0.jar /opt/kafka/plugins/
COPY ./ojdbc6.jar /opt/kafka/libs/
USER 1001

结果

"value": {
  "name": "table.blacklist",
  "value": "",
  "recommended_values": [],
  "errors": ["Invalid value java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1\nORA-06502: PL/SQL: numeric or value error: character string buffer too small\nORA-06512: at line 43\n for configuration Couldn't open connection to jdbc:oracle:thin:@***:1534/***"],
"visible": true
}

我没有想法,欢迎任何提示x)

标签: oracleapache-kafka-connectconfluent-platform

解决方案


我不知道你使用的工具,但是 - 你得到的错误意味着:

SQL> declare
  2    l_var varchar2(1);       -- note length, only 1 character
  3  begin
  4    l_var := 'Littlefoot';   -- I'm little, but can't fit
  5  end;
  6  /
declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 4


SQL>

该怎么办?

SQL> declare
  2    l_var varchar2(20);      -- is that enough?
  3  begin
  4    l_var := 'Littlefoot'; 
  5  end;
  6  /

PL/SQL procedure successfully completed.         --> Yes, it is!

SQL>

因此,请检查代码中的大小


推荐阅读