本文为您介绍Oracle Reader支持的数据类型、字段映射和数据源等参数及配置示例。

Oracle Reader插件实现了从Oracle读取数据。在底层实现上,Oracle Reader通过JDBC连接远程Oracle数据库,并执行相应的SQL语句,从Oracle数据库中选取数据。
说明
  • RDS和DRDS不提供Oracle存储引擎。
  • Oracle Reader插件使用ojdbc7-12.1.0.2.jar驱动,支持的Oracle版本请参见Oracle官网
Oracle Reader通过JDBC连接器连接至远程的Oracle数据库,根据您配置的信息生成查询语句,并发送至远程Oracle数据库。然后使用数据集成自定义的数据类型,将该SQL执行返回结果拼装为抽象的数据集,并传递给下游Writer处理。
  • 对于您配置的tablecolumnwhere信息,Oracle Reader将其拼接为SQL语句,发送至Oracle数据库。
  • 对于您配置的querySql信息,Oracle直接将其发送至Oracle数据库。

支持的Oracle版本

版本 是否支持
Oracle 11.2 or 11gR2
Oracle 12.1 or 12cR1
Oracle 12.2 or 12cR2 是(新版本特性不支持)
Oracle 18.3 是(新版本特性不支持)
Oracle 19.x 是(新版本特性不支持)
Oracle 21.1 是(新版本特性不支持)

支持的字段类型

字段类型 离线读(Oracle Reader) 离线写(Oracle Writer) 实时读
NUMBER 支持 支持 支持
BINARY FLOAT 支持 支持 支持
BINARY DOUBLE 支持 支持 支持
CHAR 支持 支持 支持
NCHAR 支持 支持 支持
VARCHAR2 支持 支持 支持
NVARCHAR2 支持 支持 支持
DATE 支持 支持 支持
TIMESTAMP 支持 支持 支持
TIMESTAMP WITH TIME ZONE 支持 支持 不支持
TIMESTAMP WITH LOCAL TIME ZONE 支持 支持 不支持
CLOB 支持 支持 支持
BLOB 支持 支持 支持
RAW 支持 支持 支持
ROWID 不支持 不支持 支持
UROWID 不支持 不支持 支持
FLOAT 支持 支持 支持
INTERVAL DAY TO SECOND 不支持 不支持 支持
INTERVAL YEAR TO MONTH 不支持 不支持 支持
BFILE 不支持 不支持 不支持
LONG 不支持 不支持 不支持
LONG RAW 不支持 不支持 不支持
NCLOB 支持 支持 不支持
STRUCT 支持 支持 不支持
User-Defined Types 不支持 不支持 不支持
AnyType 不支持 不支持 不支持
AnyData 不支持 不支持 不支持
AnyDataSet 不支持 不支持 不支持
XmlType 不支持 不支持 不支持
Spatial Types 不支持 不支持 不支持
Media Types 不支持 不支持 不支持

类型转换列表

Oracle Reader支持大部分Oracle类型,但也存在部分类型没有支持的情况,请注意检查您的数据类型 。

Oracle Reader针对Oracle类型的转换列表,如下所示。
类型分类 Oracle数据类型
整数类 NUMBER、RAWID、INTEGER、INT和SMALLINT
浮点类 NUMERIC、DECIMAL、FLOAT、DOUBLE PRECISIOON和REAL
字符串类 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
日期时间类 TIMESTAMP和DATE
布尔型 BIT和BOOL
二进制类 BLOB、BFILE、RAW和LONG RAW

参数说明

参数 描述 是否必选 默认值
datasource 数据源名称,脚本模式支持添加数据源,该配置项输入的内容必须和添加的数据源名称保持一致。
selectedDatabase 待同步数据库的schema。
table 选取的需要同步的表名称,格式需要配置为schema.tableName
说明 例如,selectedDatabaseAUTOTEST,表名称为table01,则table需配置为AUTOTEST.table01
column 所配置的表中需要同步的列名集合,使用JSON的数组描述字段信息。默认使用所有列配置,例如["*"]
  • 支持列裁剪,即可以导出部分列。
  • 支持列换序,即可以不根据表Schema信息的顺序导出列。
  • 支持常量配置,您需要按照JSON格式进行配置。
    ["id", "1", "'mingya.wmy'", "null", "to_char(a + 1)", "2.3" , "true"]
    • id为普通列名。
    • 1为整型数字常量。
    • 'mingya.wmy'为字符串常量(注意需要加上一对单引号)。
    • null为空指针。
    • to_char(a + 1)为表达式。
    • 2.3为浮点数。
    • true为布尔值。
  • column必须显示填写,不允许为空。
