OpenMetadata Oracle 连接器接入指南:权限配置、连接参数与源码级原理剖析
【免费下载链接】OpenMetadataThe Open Context Layer for Data and AI , OpenMetadata is the open platform for building trusted data context and business semantics for humans, AI assistants, and agents.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMetadata
Oracle 是企业级元数据管理的常见数据源,OpenMetadata 通过内置的 Oracle 连接器完成数据库、Schema、表、视图、物化视图、存储过程等元数据的采集,并支持 Profiler、数据质量、Usage 与 Lineage 等高级工作流。本文以 Oracle 连接器配置文档 为骨架,完整讲解权限准备、连接配置、AWS S3 采样存储与过滤规则,并结合仓库内 Python 采集端与 JSON Schema 定义揭示每个参数的底层实现逻辑,帮助读者在 UI 或 YAML 工作流中正确、安全地接入 Oracle。
一、连接器概览与支持范围
Oracle 连接器使用python-oracledb驱动采集元数据,支持 Oracle 数据库12c、18c、19c与21c四个主要版本。从采集端源码结构看,连接器由四部分组成(见 service_spec.py):
OracleSource:元数据采集(表、视图、物化视图、约束、索引、注释、存储过程与包);OracleLineageSource:血缘采集;OracleUsageSource:使用情况(Usage)采集;OracleConnection:连接建立与连接测试。
采集端对 SQLAlchemy 的 Oracle 方言做了大量覆写(见 metadata.py),例如覆写get_table_comment、get_columns、get_pk_constraint、get_foreign_keys、get_view_names等反射方法,并额外注册了ROWID、XMLTYPE、INTERVAL YEAR TO MONTH等 Oracle 专有数据类型,保证数据字典中的列类型能被准确映射到 OpenMetadata 的数据类型模型。
二、环境要求与数据库权限准备
2.1 驱动支持
采集依赖python-oracledb库,对 Oracle12c、18c、19c、21c提供支持。该依赖在 pyproject.toml 与采集镜像中内置,无需在数据库侧额外安装。
2.2 用户最小权限
采集用户必须具备CREATE SESSION权限,官方推荐的权限授予脚本如下(完整 SQL 原样保留自配置文档):
-- CREATE USER CREATE USER user_name IDENTIFIED BY admin_password; -- CREATE ROLE CREATE ROLE new_role; -- GRANT ROLE TO USER GRANT new_role TO user_name; -- GRANT CREATE SESSION PRIVILEGE TO USER GRANT CREATE SESSION TO new_role; -- GRANT SELECT CATALOG ROLE PRIVILEGE TO FETCH METADATA TO ROLE / USER GRANT SELECT_CATALOG_ROLE TO new_role;此外,需要针对待采集的具体表授予SELECT权限:
GRANT SELECT ON table_name TO {user | role};从源码看,这些权限并非冗余:连接测试(test_connection)会依次执行CheckAccess、PackageAccess(存储包可读性)、GetMaterializedViews(物化视图查询)、GetQueryHistory(查询历史)四组探测 SQL,其中表前缀来自DBA/ALL的切换(详见下文「Use DBA Tables」),相关查询定义见 queries.py 与 connection.py。
2.3 Profiler 与数据质量工作流
执行 Profiler 工作流或数据质量测试时,用户需要对执行范围内表/Schema 拥有SELECT权限,并且被允许查看数据库中所有对象的all_objects与all_tables信息。这是 Profile 采样、行数统计、列值分布计算的数据基础。
2.4 Usage 与 Lineage 工作流
Usage 与 Lineage 工作流需要用户具备SELECT权限,以便从 Oracle 的查询历史与执行计划中解析 SQL 并构建表间血缘。
三、连接配置(Connection Details)逐项详解
以下参数既可以在 OpenMetadata UI 的服务连接表单中填写,也可以在 YAML 工作流中作为source.config.serviceConnection.root.config传入。其字段定义与默认值以 oracleConnection.json 为准。
3.1 Scheme(驱动方案)
| 取值 | 说明 |
|---|---|
oracle+oracledb | SQLAlchemy 连接 Oracle 的方案,默认值 |
oracle+cx_oracle | 已废弃的兼容值,连接统一改用 python-oracledb |
从 connection.py 的 URL 构造逻辑可见:即使配置里填写了旧值oracle+cx_oracle,实际生成的连接 URL 也固定使用oracle+oracledb://,旧方案仅作为配置输入被兼容接受。
3.2 Username / Password
- Username:连接 Oracle 的用户名,需具备读取 Oracle 全部元数据的权限;
- Password:连接密码。
JSON Schema 将username与oracleConnectionType列为必填项,密码字段为password格式(UI 中会以密文处理)。URL 构造时用户名与密码都会经过quote_plus编码,避免特殊字符破坏连接串(见 connection.py)。
3.3 Host Port
以hostname:port字符串形式指定 Oracle 实例地址,例如localhost:1521。如果 OpenMetadata 采集容器运行在 Docker 中、而 Oracle 服务位于宿主机localhost,则应填写host.docker.internal:1521。
需要特别注意的是:当使用TNS 连接方式时,hostPort会被忽略(见 3.6 与 3.7),此时必须保证 TNS 字符串内包含HOST条目。
3.4 Oracle Connection Type(连接方式三选一)
Oracle 连接方式是一个oneOf联合类型,必须且只能选择一种:
- Database Schema:通过数据库 Schema 名连接,用户仅能访问该 Schema 内的对象,而非整个数据库;
- Oracle Service Name:通过服务名连接,服务名是数据库实例(或实例组)执行特定功能的唯一标识;
- Oracle TNS Connection:直接使用 TNS 连接串,例如
(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=myhost)(PORT=1530)))(CONNECT_DATA=(SID=MYSERVICENAME)))。
三种方式的 URL 构造差异见 connection.py:
- Database Schema:
oracle+oracledb://user:pass@host:port/schema; - Oracle Service Name:
oracle+oracledb://user:pass@host:port/?service_name=<SERVICE_NAME>; - Oracle TNS Connection:
oracle+oracledb://user:pass@<TNS 字符串>(TNS 串中已含 HOST/PORT,因此不再拼接hostPort)。
3.5 Oracle Service Name
即远程连接数据库时使用的 TNS 别名,记录于tnsnames中。配置后采集端以?service_name=...查询参数形式传给驱动。
3.6 Database Schema
Oracle 中可供连接的 Schema 名。留空时 OpenMetadata 采集会尝试扫描所有 Schema(JSON Schema 中该字段为可选参数,见 oracleConnection.json)。
3.7 Oracle TNS Connection
直接粘贴tnsnames.ora中的完整 TNS 串。一旦填写,采集端将忽略hostPort属性,因此请务必确认 TNS 串内已包含正确的HOST与PORT。
3.8 Instant Client Directory(厚模式客户端目录)
该目录用于设置LD_LIBRARY_PATH环境变量,仅在需要启用厚连接(thick)模式时必须。默认情况下镜像内置 Instant Client 19,目录指向/instantclient。
从源码(connection.py)可见其工作方式:
- 若配置了
instantClientDirectory,先设置LD_LIBRARY_PATH并调用oracledb.init_oracle_client(lib_dir=...); - 若客户端版本低于 19,会打印弃用警告(
MIN_RECOMMENDED_ORACLE_CLIENT_VERSION = 19); - 若初始化抛
DatabaseError(如缺少 Oracle Client 11.2+ 或动态库),则记录警告并自动回退到 thin 模式继续连接。
厚/薄模式会影响部分查询行为,例如采集视图定义时厚模式下DBA_VIEWS.TEXT的 LONG 列可能触发ORA-01406数组抓取截断,采集端已实现「批量失败后逐条回退」的容错逻辑(见 utils.py)。
3.9 Preserve Identifier Case(保留标识符大小写)
该参数控制 Oracle 标识符(表、列、Schema)在 OpenMetadata 中的存储方式,默认关闭:
- Oracle 存储规则:未加引号的标识符在数据字典中以大写存储(如
CREATE TABLE EMPLOYEES→EMPLOYEES);加了引号的标识符保留原始大小写(如CREATE TABLE "employees"→employees)。 - 关闭(默认):字母相同但大小写不同的标识符(未加引号的
EMPLOYEES与加引号的"employees")不保证被区分存储,可能发生同名冲突(合并为同一名称)。 - 开启:名称严格按 Oracle 数据字典原样存储,保留
EMPLOYEES与"employees"的区分。 - 何时开启:当 Schema 中存在仅大小写不同、需要被 OpenMetadata 视为独立实体的标识符时。
迁移警告(务必阅读):如果已在默认设置下完成过采集,之后再开启该选项,会改变所有已有表、列、Schema 与约束的存储名称,从而破坏附着在这些实体上的标签、描述、血缘、数据质量测试与自定义属性。确需切换时,应先将此前采集的实体软删除(soft-delete),再以新设置重新采集。
从实现看,开启后采集端会在方言实例上绑定normalize_name/denormalize_name(原样返回名称),并替换为*_preserve_case系列的注释与视图定义查询(不带LOWER()),见 metadata.py 与 utils.py。
3.10 Use DBA Tables(使用 DBA 元数据表)
Oracle 提供两套元数据表:
| 表集 | 内容 | 权限要求 |
|---|---|---|
DBA_TABLES | 数据库中所有对象的元数据 | 需要 DBA 权限 |
ALL_TABLES | 当前用户可访问的所有对象元数据 | 无需提升权限 |
- 关闭:使用
ALL_前缀表,仅返回当前用户可访问对象的元数据; - 开启(默认):使用
DBA_前缀表获取全库对象元数据,要求 Oracle 用户具备 DBA 权限。
实现上,采集端通过get_table_prefix_from_connection()读取useDBATable(默认True)得到"DBA"或"ALL"前缀,并以此格式化所有元数据查询({prefix}_TAB_COMMENTS、{prefix}_VIEWS、{prefix}_TAB_COLS等),见 utils.py 与 queries.py。
3.11 Database Name(数据库名称)
OpenMetadata 的数据库服务层级为:
Database Service > Database > Schema > TableOracle 本身没有「数据库」这一层级。若希望数据展示在名为default之外的数据库下,可在该字段指定名称。
建议:将数据库名设置为与 Oracle 的SID一致,这能确保 Profiler、数据质量检查和 dbt 工作流中表的识别与结果归属准确无误。
3.12 Connection Options / Connection Arguments
- Connection Options:以键值对形式传递给 Oracle 驱动 / SQLAlchemy 的附加连接选项;
- Connection Arguments:以键值对形式传递的安全或协议类附加参数(如 SSL 相关配置)。
两者在采集端分别通过get_connection_options_dict与get_connection_args_common处理:Options 会被拼入连接 URL 的查询参数,Arguments 则作为 SQLAlchemyconnect_args传给驱动(见 connection.py)。
四、采样数据存储:AWS S3 配置(Sample Storage)
连接配置中内置了「Sample Data 存储配置」,可将采样数据存放到 AWS S3。相关字段说明如下(示例密钥仅为占位说明用途,请替换为真实凭据):
| 字段 | 说明 |
|---|---|
| AWS Access Key ID | AWS 访问密钥 ID(形如AKIAIOSFODNN7EXAMPLE),与 Secret Key 成对使用进行请求认证 |
| AWS Secret Access Key | 秘密访问密钥(形如wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY) |
| AWS Region | 服务所在区域,配置连接时唯一必填的 AWS 参数;其余配置可通过环境变量、配置文件等方式由 SDK 自动读取 |
| AWS Session Token | 使用临时凭证访问服务时必填,需同时提供 Access Key ID 与 Secret Access Key |
| Endpoint URL | AWS 服务入口 URL;默认按 Region 使用服务默认端点,可覆盖为自定义端点(如 S3 兼容存储) |
| Profile Name | 指定 AWS CLI 命名配置文件(非default时填写) |
| Assume Role ARN | 跨账户 / 角色扮演时目标角色策略的 ARN,使用AssumeRole时为必填 |
| Assume Role Session Name | 扮演角色会话的唯一标识,默认使用OpenMetadataSession |
| Assume Role Source Identity | 调用AssumeRole的主体指定的源身份,用于在 CloudTrail 日志中追溯操作者 |
| Bucket Name | 数据湖桶名,对象存储中组织数据对象的唯一标识 |
| Prefix | 数据路径前缀,用于在桶内组织与归类数据、辅助定位 |
五、过滤器模式(Filter Patterns)
连接配置支持四级正则过滤,使用「包含 + 排除」模式控制采集范围:
- Database Filter Pattern:按正则包含/排除数据库;
- Schema Filter Pattern:按正则包含/排除 Schema;
- Table Filter Pattern:按正则包含/排除表;
- Stored Procedure Filter Pattern:按正则包含/排除存储过程。
其中 Schema 过滤在 JSON Schema 中带有默认排除列表(见 oracleConnection.json),默认不采集系统 Schema:
"excludes": ["^sys$", "^ctxsys$", "^dbsnmp$", "^outln$"]此外,元数据采集查询中也会显式排除 Oracle 维护的内部用户(oracle_maintained = 'N'条件,见 queries.py),避免系统对象污染元数据。
六、采集能力总览与相关源码索引
Oracle 连接器声明支持的能力包括:元数据采集、Usage、Lineage、dbt 工作流、Profiler、查询注释、Data Diff 与采样数据存储(见 oracleConnection.json)。采集内容上,除常规表/视图外,还包括物化视图(作为MaterializedView类型入库,见 metadata.py)与存储过程/存储包(分别以StoredProcedure与StoredPackage类型入库)。
如需深入阅读实现,推荐按以下路径对照:
- 连接建立、URL 构造与连接测试:connection.py
- SQLAlchemy 方言覆写、大小写保留、DBA/ALL 前缀:utils.py
- 全部元数据 SQL 查询定义:queries.py
- 元数据采集主逻辑(存储过程、物化视图等):metadata.py
- 连接配置 JSON Schema(字段、默认值、必填项):oracleConnection.json
七、配置自检清单
完成 Oracle 连接配置后,建议按以下清单核对,再启动元数据采集:
- 采集用户已获得
CREATE SESSION与SELECT_CATALOG_ROLE,并对目标表授予了SELECT; - 若需全库元数据,
Use DBA Tables保持默认开启,且用户具备 DBA 权限;否则关闭以使用ALL_表; - 若填写 TNS 连接串,确认其包含
HOST,此时可忽略hostPort; - 若启用厚模式,确认 Instant Client 目录正确(默认
/instantclient,版本 ≥ 19); Database Name建议与 SID 一致,以保证 Profiler、数据质量与 dbt 结果归属正确;- 在变更
Preserve Identifier Case之前,先软删除历史采集实体,避免元数据关联丢失; - 利用连接测试(Test Connection)先验证权限与连通性,再提交元数据/Profiler/Usage 工作流。
【免费下载链接】OpenMetadataThe Open Context Layer for Data and AI , OpenMetadata is the open platform for building trusted data context and business semantics for humans, AI assistants, and agents.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMetadata
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考