---
title: "通过 DataHub 管理 OceanBase 数据源 - OceanBase 数据库 V4.3.5 | OceanBase 文档中心"
description: 通过 DataHub 管理 OceanBase 数据源 概述 DataHub 是一个现代数据目录，旨在实现端到端数据发现、数据可观察性和数据治理。 本文介绍如何使用 OceanBase 作为后端存储部署 DataHub 服务，以及通过简单示例演示 OceanBase 元数据管理。 版本兼容性 OceanBase 版本…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.3.5 LTS

# 通过 DataHub 管理 OceanBase 数据源

更新时间：2026-04-09 14:12:04

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.3.5/zh-CN/680.ecological-integration/1000.management/300.datahub.md)  

## 概述

DataHub 是一个现代数据目录，旨在实现端到端数据发现、数据可观察性和数据治理。 本文介绍如何使用 OceanBase 作为后端存储部署 DataHub 服务，以及通过简单示例演示 OceanBase 元数据管理。

## 版本兼容性

- OceanBase 版本：≥ V4.2.4。
 - DataHub 版本：1.4.0.2（示例版本）。

## 前提条件

在使用 DataHub 之前，确认：

- 您已完成部署 OceanBase 数据库并且创建了 MySQL 模式用户租户。创建用户租户的详细信息，参见 [创建租户](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013128) 。
 - 已完成 Docker 部署，Docker 服务正在运行，且当前用户具备执行 docker 命令的权限（可通过 docker info 验证）。
 - 已安装 Docker Compose V2 (可通过 docker-compose 验证) 。
 - 已安装 Python 3.10+ 和 pip 。

### 步骤一：获取数据库连接串

联系OceanBase数据库部署人员获取连接串，例如：

```shell
obclient -h$host -P$port -u$user_name -p$password -D$database_name

```

**参数说明：**

- `$host`：连接IP。ODP连接用ODP地址；直连用OBServer IP。
 - `$port`：连接端口。ODP默认`2883`；直连默认`2881`。
 - `$database_name`：数据库名称。  

  #### 注意

  连接租户的用户需要拥有该数据库的 `CREATE`、`INSERT`、`DROP` 和 `SELECT` 权限。更多有关用户权限的信息，请参见 [MySQL 模式下的权限分类](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002016100)。
 - `$user_name`：连接账户。ODP格式：`用户@租户#集群`或`集群:租户:用户`；直连格式：`用户@租户`。
 - `$password`：账户密码。

更多连接串的信息，请参见[通过 OBClient 连接 OceanBase 租户](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013251)。

**示例如下：**

```shell
obclient -hxxx.xxx.xxx.xxx -P2881 -utest_user001@mysql001 -p****** -Dtest

```

### 步骤二：配置 DataHub 使用 OceanBase 作为后端存储

1. 安装依赖并配置环境变量。

```shell
python3 -m pip install pip wheel setuptools
python3 -m pip install acryl-datahub==1.4.0.2
datahub version #，获取datahub版本信息，例如1.4.0.2

# 1. 设置必要的环境变量
datahub_version="1.4.0.2"

cat > .env << EOF
DATAHUB_VERSION=v${datahub_version}
UI_INGESTION_DEFAULT_CLI_VERSION=${datahub_version}

# 数据库配置
host=your_database_host
port=your_database_port
user_name=your_database_username
password=your_database_password
database_name=your_database_dbname
EOF

source .env

```

获取数据库地址、端口号、数据库名、用户名和密码参见步骤一。

2. 部署 DataHub。