splitFactor 切分因子,可以配置同步数据的切分份数,如果配置了多并发,会按照并发数 * splitFactor份来切分。例如,并发数=5,splitFactor=5,则会按照5*5=25份来切分,在5个并发线程上执行。
说明 建议取值范围:1~100,过大会导致内存溢出。
5
splitMode 切分模式,包括:
  • averageInterval:平均采样,根据splitPK找到最大值和最小值,然后按照切分数目平均切分。
  • randomSampling:随机采样,在所有数据中随机找到一定数目作为切分点。
说明
  • splitPk为字符串类型时,splitMode需要配为randomSampling
  • splitMode切分模式为averageInterval时,仅支持splitPk配置为数值类型。
randomSampling
splitPk Oracle Reader进行数据抽取时,如果指定splitPk,表示您希望使用splitPk代表的字段进行数据分片,数据同步因此会启动并发任务进行数据同步,可以提高数据同步的效能。
  • 推荐splitPk用户使用表主键,因为表主键通常情况下比较均匀,因此切分出来的分片也不容易出现数据热点。
  • splitPk支持数值类型、字符串类型,浮点和日期等其它类型。
  • 如果不填写splitPk,将视作您不对单表进行切分,Oracle Reader使用单通道同步全量数据。
说明 splitPK字段在视图的情况下不能使用ROWID。
where 筛选条件,Oracle Reader根据指定的columntablewhere条件拼接SQL,并根据该SQL进行数据抽取。例如,在测试时指定where条件为row_number()
  • where条件可以有效地进行业务增量同步 。
  • where条件不配置或为空时,将视作全表同步数据 。
querySql(高级模式,向导模式不支持) 在部分业务场景中,where配置项不足以描述所筛选的条件,您可以通过该配置来自定义筛选SQL。当您配置该项后,数据同步系统就会忽略tablecolumn等配置,直接使用该配置项的内容对数据进行筛选。例如,需要进行多表Join后同步数据,则使用select a,b from table_a join table_b on table_a.id = table_b.id。当您配置querySql时,Oracle Reader直接忽略tablecolumnwhere条件的配置。
fetchSize 该配置项定义了插件和数据库服务器端每次批量数据获取条数,该值决定了数据同步系统和服务器端的网络交互次数,能够较大的提升数据抽取性能。
说明 fetchSize值过大(>2048)可能造成数据同步进程OOM。
1,024

向导开发介绍

  1. 选择数据源。
    配置同步任务的数据来源数据去向选择数据源
    参数 描述
    数据源 即上述参数说明中的datasource,通常输入您配置的数据源名称。
    Schema 即上述参数说明中的selectedDatabase,选择待同步数据库的schema。
    即上述参数说明中的table,选择待同步的表。
    数据过滤 您将要同步数据的筛选条件,暂时不支持limit关键字过滤。SQL语法与选择的数据源一致。
    切分键 您可以将源数据表中某一列作为切分键,建议使用主键或有索引的列作为切分键,向导模式仅支持类型为整型的字段。 如果需要配置为字符串,浮点和日期等其它类型的字段,请切换成脚本模式。
    读取数据时,根据配置的字段进行数据分片,实现并发读取,可以提升数据同步效率。
    说明 切分键与数据同步中的选择来源有关,配置数据来源时才显示切分键配置项。
  2. 字段映射,即上述参数说明中的column
    左侧的源头表字段和右侧的目标表字段为一一对应关系。单击添加一行可以增加单个字段,鼠标放至需要删除的字段上,即可单击删除图标进行删除 。字段映射
    参数 描述
    同名映射 单击同名映射,可以根据名称建立相应的映射关系,请注意匹配数据类型。
    同行映射 单击同行映射,可以在同行建立相应的映射关系,请注意匹配数据类型。
    取消映射 单击取消映射,可以取消建立的映射关系。
    自动排版 可以根据相应的规律自动排版。
    手动编辑源表字段 请手动编辑字段,一行表示一个字段,首尾空行会被采用,其他空行会被忽略。
    添加一行
    • 可以输入常量,输入的值需要使用英文单引号。例如,'abc''123'等。
    • 可以配合调度参数使用。例如,${bizdate}等。
    • 可以输入关系数据库支持的函数。例如,now()count(1)等。
    • 如果您输入的值无法解析,则类型显示为未识别
  3. 通道控制。通道配置
    参数 描述
    任务期望最大并发数 数据同步任务内,可以从源并行读取或并行写入数据存储端的最大线程数。向导模式通过界面化配置并发数,指定任务所使用的并行度。
    同步速率 设置同步速率可以保护读取端数据库,以避免抽取速度过大,给源库造成太大的压力。同步速率建议限流,结合源库的配置,请合理配置抽取速率。
    错误记录数 错误记录数,表示脏数据的最大容忍条数。
    分布式处理能力

    数据同步时,可以将任务切片分散到多台执行节点上并发执行,提高同步速率。该模式下,配置较大任务并发数会增加数据存储访问压力,如需使用该功能,请提前评估数据存储的访问负载。该功能仅支持在独享数据集成资源组配置,详情请参见独享数据集成资源组新增和使用独享数据集成资源组

