【问题标题】:How to connect to external Oracle database in Docker如何在 Docker 中连接到外部 Oracle 数据库
【发布时间】:2020-06-14 21:44:23
【问题描述】:

我正在尝试连接到 docker 容器之外的 Oracle 数据库。我是 Docker 新手,不知道如何实现。在我的本地机器上,我可以通过提供主机、服务名称和端口或仅通过引用 tnsnames.ora 文件中提到的条目来连接到特定数据库。我已经在我的 Windows 10 机器上安装了 Docker。我的最终目标是使用 ksqlDB 在 kafka 主题上流式传输我的表。但是,第一步是连接到我的 oracle 数据库。我不确定从 Docker 连接到任何外部数据库源需要进行哪些修改或设置。我尝试了以下连接器配置,但这不起作用。

连接器配置:

CREATE SOURCE CONNECTOR jdbc_source WITH(
'connector.class'       =   'io.confluent.connect.jdbc.JdbcSourceConnector',
'connection.url'        =   'jdbc:oracle:thin://dv11-db.com:1521/dv11.db.com',
'connection.user'       =   'user',
'connection.password'   =   'password',
'topic.prefix'          =   'jdbc_',
'mode'                  =   'bulk',
'table.whitelist'       =   'batch_driver'
);

错误:

{
  "error_code" : 400,
  "message" : "Connector configuration is invalid and contains the following 2 error(s):\nInvalid value java.sql.SQLException: No suitable driver
found for jdbc:oracle:thin://dv11-db.com:1521/dv11.db.com for configuration Couldn't open connection to jdbc:oracle:thin://dv11-db.com:1521/dv11.db.com\nInvalid value java.sql.SQLException: No suitable driver found for jdbc:oracle:thin://dv11-db.com:1521/dv11.db.com for configuration Couldn't open connection to jdbc:oracle:thin://dv11-db.com:1521/dv11.db.com\nYou can also find the above list of errors at the endpoint `/{connectorType}/config/validate`"
}

Oracle 配置:

(DESCRIPTION =    (ADDRESS = (PROTOCOL = TCP)(HOST = dv11-db.com)(PORT = 1521))    (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = dv11.db.com)))

Docker-compose.yml

---
version: '2'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    hostname: zookeeper
    container_name: zookeeper
    ports:
      - "2181:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000

  broker:
    image: confluentinc/cp-enterprise-kafka:latest
    hostname: broker
    container_name: broker
    depends_on:
      - zookeeper
    ports:
      - "29092:29092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:9092,PLAINTEXT_HOST://localhost:29092
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1

  ksqldb-server:
    image: confluentinc/ksqldb-server:0.7.0
    hostname: ksqldb-server
    container_name: ksqldb-server
    depends_on:
      - broker
    ports:
      - "8088:8088"
    environment:
      KSQL_LISTENERS: http://0.0.0.0:8088
      KSQL_BOOTSTRAP_SERVERS: broker:9092
      KSQL_KSQL_LOGGING_PROCESSING_STREAM_AUTO_CREATE: "true"
      KSQL_KSQL_LOGGING_PROCESSING_TOPIC_AUTO_CREATE: "true"
      KSQL_KSQL_CONNECT_WORKER_CONFIG: "/connect/connect.properties"
      KSQL_CONNECT_GROUP_ID: "ksql-connect-cluster"
      KSQL_CONNECT_BOOTSTRAP_SERVERS: "broker:9092"
      KSQL_CONNECT_KEY_CONVERTER: "org.apache.kafka.connect.storage.StringConverter"
      KSQL_CONNECT_VALUE_CONVERTER: "org.apache.kafka.connect.json.JsonConverter"
      KSQL_CONNECT_VALUE_CONVERTER_SCHEMAS_ENABLE: "false"
      KSQL_CONNECT_CONFIG_STORAGE_TOPIC: "ksql-connect-configs"
      KSQL_CONNECT_OFFSET_STORAGE_TOPIC: "ksql-connect-offsets"
      KSQL_CONNECT_STATUS_STORAGE_TOPIC: "ksql-connect-statuses"
      KSQL_CONNECT_CONFIG_STORAGE_REPLICATION_FACTOR: 1
      KSQL_CONNECT_OFFSET_STORAGE_REPLICATION_FACTOR: 1
      KSQL_CONNECT_STATUS_STORAGE_REPLICATION_FACTOR: 1
      KSQL_CONNECT_PLUGIN_PATH: "/usr/share/kafka/plugins"
  volumes:
      - ./confluentinc-kafka-connect-jdbc-5.4.0:/usr/share/kafka/plugins/jdbc 

  ksqldb-cli:
    image: confluentinc/ksqldb-cli:0.7.0
    container_name: ksqldb-cli
    depends_on:
      - broker
      - ksqldb-server
    entrypoint: /bin/sh
    tty: true

【问题讨论】:

    标签: oracle docker apache-kafka apache-kafka-connect ksqldb


    【解决方案1】:

    java.sql.SQLException: 没有合适的驱动程序

    不是码头工人的问题。您没有将数据库驱动程序放在正确的位置

    它不应该进入/usr/share/kafka/plugins/jdbc

    它应该进入/usr/share/kafka-connect-jdbc

    参考https://www.confluent.io/blog/kafka-connect-deep-dive-jdbc-source-connector/

    在我的本地机器上,我可以通过提供主机、服务名称和端口或仅通过引用 tnsnames.ora 文件中提到的条目来连接到特定数据库

    不清楚您是如何连接的...来自代码?来自一些 Oracle 工具?

    如果您的数据库在另一台服务器上,Docker 的网络连接应该以完全相同的方式工作。您仍然需要设置驱动程序

    【讨论】:

    • 感谢您的回复。我已按照建议编辑了我的 docker-compose.yml 文件。但是现在,我遇到以下错误:error_code" : 500, "message" : "找不到任何实现连接器并且名称与 io.confluent.connect.jdbc.JdbcSourceConnector 匹配的类,可用的连接器是:PluginDesc{klass=class org.apache.kafka.connect.tools.MockConnector, name='org.apache.kafka.connect.tools.MockConnector', version='5.5.0-ccs-beta200204173843', encodedVersion=5.5.0-ccs-beta200204173843,类型=连接....等.... }
    • 你为什么使用 5.5 beta 版本的东西?请不要使用最新标签。试试 5.4.0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多