Oracle 19c通过Debezium XStream连接Kafka失败求助
问题:Debezium XStream连接Oracle 19c失败,提示getOCIHandles特性不支持
使用Oracle DB 19c,通过Debezium XStream连接远程Kafka时,连接器任务运行失败。已为操作用户授予全部权限,但无法附加到XStream outbound server(dbzxout),报错提示Unsupported feature: getOCIHandles。
连接器状态
{ "name": "ag-test3", "connector": { "state": "RUNNING", "worker_id": "alt-ads-d3.domain.corp:8083" }, "tasks": [ { "id": 0, "state": "FAILED", "worker_id": "alt-ads-d3.domain.corp:8083", "trace": "org.apache.kafka.connect.errors.ConnectException: An exception occurred in the change event producer. This connector will be stopped.\n\tat io.debezium.pipeline.ErrorHandler.setProducerThrowable(ErrorHandler.java:67)\n\tat io.debezium.connector.oracle.xstream.XstreamStreamingChangeEventSource.execute(XstreamStreamingChangeEventSource.java:144)\n\tat io.debezium.connector.oracle.xstream.XstreamStreamingChangeEventSource.execute(XstreamStreamingChangeEventSource.java:45)\n\tat io.debezium.pipeline.ChangeEventSourceCoordinator.streamEvents(ChangeEventSourceCoordinator.java:205)\n\tat io.debezium.pipeline.ChangeEventSourceCoordinator.executeChangeEventSources(ChangeEventSourceCoordinator. }
Kafka连接器日志
[2023-08-22 19:02:05,300] ERROR WorkerSourceTask{id=ag-test3-0} Task threw an uncaught and unrecoverable exception. Task is being killed and will not recover until manually restarted (org.apache.kafka.connect.runtime.WorkerTask:190) org.apache.kafka.connect.errors.ConnectException: An exception occurred in the change event producer. This connector will be stopped. at io.debezium.pipeline.ErrorHandler.setProducerThrowable(ErrorHandler.java:67) at io.debezium.connector.oracle.xstream.XstreamStreamingChangeEventSource.execute(XstreamStreamingChangeEventSource.java:144) at io.debezium.connector.oracle.xstream.XstreamStreamingChangeEventSource.execute(XstreamStreamingChangeEventSource.java:45) at io.debezium.pipeline.ChangeEventSourceCoordinator.streamEvents(ChangeEventSourceCoordinator.java:205) at io.debezium.pipeline.ChangeEventSourceCoordinator.executeChangeEventSources(ChangeEventSourceCoordinator.java:172) at io.debezium.pipeline.ChangeEventSourceCoordinator.lambda$start$0(ChangeEventSourceCoordinator.java:118) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829) Caused by: oracle.streams.StreamsException: Oracle XStreamOut: failed to attach to XStream outbound server(dbzxout) at oracle.streams.XStreamOut.attachInternal(XStreamOut.java:386) at oracle.streams.XStreamOut.attach(XStreamOut.java:343) at io.debezium.connector.oracle.xstream.XstreamStreamingChangeEventSource.execute(XstreamStreamingChangeEventSource.java:119) ... 9 more Caused by: java.sql.SQLFeatureNotSupportedException: Unsupported feature: getOCIHandles at oracle.jdbc.driver.PhysicalConnection.getOCIHandles(PhysicalConnection.java:6559) at oracle.streams.XStreamOut.attachInternal(XStreamOut.java:367) ... 11 more
连接器配置
{ "name": "ag-test3", "auto.create.topics.enable": "true", "config.action.reload": "restart", "connector.class": "io.debezium.connector.oracle.OracleConnector", "database.connection.adapter": "xstream", "database.dbname": "ponpd", "database.history.kafka.bootstrap.servers": "***", "database.history.kafka.topic": "testagdebezium.oracle6", "database.hostname": "***", "database.out.server.name": "dbzxout", "database.password": "***", "database.port": "1521", "database.url": "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.33.94)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ponpd)))", "database.user": "dbzuser", "errors.log.enable": "true", "errors.log.include.messages": "true", "errors.retry.delay.max.ms": "60000", "errors.retry.timeout": "0", "errors.tolerance": "none", "include.schema.changes": "true", "include.schema.comments": "true", "internal.snapshot.scan.all.columns.force": "true", "key.converter": "org.apache.kafka.connect.storage.StringConverter", "key.converter.schemas.enable": "false", "schema.history.internal.kafka.bootstrap.servers": "***", "schema.history.internal.kafka.topic": "schema-changes.inventory", "snapshot.mode": "always", "table.include.list": "customers", "tasks.max": "1", "topic.prefix": "testagdebezium.oracle6", "value.converter": "org.apache.kafka.connect.json.JsonConverter", "value.converter.schemas.enable": "false" }
问题原因及解决办法
核心原因
报错getOCIHandles不支持,是因为Debezium的XStream适配器依赖Oracle OCI驱动的特性,但当前使用的是JDBC Thin驱动——Thin驱动不支持getOCIHandles方法,而XStream的Java API需要通过OCI驱动获取底层句柄才能完成连接。
解决步骤
替换为Oracle OCI驱动
下载对应Oracle 19c版本的OCI驱动包(可从Oracle官网获取,包含在Instant Client或JDBC驱动包的OCI组件中),将驱动jar包放到Debezium/Kafka Connect的lib目录下,确保驱动版本与数据库版本一致。修改JDBC连接URL
将原Thin驱动的URL替换为OCI驱动格式,示例:jdbc:oracle:oci:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.33.94)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ponpd)))或简化格式:
jdbc:oracle:oci://192.168.33.94:1521/ponpd配置Oracle客户端环境(Linux/Windows)
- 安装Oracle Instant Client到Kafka Connect所在服务器
- 设置环境变量:
ORACLE_HOME指向Instant Client目录,将其bin目录添加到PATH;Linux需额外设置LD_LIBRARY_PATH指向Instant Client的库文件目录
验证XStream与权限配置
- 确认
dbzuser拥有XSTREAM_ADMIN角色,且已被授权访问dbzxout服务器 - 执行Oracle命令验证XStream服务状态:
确保SELECT SERVER_NAME, STATUS FROM DBA_XSTREAM_OUTBOUND;dbzxout状态为ENABLED
- 确认
重启服务与连接器
替换驱动、修改配置后,重启Kafka Connect服务,手动重启连接器任务即可。
内容的提问来源于stack exchange,提问作者kekcment
相关产品推荐
相关产品推荐

