数据集成提供了 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 databaseALTER 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 | - |