数据开发治理平台 WeData Oracle 数据源

数据集成提供了 Oracle 的读取和写入能力,这里说明使用 Oracle 进行实时数据同步的前置环境配置以及当前能力支持情况。

相关产品
数据开发治理平台 WeData 产品页,含版本规格、价格与购买入口。

一、支持版本

目前数据集成已支持 Oracle 单表及整库级实时读取和单表写入,使用实时同步能力需遵循以下版本限制:

类型 版本
Oracle 11,12,19

二、使用限制

Oracle数据源基于Oracle内置日志分析工具LogMiner读取Oracle的重做日志(Redo Log)和归档日志(Archive log),在目标端进行重放,实现实时同步。该方案目前存在以下限制:

·增量日志保留时长至少3天,如果全量阶段数据量很大,请延长增量日志保留时长。

·Oracle 只读备库只支持 logical standby,不支持 physical standby。

·无主键的表由于无法保证 exactly-once 可能会有数据重复,因此实时同步任务最好保证有主键。

·若要监控 Oracle 端表字段变更,数据源请勿配置 system/sys 两个账号,否则所有表(包括新增表)都需要开启日志才能进行同步。

·DDL 加列带默认值时,导致Logminer拿到的表的schema和变更日志中的数据不一致,可能导致解析异常。

·Logminer 读取日志时,可能存在 DDL 和 DML 顺序错乱,导致读取数据解析失败。

·Logminer 可能丢失事务的结束标识,导致无法确认事务是否提交,数据是否需要发送。

·Logminer 超过5k/s时可能出现延迟较大。

·开启 Rac 模式时,Log 文件切换时 Logminer 可能不感知,导致部分数据缺失。

注意:说明:

注意:如果无法接受以上限制,建议使用 OGG(oracle GoldenGate) 将数据先写入 kafka,然后消费 kafka 写入目标表。该方式目标表需要提前建好,无法通过实时同步任务自动建表;如源端有DDL变更,也需要手动在目标端变更。

三、授权数据库权限

主要是创建基础的同步用户,以及授予拉取存量数据的权限。给需要使用的用户授权各个 view、需导入表的读权限。

ANALYZE ANY 权限的主要作用是读取表的结构与 unique index。当表没有主键时,可以使用某一个 unique index 来代替主键的作用。

sqlplus sys/password@host:port/SID AS SYSDBA;CREATE USER flinkuser IDENTIFIED BY flinkpw DEFAULT TABLESPACE LOGMINER_TBS QUOTA UNLIMITED ON LOGMINER_TBS;– 允许用户连接到数据库 GRANT CREATE SESSION TO flinkuser; — 授予用户对数据库中所有表的SELECT权限,用于读取数据 GRANT SELECT ANY TABLE TO flinkuser;–SELECT_CATALOG_ROLE预定义的数据库角色,它提供了查看数据库系统表的权限;此外,增量阶段的时候,logminer session也依赖于该权限来查询表的结构。 GRANT SELECT_CATALOG_ROLE TO flinkuser;–GRANT ANALYZE ANY是一个授权语句,用于授予用户分析任何用户拥有的所有表、索引、分区和表函数的权限;当表没有主键时,依赖该权限拿到表的惟一索引,并使用惟一索引替代主键。 GRANT ANALYZE ANY TO flinkuser;

四、开启日志归档

即开启产生逻辑日志的行为,否则 Oracle 无法正确产生 logs 部分,这样的话无法进行增量数据同步。

1. 使用 DBA 账号连接。

sqlplus sys/password@host:port/SID AS SYSDBA

2. 开启日志归档不开启无法读取增量数据。

alter system set db_recovery_file_dest_size = 10G;alter system set db_recovery_file_dest = '/opt/oracle/oradata/recovery_area' scope=spfile;shutdown immediate;startup mount;alter database archivelog;alter database open;Notes:开启日志归档需要数据库重启,并且需要占用磁盘空间

3. 检测是否已开启。

— Should now "Database log mode: Archive Mode"archive log list;

4. 开启 supplemental log

— Enable supplemental logging for a specific table:ALTER TABLE inventory.customers ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

注意:如果不开启,源端部分列数据更新时,会导致目标端写入的其他列为空。

5. Create Tablespace

建议为实时同步用户创建单独的表空间,也可以复用已有的表空间。

CREATE TABLESPACE logminer_tbs DATAFILE '/opt/oracle/oradata/SID/logminer_tbs.dbf' SIZE 25M REUSE AUTOEXTEND ON MAXSIZE 2048M;

五、授予通过 logminer 读取日志的权限

–特殊的权限授予语句,它表示授予用户对V$DATABASE视图的SELECT权限,主要用于检查数据库的归档日志是否开启(LOG_MODE),以及获取当前数据库的SCN位点。 GRANT SELECT ON V_$DATABASE to flinkuser;–EXECUTE_CATALOG_ROLE是一个预定义的角色,它主要提供了允许logminer将字典写入binlog的能力,通过这种方式将表结构的变化也记录到逻辑日志中。 GRANT EXECUTE_CATALOG_ROLE TO flinkuser;–允许用户通过LOGMINING组件来读取数据,12c及以下版本中无需执行。 GRANT LOGMINING TO flinkuser;–EXECUTE ON DBMS_LOGMNR 权限是用于授予用户能够执行DBMS_LOGMNR包中的程序的权限。DBMS_LOGMNR包用于在数据库日志文件中分析和提取变更数据。 GRANT EXECUTE ON DBMS_LOGMNR TO flinkuser;–GRANT EXECUTE ON DBMS_LOGMNR_D 是一个授权语句,它授予用户对DBMS_LOGMNR_D包的执行权限。DBMS_LOGMNR_D是Oracle提供的包,用于在数据库级别上分析在线和归档的重做日志文件 GRANT EXECUTE ON DBMS_LOGMNR_D TO flinkuser;–Logminer的数据查询接口是由一组系统提供的视图组成的,需要从logminer中读取数据的话,需要给访问以下视图的权限。 GRANT SELECT ON V_$LOG TO flinkuser; GRANT SELECT ON V_$LOG_HISTORY TO flinkuser; GRANT SELECT ON V_$LOGMNR_LOGS TO flinkuser; GRANT SELECT ON V_$LOGMNR_CONTENTS TO flinkuser; GRANT SELECT ON V_$LOGMNR_PARAMETERS TO flinkuser; GRANT SELECT ON V_$LOGFILE TO flinkuser; GRANT SELECT ON V_$ARCHIVED_LOG TO flinkuser; GRANT SELECT ON V_$ARCHIVE_DEST_STATUS TO flinkuser; exit;

六、实时整库同步来源配置

参数 说明
数据来源 选择需要同步的 Oracle 数据源
来源表 根据业务需求,选择“所有库表”、“指定表”、“指定库”
 所有库表:监控数据源下所有库。任务运行期间新增库、表默认将同步至目标端指定表:仅同步指定表。指定库:监控指定库和 schema,同步 schema 下所有或符合规则的表
 
 
读取模式 全量 + 增量:数据同步分为全量和增量同步阶段,全量阶段完成后任务进入增量阶段。全量阶段将同步库内历史数据,增量阶段从任务启动后 binlog CDC 的位点开始同步。增量:仅从任务启动后的 binlog CDC 位点开始同步数据。
一致性语义 仅代表读取端的一致性语义。支持 At-least-once 和 Exactly-once。At-least-once:数据可能存在重复读取,依赖目标端支持去重来保证数据的一致性。适用于全量阶段数据量大且使用非数值型主键、对同步性能要求高的场景。 Exactly-once:数据严格只读取一次,性能上有一定损失,不支持无主键且无唯一索引列的表。适用于源表有数值型主键或唯一索引列的通用场景。当前版本两种模式状态不兼容,任务提交后如果修改模式,不支持带状态重启。
高级设置(可选) 可根据业务需求配置参数

七、实时分库分表来源配置

参见 分库分表配置。

八、实时单表同步读取配置

1. 在数据集成页面左侧目录栏单击实时同步。

2. 在实时同步页面上方选择单表同步新建(可选择表单和画布模式)并进入配置页面。

参数 描述
数据源 选择需要同步的表所在数据源。
库 支持选择、或者手动输入需读取的库名称。默认将数据源绑定的数据库作为默认库,其他数据库需手动输入库名称。当数据源网络不连通导致无法直接拉取库信息时,可手动输入数据库名称。在数据集成网络连通的情况下,仍可进行数据同步。
schema 支持选择、或者手动输入需读取该数据源下可用的 schema。
表 支持选择、或者手动输入需读取的表名称。
读取模式 全量 + 增量:数据同步分为全量和增量同步阶段,全量阶段完成后任务进入增量阶段。全量阶段将同步库内历史数据,增量阶段从任务启动后 binlog CDC 的位点开始同步。仅增量:仅从任务启动后的 binlog CDC 位点开始同步数据。
一致性语义 仅代表读取端的一致性语义。支持 At-least-once 和 Exactly-once。At-least-once:数据可能存在重复读取,依赖目标端支持去重来保证数据的一致性。适用于全量阶段数据量大且使用非数值型主键、对同步性能要求高的场景。 Exactly-once:数据严格只读取一次,性能上有一定损失,不支持无主键且无唯一索引列的表。适用于源表有数值型主键或唯一索引列的通用场景。当前版本两种模式状态不兼容,任务提交后如果修改模式,不支持带状态重启。
高级设置(选填) 可根据业务需求配置参数。

九、实时单表同步写入配置

1. 在数据集成页面左侧目录栏单击实时同步。

2. 在实时同步页面上方选择单表同步新建(可选择表单和画布模式)并进入配置页面。

参数 说明
数据源 需要写入的 Oracle 数据源。
库 支持选择、或者手动输入需写入的库名称默认将数据源绑定的数据库作为默认库,其他数据库需手动输入库名称。当数据源网络不连通导致无法直接拉取库信息时,可手动输入数据库名称。在数据集成网络连通的情况下,仍可进行数据同步。
Schema 支持选择或者手动输入需要写入的 Oracle 数据模式。
表 支持选择或者手动输入需写入的表名称。当数据源网络不连通导致无法直接拉取表信息时,可手动输入表名称。在数据集成网络连通的情况下,仍可进行数据同步。
主键 选择一个字段作为写入表的主键。
高级设置(选填) 可根据业务需求配置参数。

十、读取

Oracle 读取支持的数据类型及转换对应关系如下(在处理 Oracle 时,会先将 Oracle 数据源的数据类型和数据处理引擎的数据类型做映射):

Oracle 类型 内部类型
NUMBER(p, s <= 0), p – s < 3 TINYINT
NUMBER(p, s <= 0), p – s < 5 SMALLINT
NUMBER(p, s <= 0), p – s < 10 INT
NUMBER(p, s <= 0), p – s < 19 BIGINT
NUMBER(p, s <= 0), 19 <= p – s <= 38 DECIMAL(p – s, 0)
NUMBER(p, s > 0) DECIMAL(p, s)
NUMBER(p, s <= 0), p – s > 38 STRING
FLOAT,BINARY_FLOAT FLOAT
DOUBLE PRECISION,BINARY_DOUBLE DOUBLE
NUMBER(1) BOOLEAN
DATE,TIMESTAMP [(p)] TIMESTAMP [(p)] [WITHOUT TIMEZONE]
TIMESTAMP [(p)] WITH TIME ZONE TIMESTAMP [(p)] WITH TIME ZONE
TIMESTAMP [(p)] WITH LOCAL TIME ZONE TIMESTAMP_LTZ [(p)]
CHAR(n),NCHAR(n),NVARCHAR2(n),VARCHAR(n),VARCHAR2(n),CLOB,NCLOB,XML 类型 STRING
BLOB,ROWID BYTES
INTERVAL DAY TO SECOND,INTERVAL YEAR TO MONTH BIGINT

十一、写入

Oracle 写入支持的数据类型及转换对应关系如下:

内部类型 Oracle 类型
FLOAT BINARY_FLOAT
DOUBLE BINARY_DOUBLE
DECIMAL(p, s) SMALLINT,FLOAT(s),DOUBLE PRECISION,REAL,NUMBER(p, s)
DATE DATE
DECIMAL(20, 0) –
FLOAT REAL,FLOAT4
DOUBLE FLOAT8,DOUBLE PRECISION
DECIMAL(p, s) NUMERIC(p, s),DECIMAL(p, s)
BOOLEAN BOOLEAN
DATE DATE
TIMESTAMP [(p)][WITHOUT TIMEZONE] TIMESTAMP [(p)]WITHOUT TIMEZONE
STRING CHAR(n),VARCHAR(n),CLOB(n)
BYTES RAW(s),BLOB
ARRAY –
赞 (0)
上一篇 4天前
下一篇 4天前