```yaml
cat > docker-compose.quickstart-profile.yml << 'EOF'
# This file is generated as part of build process. If any build changes cause this file to be modified, please check in the generated file
name: datahub
services:
  datahub-actions-quickstart:
    profiles:
    - quickstart
    - quickstart-backend
    depends_on:
      datahub-gms-quickstart:
        condition: service_healthy
        required: true
    environment:
      ACTIONS_CONFIG: ''
      ACTIONS_EXTRA_PACKAGES: ''
      DATAHUB_GMS_HOST: datahub-gms
      DATAHUB_GMS_PORT: '8080'
      DATAHUB_GMS_PROTOCOL: http
      DATAHUB_SYSTEM_CLIENT_ID: __datahub_system
      DATAHUB_SYSTEM_CLIENT_SECRET: JohnSnowKnowsNothing
      ELASTICSEARCH_HOST: search
      ELASTICSEARCH_PORT: '9200'
      ELASTICSEARCH_PROTOCOL: http
      ELASTICSEARCH_USE_SSL: 'false'
      KAFKA_BOOTSTRAP_SERVER: broker:29092
      KAFKA_PROPERTIES_SECURITY_PROTOCOL: PLAINTEXT
      METADATA_AUDIT_EVENT_NAME: MetadataAuditEvent_v4
      METADATA_CHANGE_LOG_VERSIONED_TOPIC_NAME: MetadataChangeLog_Versioned_v1
      SCHEMA_REGISTRY_URL: http://datahub-gms:8080/schema-registry/api/
    hostname: actions
    image: acryldata/datahub-actions:${DATAHUB_VERSION}-slim
    networks:
      default: null
    volumes:
    - type: bind
      source: ${HOME}/.aws
      target: /home/datahub/.aws
      read_only: true
      bind:
        create_host_path: true
    - type: bind
      source: ${HOME}/.aws/sso/cache
      target: /home/datahub/.aws/sso/cache
      bind:
        create_host_path: true
  datahub-gms-quickstart:
    profiles:
    - quickstart
    - quickstart-backend
    depends_on:
      system-update-quickstart:
        condition: service_completed_successfully
        required: true
    environment:
      ALTERNATE_MCP_VALIDATION: 'true'
      DATAHUB_BASE_PATH: /
      DATAHUB_GMS_BASE_PATH: /
      DATAHUB_SERVER_TYPE: quickstart
      DATAHUB_TELEMETRY_ENABLED: 'false'
      DATAHUB_UPGRADE_HISTORY_KAFKA_CONSUMER_GROUP_ID: generic-duhe-consumer-job-client-gms
      EBEAN_DATASOURCE_DRIVER: com.mysql.jdbc.Driver
      EBEAN_DATASOURCE_HOST: $host:$port
      EBEAN_DATASOURCE_USERNAME: $user_name
      EBEAN_DATASOURCE_PASSWORD: $password
      EBEAN_DATASOURCE_URL: jdbc:mysql://$host:$port/$database_name?verifyServerCertificate=false&useSSL=true&useUnicode=yes&characterEncoding=UTF-8
      ELASTICSEARCH_HOST: search
      ELASTICSEARCH_IMPLEMENTATION: opensearch
      ELASTICSEARCH_INDEX_BUILDER_MAPPINGS_REINDEX: 'true'
      ELASTICSEARCH_INDEX_BUILDER_SETTINGS_REINDEX: 'true'
      ELASTICSEARCH_LIMIT_RESULTS_STRICT: 'true'
      ELASTICSEARCH_PORT: '9200'
      ELASTICSEARCH_PROTOCOL: http
      ELASTICSEARCH_USE_SSL: 'false'
      ENTITY_REGISTRY_CONFIG_PATH: /datahub/datahub-gms/resources/entity-registry.yml
      ENTITY_SERVICE_ENABLE_RETENTION: 'true'
      ENTITY_VERSIONING_ENABLED: 'true'
      ES_BULK_REFRESH_POLICY: WAIT_UNTIL
      GRAPH_SERVICE_DIFF_MODE_ENABLED: 'true'
      GRAPH_SERVICE_IMPL: elasticsearch
      JAVA_OPTS: -Xms1g -Xmx1g
      KAFKA_BOOTSTRAP_SERVER: broker:29092
      KAFKA_SCHEMAREGISTRY_URL: http://datahub-gms:8080/schema-registry/api/
      MAE_CONSUMER_ENABLED: 'true'
      MCE_CONSUMER_ENABLED: 'true'
      METADATA_SERVICE_AUTH_ENABLED: 'false'
      NEO4J_HOST: http://neo4j:7474
      NEO4J_PASSWORD: datahub
      NEO4J_URI: bolt://neo4j
      NEO4J_USERNAME: neo4j
      PE_CONSUMER_ENABLED: 'true'
      POLICY_CACHE_REFRESH_INTERVAL_SECONDS: '120'
      SCHEMA_REGISTRY_TYPE: INTERNAL
      SEARCH_BAR_API_VARIANT: SEARCH_ACROSS_ENTITIES
      SHOW_HAS_SIBLINGS_FILTER: 'true'
      SHOW_HOME_PAGE_REDESIGN: 'true'
      SHOW_INGESTION_PAGE_REDESIGN: 'true'
      SHOW_SEARCH_BAR_AUTOCOMPLETE_REDESIGN: 'true'
      STRICT_URN_VALIDATION_ENABLED: 'true'
      THEME_V2_DEFAULT: 'true'
      UI_INGESTION_ENABLED: 'true'
      UI_INGESTION_DEFAULT_CLI_VERSION: ${UI_INGESTION_DEFAULT_CLI_VERSION}
    hostname: datahub-gms
    healthcheck:
      test:
      - CMD-SHELL
      - curl -sS --fail http://datahub-gms:8080/health
      timeout: 5s
      interval: 1s
      retries: 3
      start_period: 1m30s
    image: acryldata/datahub-gms:${DATAHUB_VERSION}
    labels:
      io.datahubproject.datahub.component: gms
    networks:
      default: null
    ports:
    - mode: ingress
      target: 8080
      published: ${DATAHUB_MAPPED_GMS_PORT:-8080}
      protocol: tcp
    volumes:
    - type: bind
      source: ${HOME}/.datahub/plugins
      target: /etc/datahub/plugins
      bind:
        create_host_path: true
    - type: bind
      source: ${HOME}/.datahub/search
      target: /etc/datahub/search
      bind:
        create_host_path: true
  frontend-quickstart:
    profiles:
    - quickstart
    - quickstart-frontend
    depends_on:
      system-update-quickstart:
        condition: service_completed_successfully
        required: true
    environment:
      DATAHUB_APP_VERSION: ${DATAHUB_VERSION}
      DATAHUB_BASE_PATH: /
      DATAHUB_GMS_BASE_PATH: /
      DATAHUB_GMS_HOST: datahub-gms
      DATAHUB_GMS_PORT: '8080'
      DATAHUB_PLAY_MEM_BUFFER_SIZE: 10MB
      DATAHUB_SECRET: YouKnowNothing
      DATAHUB_TRACKING_TOPIC: DataHubUsageEvent_v1
      ELASTIC_CLIENT_HOST: elasticsearch
      ELASTIC_CLIENT_PORT: '9200'
      JAVA_OPTS: -Xms512m -Xmx512m -Dhttp.port=9002 -Dconfig.file=datahub-frontend/conf/application.conf -Djava.security.auth.login.config=datahub-frontend/conf/jaas.conf
        -Dlogback.configurationFile=datahub-frontend/conf/logback.xml -Dlogback.debug=false -Dpidfile.path=/dev/null
      KAFKA_BOOTSTRAP_SERVER: broker:29092
      PLAY_HTTP_CONTEXT: /
      THEME_V2_DEFAULT: 'true'
    hostname: datahub-frontend-react
    image: acryldata/datahub-frontend-react:${DATAHUB_VERSION}
    networks:
      default: null
    ports:
    - mode: ingress
      target: 9002
      published: ${DATAHUB_MAPPED_FRONTEND_PORT:-9002}
      protocol: tcp
    volumes:
    - type: bind
      source: ${HOME}/.datahub/plugins
      target: /etc/datahub/plugins
      bind:
        create_host_path: true
  kafka-broker:
    command:
    - /bin/bash
    - -c
    - |
      # Generate KRaft clusterID
      file_path="/var/lib/kafka/data/clusterID"

      if [ ! -f "$$file_path" ]; then
         /bin/kafka-storage random-uuid > $$file_path
         echo "Cluster id has been created..."
         # KRaft required step: Format the storage directory with a new cluster ID
         kafka-storage format --ignore-formatted -t $$(cat "$$file_path") -c /etc/kafka/kafka.properties
      fi

      export CLUSTER_ID=$$(cat "$$file_path")
      echo "CLUSTER_ID=$$CLUSTER_ID"

      /etc/confluent/docker/run
    environment:
      KAFKA_ADVERTISED_LISTENERS: BROKER://broker:29092,EXTERNAL://localhost:9092
      KAFKA_BROKER_ID: '1'
      KAFKA_CONFLUENT_SUPPORT_METRICS_ENABLE: 'false'
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@broker:39092
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: '0'
      KAFKA_HEAP_OPTS: -Xms512m -Xmx512m
      KAFKA_INTER_BROKER_LISTENER_NAME: BROKER
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,BROKER:PLAINTEXT,EXTERNAL:PLAINTEXT
      KAFKA_LISTENERS: BROKER://broker:29092,EXTERNAL://broker:9092,CONTROLLER://broker:39092
      KAFKA_LOG4J_LOGGERS: org.apache.kafka.image.loader.MetadataLoader=WARN
      KAFKA_MAX_MESSAGE_BYTES: '5242880'
      KAFKA_MESSAGE_MAX_BYTES: '5242880'
      KAFKA_NODE_ID: '1'
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: '1'
      KAFKA_PROCESS_ROLES: controller, broker
      KAFKA_ZOOKEEPER_CONNECT: null
    hostname: broker
    healthcheck:
      test:
      - CMD-SHELL
      - nc -z broker $${DATAHUB_KAFKA_BROKER_PORT:-9092}
      timeout: 5s
      interval: 1s
      retries: 5
      start_period: 1m0s
    image: confluentinc/cp-kafka:8.0.0
    networks:
      default: null
    ports:
    - mode: ingress
      target: 9092
      published: '9092'
      protocol: tcp
    volumes:
    - type: volume
      source: broker
      target: /var/lib/kafka/data
      volume: {}
  opensearch:
    profiles:
    - quickstart
    - quickstart-backend
    - quickstart-actions
    - quickstart-frontend
    - quickstart-storage
    - quickstart-cassandra
    - quickstart-postgres
    - quickstart-postgres-cdc
    - quickstart-consumers
    - quickstart-consumers-cdc
    - debug
    - debug-min
    - debug-datahub-actions
    - debug-frontend
    - debug-backend
    - debug-postgres
    - debug-postgres-cdc
    - debug-cassandra
    - debug-consumers
    - debug-consumers-cdc
    - debug-neo4j
    - debug-backend-aws
    - debug-aws
    environment:
      DISABLE_SECURITY_PLUGIN: 'true'
      ES_JAVA_OPTS: -Xms256m -Xmx512m -Dlog4j2.formatMsgNoLookups=true
      OPENSEARCH_JAVA_OPTS: -Xms768m -Xmx1024m -Dlog4j2.formatMsgNoLookups=true
      discovery.type: single-node
    hostname: search
    healthcheck:
      test:
      - CMD-SHELL
      - curl -sS --fail http://search:$${DATAHUB_ELASTIC_PORT:-9200}/_cluster/health?wait_for_status=yellow&timeout=0s
      timeout: 15s
      interval: 5s
      retries: 10
      start_period: 1m0s
    image: opensearchproject/opensearch:2.19.3
    networks:
      default: null
    ports:
    - mode: ingress
      target: 9200
      published: '9200'
      protocol: tcp
    volumes:
    - type: volume
      source: osdata
      target: /usr/share/opensearch/data
      volume: {}
  opensearch-setup:
    profiles:
    - quickstart
    - quickstart-datahub-actions
    - quickstart-backend
    - quickstart-frontend
    - quickstart-storage
    - quickstart-cassandra
    - quickstart-postgres
    - quickstart-postgres-cdc
    - quickstart-consumers
    - quickstart-consumers-cdc
    command:
    - /bin/sh
    - -c
    - /create-indices.sh
    depends_on:
      opensearch:
        condition: service_healthy
        required: true
    environment:
      ELASTICSEARCH_HOST: search
      ELASTICSEARCH_PORT: '9200'
      ELASTICSEARCH_PROTOCOL: http
      ELASTICSEARCH_USE_SSL: 'false'
      USE_AWS_ELASTICSEARCH: 'true'
    hostname: opensearch-setup
    image: acryldata/datahub-elasticsearch-setup:${DATAHUB_VERSION}
    labels:
      datahub_setup_job: 'true'
    networks:
      default: null
  system-update-quickstart:
    profiles:
    - quickstart
    - quickstart-storage
    - quickstart-consumers
    - quickstart-frontend
    - quickstart-backend
    command:
    - -u
    - SystemUpdate
    depends_on:
      opensearch:
        condition: service_healthy
        required: true
      opensearch-setup:
        condition: service_completed_successfully
        required: true
    environment:
      BACKFILL_BROWSE_PATHS_V2: 'true'
      CREATE_USER: 'false'
      CREATE_USER_PASSWORD: datahub
      CREATE_USER_USERNAME: datahub
      DATAHUB_BASE_PATH: /
      DATAHUB_GMS_BASE_PATH: /
      DATAHUB_GMS_HOST: datahub-gms
      DATAHUB_GMS_PORT: '8080'
      DATAHUB_PRECREATE_TOPICS: 'true'
      DATAHUB_SQL_SETUP_ENABLED: 'true'
      EBEAN_DATASOURCE_DRIVER: com.mysql.jdbc.Driver
      EBEAN_DATASOURCE_HOST: $host:$port
      EBEAN_DATASOURCE_USERNAME: $user_name
      EBEAN_DATASOURCE_PASSWORD: $password
      EBEAN_DATASOURCE_URL: jdbc:mysql://$host:$port/$database_name?verifyServerCertificate=false&useSSL=true&useUnicode=yes&characterEncoding=UTF-8
      ELASTICSEARCH_BUILD_INDICES_CLONE_INDICES: 'false'
      ELASTICSEARCH_HOST: search
      ELASTICSEARCH_IMPLEMENTATION: opensearch
      ELASTICSEARCH_INDEX_BUILDER_MAPPINGS_REINDEX: 'true'
      ELASTICSEARCH_INDEX_BUILDER_REFRESH_INTERVAL_SECONDS: '3'
      ELASTICSEARCH_INDEX_BUILDER_SETTINGS_REINDEX: 'true'
      ELASTICSEARCH_PORT: '9200'
      ELASTICSEARCH_PROTOCOL: http
      ELASTICSEARCH_USE_SSL: 'false'
      ENTITY_REGISTRY_CONFIG_PATH: /datahub/datahub-gms/resources/entity-registry.yml
      ENTITY_VERSIONING_ENABLED: 'true'
      GRAPH_SERVICE_IMPL: elasticsearch
      KAFKA_BOOTSTRAP_SERVER: broker:29092
      KAFKA_SCHEMAREGISTRY_URL: http://datahub-gms:8080/schema-registry/api/
      NEO4J_HOST: http://neo4j:7474
      NEO4J_PASSWORD: datahub
      NEO4J_URI: bolt://neo4j
      NEO4J_USERNAME: neo4j
      PARTITIONS: '3'
      REPROCESS_DEFAULT_BROWSE_PATHS_V2: 'false'
      SCHEMA_REGISTRY_SYSTEM_UPDATE: 'true'
      SCHEMA_REGISTRY_TYPE: INTERNAL
      SPRING_KAFKA_PROPERTIES_AUTO_REGISTER_SCHEMAS: 'true'
      SPRING_KAFKA_PROPERTIES_USE_LATEST_VERSION: 'true'
      USE_CONFLUENT_SCHEMA_REGISTRY: 'false'
    hostname: datahub-system-update
    image: acryldata/datahub-upgrade:${DATAHUB_VERSION}
    labels:
      datahub_setup_job: 'true'
    networks:
      default: null
    volumes:
    - type: bind
      source: ${HOME}/.datahub/plugins
      target: /etc/datahub/plugins
      bind:
        create_host_path: true
networks:
  default:
    name: datahub_network
volumes:
  broker:
    name: datahub_broker
  osdata:
    name: datahub_osdata
EOF

# 启动 DataHub
docker-compose -f docker-compose.quickstart-profile.yml --profile quickstart up -d

# 查看容器状态。
sudo docker ps -a |grep datahub

```

**参数说明：**

- `$host`：OceanBase 数据库连接 IP。
 - `$port`：OceanBase 数据库连接端口（ODP 默认 2883）。
 - `$user_name`：OceanBase 数据库用户名（ODP 格式：`用户@租户#集群`）。
 - `$password`：OceanBase 数据库用户密码。
 - `$database_name`：用于 DataHub 后端存储的数据库名称。

### 步骤三：访问 DataHub

1. 访问 DataHub UI 页面：`http://localhost:9002`,登录用户名和密码为：`datahub` 。
 2. 确认 DataHub 服务正常运行，可以登录并查看界面 。

### 步骤四：管理 OceanBase 元数据

除了将 OceanBase 用作 DataHub 的后端存储，还可以对 OceanBase 元数据管理：

1. 在 DataSource 页面，点击 **Create source** 按钮。
 2. 选择 **MySQL** 作为数据源类型。
 3. 编辑 YAML 配置文件。

   ```yaml
    source:
        type: mysql
        config:
            host_port: '$host:$port'
            database: $database_name
            username: $user_name
            password: $password
            include_tables: true
            include_views: true
            profiling:
                enabled: true
                profile_table_level_only: true
            stateful_ingestion:
                enabled: false
    sink:
        type: datahub-rest
        config:
            # docker inspect datahub-datahub-gms-quickstart-1 | grep "IPAddress"
            server: 'http://172.19.0.5:8080'

   ```

   获取数据库地址、端口号、数据库名、用户名和密码参见步骤一。 YAML配置参数详情，参见[DataHub 官网](https://docs.datahub.com/docs/generated/ingestion/sources/mysql)。
 4. 点击 **Next** 和 **Save & Run** 。
 5. 在 DataHub UI 中查看摄取 OceanBase 的元数据信息。

## 相关文档/后续步骤

- [DataHub 官方文档](https://docs.datahub.com/docs/quickstart)

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
