Oracle 数据源为您提供读取和写入 Oracle 的双向通道数据集成能力,实现不同数据源与 Oracle 之间的数据传输场景。本文为您介绍 DataSail 的 Oracle 数据同步的能力支持情况,包括离线批式同步和基于 LogMiner 的实时同步方案。
Oracle 版本 | 离线读(Oracle Reader) | 离线写(Oracle Writer) | 实时同步(CDC via LogMiner) | 备注 |
|---|---|---|---|---|
Oracle 11.2 (11gR2) | ✅ 支持 | ✅ 支持 | ✅ 支持 | 推荐版本,功能完全兼容 |
Oracle 12.1 (12cR1) | ✅ 支持 | ✅ 支持 | ✅ 支持 | 离线读写支持 CDB/PDB;CDC 仅支持非 CDB 模式 |
Oracle 12.2 (12cR2) | ✅ 支持 | ✅ 支持 | ✅ 支持 | 新版本特性不支持 |
Oracle 18.3 | ✅ 支持 | ✅ 支持 | ✅ 支持 | 新版本特性不支持 |
Oracle 19.x | ✅ 支持 | ✅ 支持 | ✅ 支持 | 新版本特性不支持,长期支持版本 |
Oracle 21.1 | ✅ 支持 | ✅ 支持 | ✅ 支持 | 新版本特性不支持 |
说明
部署架构 | 离线读写 | 实时 CDC | 说明 |
|---|---|---|---|
单实例(Standalone) | ✅ | ✅ | 标准部署模式,推荐使用 |
RAC(Real Application Clusters) | ✅ | ❌ 不支持 | 离线读写建议连接 SCAN 地址;实时 CDC 不支持 RAC 模式 |
Data Guard(仅 Primary) | ✅ | ✅ | 仅支持主库读取,不支持从库 |
Multitenant(CDB/PDB) | ✅ | ❌ 不支持 | 离线读写支持 CDB/PDB 模式;实时 CDC 默认仅支持非 CDB 模式 |
为 DataSail 离线同步创建专用用户并授予必要权限:
单实例(Standalone)数据库
-- 创建 DataSail 专用用户 CREATE USER datasail IDENTIFIED BY <your_password>; -- 授予基础连接权限 GRANT CREATE SESSION TO datasail; -- 授予数据读取权限(按需为目标 Schema 授权) GRANT SELECT ON <schema_name>.<table_name> TO datasail; -- 如需读取所有表,可授予以下权限(谨慎使用) -- GRANT SELECT ANY TABLE TO datasail; -- 如需写入数据 GRANT INSERT, UPDATE, DELETE ON <schema_name>.<table_name> TO datasail;
Multitenant 架构(CDB/PDB)—— 仅适用于离线同步
注意
以下 CDB/PDB 配置仅适用于离线读写场景。实时 CDC(LogMiner)默认不支持 CDB 模式。
-- 在 CDB 根容器中创建公共用户(用户名必须以 C## 开头) ALTER SESSION SET CONTAINER = CDB$ROOT; CREATE USER C##DATASAIL IDENTIFIED BY <your_password> CONTAINER = ALL; -- 授予基础连接权限 GRANT CREATE SESSION TO C##DATASAIL CONTAINER = ALL; -- 切换到目标 PDB 授予数据访问权限 ALTER SESSION SET CONTAINER = <pdb_name>; GRANT SELECT ON <schema_name>.<table_name> TO C##DATASAIL;
注意
使用 LogMiner 进行实时 CDC 采集前,请先了解以下使用限制:
在 Oracle 服务端完成以下配置:
步骤 1:创建归档日志目录,在数据盘(确保有足够空余空间)新建目标目录。
mkdir -p /opt/oracle/oradata/recovery_area mkdir -p /opt/oracle/oradata/ORCLCDB chown -R oracle /opt/oracle/oradata
步骤 2:开启归档日志(Archive Log)。
注意
开启 Archive Log 需要重启数据库,可能会导致业务中断,请谨慎评估后进行。开启 Archive Log 模式后,请务必预留足够磁盘空间(建议 50GB 以上),以免空间不足导致 Oracle 异常。
切换到有 Oracle DBA 权限的用户,运行 sqlplus / as sysdba 命令,然后执行:
-- 设置日志目录的最大占用空间及存储路径 alter system set db_recovery_file_dest_size = 100G; alter system set db_recovery_file_dest = '/opt/oracle/oradata/recovery_area' scope=spfile; -- 重启数据库并开启归档 shutdown immediate; startup mount; alter database archivelog; alter database open; -- 必须执行,否则会出现列缺失等问题 ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; alter system switch logfile; -- 确认归档模式已开启(应显示 Database log mode: Archive Mode) archive log list;
说明
建议通过 RMAN 配置 Archive Log 清理策略:运行 rman target / 后执行 CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 1 TIMES TO DISK;,并可定期执行 DELETE NOPROMPT ARCHIVELOG ALL BACKED UP 1 TIMES TO DISK; 主动触发清理。
步骤 3:检查 LogMiner 安装情况(可选)。进入 sqlplus 命令,执行:
desc DBMS_LOGMNR; desc DBMS_LOGMNR_D;
如果没有任何信息返回,需要安装 LogMiner 组件:
@$ORACLE_HOME/rdbms/admin/dbmslm.sql @$ORACLE_HOME/rdbms/admin/dbmslmd.sql
步骤 4:创建 LogMiner 用户并授予权限。
注意
以下命令适用于 10g、11c 版本,或者 12c 及以上版本的非 CDB 模式。如果自行指定了归档目录,请替换下文路径为您部署环境的实际路径;请替换 [您的密码] 为实际密码值。
-- 创建 LogMiner 采集用户 CREATE TABLESPACE logminer_tbs DATAFILE '/opt/oracle/oradata/ORCLCDB/logminer_tbs.dbf' SIZE 25M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED; CREATE USER logminer_user IDENTIFIED BY [您的密码] DEFAULT TABLESPACE logminer_tbs QUOTA UNLIMITED ON logminer_tbs; -- 允许获取 LogMiner 所必须的表 GRANT CREATE SESSION TO logminer_user; GRANT SELECT ON V_$DATABASE to logminer_user; GRANT SELECT ON V_$LOG TO logminer_user; GRANT SELECT ON V_$LOGFILE TO logminer_user; GRANT SELECT ON V_$LOGMNR_LOGS TO logminer_user; GRANT SELECT ON V_$LOGMNR_CONTENTS TO logminer_user; GRANT SELECT ON V_$ARCHIVED_LOG TO logminer_user; GRANT SELECT ON V_$ARCHIVE_DEST_STATUS TO logminer_user; GRANT EXECUTE ON DBMS_LOGMNR TO logminer_user; GRANT EXECUTE ON DBMS_LOGMNR_D TO logminer_user; GRANT SELECT ANY TABLE TO logminer_user; GRANT ANALYZE ANY TO logminer_user; -- 允许查看所有用户信息 GRANT SELECT ON ALL_USERS TO logminer_user; -- 允许查看所有对象信息 GRANT SELECT ON ALL_OBJECTS TO logminer_user; GRANT SELECT ON DBA_OBJECTS TO logminer_user; -- 允许查看物化视图和物化视图日志 GRANT SELECT ON DBA_MVIEWS TO logminer_user; GRANT SELECT ON DBA_MVIEW_LOGS TO logminer_user; -- 允许查看约束信息 GRANT SELECT ON DBA_CONSTRAINTS TO logminer_user; GRANT SELECT ON DBA_CONS_COLUMNS TO logminer_user; -- 允许查看表列信息 GRANT SELECT ON ALL_TAB_COLS TO logminer_user; -- 允许查看系统表信息 GRANT SELECT ON SYS.OBJ$ TO logminer_user; GRANT SELECT ON SYS.COL$ TO logminer_user; GRANT SELECT ON SYS.USER$ TO logminer_user; GRANT SELECT ON SYS.CDEF$ TO logminer_user; GRANT SELECT ON SYS.CON$ TO logminer_user; GRANT SELECT_CATALOG_ROLE to logminer_user WITH delegate option; -- 允许查看所有索引信息 GRANT SELECT ON ALL_INDEXES TO logminer_user; -- 允许查看备用日志信息 GRANT SELECT ON V_$STANDBY_LOG TO logminer_user; GRANT SELECT ON V_$ARCHIVE_GAP TO logminer_user; -- 允许查看事务信息 GRANT SELECT ANY TRANSACTION TO logminer_user; -- 允许查询 DUAL 表 GRANT SELECT ON DUAL TO logminer_user; -- Oracle 12c 及更高版本需要额外执行如下命令,11 等旧版本无需执行 GRANT LOGMINING TO logminer_user;
说明
如果您在测试环境遇到权限问题(如 ORA-01031、ORA-00942),可尝试执行 GRANT DBA TO logminer_user;进行临时授权,待数据同步任务完成后请执行 REVOKE DBA FROM logminer_user; 解除授权。
步骤 5:配置归档日志保留策略,建议至少保留 24 小时的归档日志。通过 RMAN 配置:
# rman target / # CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 1 DAYS;
注意
GRANT SELECT ON V_$ASM_LOGFILE 权限。在 DataSail 中注册 Oracle 数据源之前,建议按照以下清单逐项验证:
序号 | 验证项 | 验证方法 | 预期结果 |
|---|---|---|---|
1 | 网络连通性 |
| 可建立连接 |
2 | Oracle 监听状态 |
| 监听器运行中,注册了目标服务 |
3 | 用户认证 |
| 登录成功 |
4 | 表访问权限 |
| 返回数据 |
5 | Schema 访问 |
| 列出可访问的表 |
6 | 归档日志模式(CDC) |
| 返回 ARCHIVELOG |
7 | 补充日志(CDC) |
| 返回 YES |
8 | LogMiner 权限(CDC) |
| 无权限错误 |
当前主要字段类型支持情况如下:
字段类型 | 离线读(Oracle Reader) | 离线写(Oracle Writer) | 备注 |
|---|---|---|---|
NUMBER | ✅ 支持 | ✅ 支持 | |
NUMERIC | ✅ 支持 | ✅ 支持 | |
REAL | ✅ 支持 | ✅ 支持 | |
BIT | ✅ 支持 | ✅ 支持 | |
BOOL | ✅ 支持 | ✅ 支持 | |
BINARY_FLOAT | ✅ 支持 | ✅ 支持 | |
BINARY_DOUBLE | ✅ 支持 | ✅ 支持 | |
DOUBLE PRECISION | ✅ 支持 | ✅ 支持 | |
CHAR | ✅ 支持 | ✅ 支持 | |
NCHAR | ✅ 支持 | ✅ 支持 | |
VARCHAR2 | ✅ 支持 | ✅ 支持 | |
NVARCHAR2 | ✅ 支持 | ✅ 支持 | |
DATE | ✅ 支持 | ✅ 支持 | |
TIMESTAMP | ✅ 支持 | ✅ 支持 | |
TIMESTAMP WITH TIME ZONE | ✅ 支持 | ✅ 支持 | |
TIMESTAMP WITH LOCAL TIME ZONE | ✅ 支持 | ✅ 支持 | |
DATETIME | ✅ 支持 | ✅ 支持 | |
CLOB | ✅ 支持 | ✅ 支持 | 大字段,注意性能影响 |
BLOB | ✅ 支持 | ✅ 支持 | 大字段,注意性能影响 |
RAW | ✅ 支持 | ✅ 支持 | |
ROWID | ✅ 支持 | ✅ 支持 | |
UROWID | ✅ 支持 | ✅ 支持 | |
FLOAT | ✅ 支持 | ✅ 支持 | |
INTERVAL DAY | ✅ 支持 | ❌ 不支持 | 仅支持读取 |
INTERVAL YEAR | ✅ 支持 | ❌ 不支持 | 仅支持读取 |
BFILE | ✅ 支持 | ✅ 支持 | |
LONG | ✅ 支持 | ✅ 支持 | |
LONG RAW | ✅ 支持 | ✅ 支持 | |
NCLOB | ✅ 支持 | ✅ 支持 | |
XmlType | ✅ 支持 | ✅ 支持 | |
STRUCT | ❌ 不支持 | ❌ 不支持 | |
User-Defined Types | ❌ 不支持 | ❌ 不支持 | |
AnyType / AnyData / AnyDataSet | ❌ 不支持 | ❌ 不支持 | |
Spatial Types | ❌ 不支持 | ❌ 不支持 | |
Media Types | ❌ 不支持 | ❌ 不支持 |
Oracle Reader 读取数据时,会按照以下规则将 Oracle 数据类型转换为 DataSail 内部类型:
类型分类 | Oracle 数据类型 | DataSail 内部类型 | 说明 |
|---|---|---|---|
整数类 | INTEGER、INT、SMALLINT | 整型 | |
浮点类 | NUMBER、NUMERIC、DECIMAL、FLOAT、DOUBLE PRECISION、REAL、BINARY_FLOAT、BINARY_DOUBLE、DEC | 浮点型 | NUMBER 根据精度自动映射 |
字符串类 | LONG、CHAR、NCHAR、VARCHAR、VARCHAR2、NVARCHAR2、CLOB、NCLOB、CHARACTER、CHARACTER VARYING、CHAR VARYING、NATIONAL CHARACTER、NATIONAL CHAR、NATIONAL CHARACTER VARYING、NATIONAL CHAR VARYING、NCHAR VARYING、ROWID、UROWID、XMLTYPE | 字符串型 | |
日期时间类 | TIMESTAMP、DATE、TIMESTAMP WITH TIME ZONE、TIMESTAMP WITH LOCAL TIME ZONE、DATETIME | 日期时间型 | |
布尔型 | BIT、BOOL | 布尔型 | |
二进制类 | BLOB、BFILE、RAW、LONG RAW | 二进制型 |
注意
LOB 类型注意事项:
reader_fetch_size 参数。新建数据源操作详见配置数据源,以下为您介绍用连接串方式配置 Oracle 数据源信息:
注意
Oracle 侧如果是白名单访问机制,则不同网络环境的连接串地址,需要添加不同的 IP 地址到数据库白名单中,确保集成资源组使用的 VPC 与 Oracle 网络能互通:
详见网络连通解决方案。
参数 | 说明 |
|---|---|
基本配置 | |
数据源类型 | Oracle |
接入方式 | 连接串 |
数据源名称 | 数据源的名称,可自行设置,仅支持中文,英文,数字,“_”,100个字符以内。 |
参数配置 | |
主机名或IP地址 | Oracle 数据库的主机名称或者 IP 地址。 |
端口 | 连接主机的端口号。 |
连接方式 | 下拉选择 Oracle 数据库的连接方式:
详细说明请参见下方的连接方式说明。 |
数据库名 | 输入已创建的 Oracle 数据库名称。 |
用户名 | 有权限访问数据库的用户名信息。 |
密码 | 输入用户名对应的密码信息。 |
DataSail 支持两种 Oracle 连接方式,请根据您的 Oracle 部署情况选择:
连接方式 | 适用场景 | 连接串格式 | 说明 |
|---|---|---|---|
SID | 单实例部署 |
| SID 是 Oracle 实例的唯一名称,每个实例对应唯一的 SID。 |
Service Name | RAC、Data Guard 或多实例部署 |
| Service Name 是一个或多个实例的连接别名,支持负载均衡和故障转移。 |
如何确定使用 SID 还是 Service Name?
-- 查看当前实例的 SID SELECT INSTANCE_NAME FROM V$INSTANCE; -- 查看当前数据库注册的 Service Name SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME = 'service_names'; -- 或通过 lsnrctl 命令查看(在 Oracle 服务器上执行) -- lsnrctl status
说明
使用建议如下: