Oracle 数据源

最近更新时间:2024-09-04 20:44:31

我的收藏
数据集成提供了 Oracle 的读取和写入能力,本文为您介绍使用 Oracle 进行实时数据同步的前置环境配置以及当前能力支持情况。

支持版本

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

使用限制

Oracle 只读备库只支持 logical standby,不支持 physical standby。
无主键的表由于无法保证 exactly once 可能会有数据重复,因此实时同步任务最好保证有主键。
若要监控 Oracle 端表字段变更,数据源请勿配置 system/sys 两个账号,否则所有表(包括新增表)都需要开启日志才能进行同步。

数据库环境准备

授权数据库权限

主要是创建基础的同步用户,以及授予拉取存量数据的权限。给需要使用的用户授权各个 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;
-- 用于支持需要使用了cdb / pdb的场景,授予用户访问pdb / cdb的权限
GRANT SET CONTAINER 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
不开启在 Update 中,读取到的未更新字段均为空。
-- Enable supplemental logging for a specific table:
ALTER TABLE inventory.customers ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
或者可以全局打开:
-- Enable supplemental logging for database
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
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组件来读取数据
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:数据严格只读取一次,性能上有一定损失,不支持无主键且无唯一索引列的表。适用于源表有数值型主键或唯一索引列的通用场景。
当前版本两种模式状态不兼容,任务提交后如果修改模式,不支持带状态重启。
高级设置(可选)
可根据业务需求配置参数
说明:
若要监控 Oracle 端表字段变更,数据源请勿配置 system/sys 两个账号,否则所有表(包括新增表)都需要开启日志才能进行同步。
开启命令:
ALTER TABLE SCHEMA_NAME.TBALE_NAME ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS

支持的目标数据源

当前支持将 Oracle 数据实时整库同步到以下类型的目标端:

单表读取节点配置

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 数据源的数据类型和数据处理引擎的数据类型做映射):
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
-