脚本开发介绍

配置一个从Oracle数据库同步抽取数据的作业。
{
    "type": "job",
    "version": "2.0",
    "steps": [
        {
            "stepType": "oracle",
            "parameter": {
                "selectedDatabase": "AUTOTEST",
                "indexes": [],
                "datasource": "oracle_test",
                "envType": 0,
                "useSpecialSecret": true,
                "column": [
                    "id"
                ],
                "where": "",
                "splitPk": "id",
                "encoding": "UTF-8",
                "table": "AUTOTEST.table01"
            },
            "name": "Reader",
            "category": "reader"
        },
        {
            "stepType": "odps",
            "parameter": {
            },
            "name": "Writer",
            "category": "writer"
        },
        {
            "name": "Processor",
            "stepType": null,
            "category": "processor",
            "copies": 1,
            "parameter": {
                "nodes": [],
                "edges": [],
                "groups": [],
                "version": "2.0"
            }
        }
    ],
    "setting": {
        "executeMode": null,
        "errorLimit": {
            "record": ""
        },
        "speed": {
            "concurrent": 2,
            "throttle": false
        }
    },
    "order": {
        "hops": [
            {
                "from": "Reader",
                "to": "Writer"
            }
        ]
    }
}

使用说明

  • 主备同步数据恢复问题

    主备同步问题指Oracle使用主从灾备,当主库报错切换至备库后,备库从主库不断地通过binlog恢复数据。由于主备数据同步存在一定的时间差,在网络延迟等特定情况下,会导致备库同步恢复的数据与主库有较大差别,从备库同步的数据不是一份当前时间的完整镜像。

  • 一致性约束

    Oracle在数据存储划分中属于RDBMS系统,对外可以提供强一致性数据查询接口。例如,在一次同步任务启动运行的过程中,当该库存在其它数据写入方写入数据时,由于数据库本身的快照特性,Oracle Reader不会获取到写入的新数据。

    上述是在Oracle Reader单线程模型下实现数据同步的一致性。Oracle Reader根据您配置的信息并发抽取数据,则不能严格保证数据一致性。

    当Oracle Reader根据splitPk进行数据切分后,会先后启动多个并发任务完成数据同步。多个并发任务相互之间不属于同一个读事务,同时多个并发任务存在时间间隔。因此该数据并不是完整的、一致的数据快照信息。

    针对多线程的一致性快照需求,目前在技术上无法实现,只能从工程角度解决。工程化的方式存在取舍,在此提供以下解决思路,您可以根据自身情况进行选择。
    • 使用单线程同步,即不再进行数据切片。缺点是速度比较慢,但是能够很好保证一致性。
    • 关闭其它数据写入方,保证当前数据为静态数据。例如,锁表、关闭备库同步等。缺点是可能影响在线业务。
  • 数据库编码问题

    Oracle Reader底层使用JDBC进行数据抽取,JDBC天然适配各类编码,并在底层进行了编码转换。因此Oracle Reader无需您指定编码,可以自动获取编码并转码。

  • 增量数据同步的方式
    Oracle Reader使用JDBC SELECT语句完成数据抽取工作,因此您可以使用SELECT…WHERE…进行增量数据抽取,方式如下:
    • 数据库在线应用写入数据库时,填充modify字段为更改时间戳,包括新增、更新、删除(逻辑删除)。对于该类应用,Oracle Reader只需要where条件后跟上一同步阶段时间戳即可。
    • 对于新增流水型数据,Oracle Reader在where条件后跟上一阶段最大自增ID即可。

    对于业务上无字段区分新增、修改数据的情况,Oracle Reader无法进行增量数据同步,只能同步全量数据。

  • SQL安全性

    Oracle Reader为您提供querySql功能,您可以自行实现SELECT抽取语句。Oracle Reader本身对querySql不进行任何安全性校验。