同步Oracle的数据至Kafka时,您需要参考本文,在数据源中完成网络、白名单及权限等相关配置,为后续执行数据同步方案做好网络环境及账号权限的准备。

前提条件

配置数据源之前,请确保已完成以下规划与准备工作。
  • 准备数据源:已购买来源数据源Oracle、去向数据源Kafka。
  • 资源规划与准备:已购买独享数据集成资源组,并完成资源配置。详情可参见资源规划与配置
  • 网络环境评估与规划:进行数据集成前,您需根据业务情况,打通数据源、独享数据集成资源组之间的网络,网络联通后参考本文进行交换机、白名单等网络环境下的访问配置。
    • 如果数据源和独享数据集成资源组均处于同地域的同一VPC网络中,数据源与资源组间的网络天然联通。
    • 如果数据源和独享数据集成资源组均处于不同的网络环境中,您需要通过VPN网关等方式,将数据源与资源组间的网络打通。

背景信息

同步来源数据源的数据至去向数据源时,您需要保障数据源与DataWorks的独享数据集成资源组在网络上是联通的,且不存在账号权限的访问限制。同时,需要确保Oracle数据源中不存在数据集成不支持的数据库版本、字符编码及数据类型。
  • 网络白名单
    以下以使用同一VPC网络环境为例,您需要将数据集成资源组所在的VPC网段添加至白名单中,保障数据集成资源组可访问数据源。联通VPC网络
  • 账号权限

    您需要规划一个可访问数据源的账号,用于后续数据集成过程中访问数据源并进行数据提取、写入的同步操作。

  • 查看当前使用的数据库版本是否为DataWorks数据集成实时同步任务所支持的版本。

    DataWorks的数据集成实时同步Oracle数据是基于Oracle Logminer日志分析工具实现的。实时同步Oracle数据目前仅支持配置Oracle数据源为Oracle的10g11g12c non cdb18c non cdb19c non cdb版本数据库,不支持配置为Oracle的12c cdb18c cdb19c cdb版本数据库。数据库容器CDB(Container Database)是Oracle 12c及之后版本的数据库新特性,用于承载多个可插拔数据库PDB(Pluggable Database)。

    1. 您可以通过如下任意语句查看Oracle数据库的版本。
      • 语句一:
        select * from v$version;
      • 语句二:
        select version from v$instance;
    2. 如果查看到的Oracle数据库版本为12c18c19c,则您需要使用如下语句进一步确认该数据库是否为cdb类型的数据库。DataWorks数据集成实时同步任务暂不支持使用cdb类型的Oracle数据库。
      select name,cdb,open_mode,con_id from v$database;
    说明 如果当前使用的数据库版本不是DataWorks数据集成实时同步任务支持的Oracle数据库版本,请尽快更换为数据集成实时同步任务支持的Oracle数据库版本,否则会导致数据集成任务无法执行。
  • 日志权限
    来源数据源为Oracle时,您需要开启数据库级别的归档日志、Redo日志及补充日志。
    • 归档日志:Oracle通过归档日志保存所有的重做历史记录,用于在数据库出现故障时完全恢复数据库。
    • Redo日志:Oracle通过Redo日志来保证数据库的事务可以被重新执行,从而使得在故障(例如断电)之后,数据可以被恢复,因此您需要为数据库开启并切换Redo日志。
    • 补充日志:补充日志是对Redo日志中信息的补充。在Oracle中,Redo日志用于记录被修改的字段的值,而补充日志是对Redo日志中变更记录的补充信息,可以确保Oracle的Redo日志包含描述所有数据更改的完整信息,以便在进行数据恢复、数据同步等操作时,可以追溯到完整的语句及相关变更。Oracle数据库的某些功能要求启用补充日志才能正常或更好的工作,因此您需要为数据库开启补充日志。

      例如,如果未启用补充日志,执行UPDATE命令后,Redo日志中只会记录通过UPDATE命令更改后的字段值,启用补充日志后,则Redo日志中会记录被修改字段,修改前的值、修改后的值以及修改目标字段的条件值。当数据库发生故障(例如断电)时,您可以基于此修改信息恢复数据。

      使用数据集成时推荐开启主键列或唯一索引列补充日志。
      • 开启主键列的补充日志后,如果数据库有任何更新,则组成主键的所有列都会被记录在日志中。
      • 开启唯一索引列的补充日志后,如果组成唯一键或位图索引的任何列被修改,则组成该唯一键或位图索引的列都会被记录在日志中。
    DataWorks数据集成实时同步Oracle数据前,您需要确保已为数据库开启归档日志及补充日志。查看当前使用的数据库是否开启数据库级别的归档日志及补充日志的SQL语句如下。
    select log_mode, supplemental_log_data_pk, supplemental_log_data_ui from v$database;
    • log_mode的返回结果为ARCHIVELOG,则表示数据库的归档日志已开启,当返回结果不为ARCHIVELOG,则表示数据库的归档日志未开启,您需要参考本文操作步骤的开启归档日志,开启归档日志。
    • supplemental_log_data_ui的返回结果为YES,则表示数据库的补充日志已开启,当返回结果为FALSE,则表示数据库的补充日志未开启,您需要参考本文操作步骤的开启补充日志,开启补充日志。
  • 检查数据库的字符编码格式

    您需要确保Oracle中不能包含数据集成不支持的字符编码格式,防止同步数据失败。当前数据集成同步数据时,仅支持UTF8、AL32UTF8、AL16UTF16及ZHS16GBK编码格式。

  • 检查是否包含不支持的数据类型

    您需要确保Oracle中不能包含数据集成不支持的数据类型,防止同步数据失败。当前数据集成进行实时同步时,不支持LONG、BFILE、LONG RAW及NCLOB数据类型 。

使用限制

  • Oracle仅支持在主库中为主库或备库开启补充日志。
  • 当前数据集成同步数据时,仅支持UTF8、AL32UTF8、AL16UTF16及ZHS16GBK编码格式。
  • 当前数据集成进行实时同步时,不支持LONG、BFILE、LONG RAW及NCLOB数据类型 。
  • 实时同步Oracle数据目前仅支持配置Oracle数据源为Oracle的10g11g12c non cdb18c non cdb19c non cdb版本数据库,不支持配置为Oracle的12c cdb18c cdb19c cdb版本数据库。数据库容器CDB(Container Database)是Oracle 12c及之后版本的数据库新特性,用于承载多个可插拔数据库PDB(Pluggable Database)。

注意事项

  • DataWorks数据集成实时同步任务,目前对于Oracle主库支持订阅联机重做日志(Online Redo),对于Oracle备库仅支持订阅归档日志。因此,对于时效性要求比较高的实时同步任务,建议订阅主库的实时增量变更。订阅Oracle备库时,Oracle日志的产生到可以被获取的最短延迟时间取决于Oracle的自动切换归档日志的时间,不能保证时效性。
  • Oracle数据库的归档日志建议保留3天。当写入大批量数据至Oracle数据库时,实时同步数据的速度可能会慢于日志生成的速度,方便在同步任务出现问题时,为追溯数据预留足够的时间。您可以通过分析归档日志排查问题并恢复数据。
  • DataWorks数据集成实时同步任务,不支持对Oracle数据库中无主键的表进行truncate操作。对于无主键表进行日志分析(即logminer操作)是根据Rowid进行回查,当遇到truncate操作时会修改原表的Rowid,该操作会导致同步任务运行报错。
  • 在规格为24 vCPU 192 GiB的DataWorks上运行实时同步任务时,如果非update等操作日志较多,并且速度达到约每秒记录3~5W条数据的极限速度,则Oracle服务器的单核CPU使用率最高可以达到25%~35%;如果处理update等操作日志,则处理实时同步消息的DataWorks机器可能会存在性能瓶颈,Oracle服务器的单核CPU使用率仅可以达到1%~5%。

操作步骤

  1. 配置白名单。
    将独享数据资源组所在的VPC网段添加至Oracle的白名单中,操作如下:
    1. 查看并记录独享数据资源组所在的VPC网络。
    2. 将上述步骤中记录的独享数据集成资源组的EIP地址和网段添加至Oracle集群的白名单中。
  2. 创建账号并配置账号权限。
    您需要规划一个数据库的登录账户用于后续执行操作,此账号需要拥有Oracle的相关操作权限。
    1. 创建账号。
      操作详情请参见创建Oracle账号
    2. 配置权限。
      您可以参考以下命令为账号添加相关权限。如下执行语句在实际使用时,请替换'同步账号'为上述创建的账号。
      grant create session to '同步账号';  //授权同步账号登录数据库。
      grant connect to '同步账号';  //授权同步账号连接数据库。
      grant select on nls_database_parameters to '同步账号';  //授权同步账号查询数据库的nls_database_parameters系统配置。
      grant select on all_users to '同步账号';  //授权同步账号查询数据库中的所有用户。
      grant select on all_objects to '同步账号';  //授权同步账号查询数据库中的所有对象。
      grant select on DBA_MVIEWS to '同步账号';  //授权同步账号查看数据库的物化视图。
      grant select on DBA_MVIEW_LOGS to '同步账号';  //授权同步账号查看数据库的物化视图日志。
      grant select on DBA_CONSTRAINTS to '同步账号';  //授权同步账号查看数据库所有表的约束信息。
      grant select on DBA_CONS_COLUMNS to '同步账号';  //授权同步账号查看数据库中所有表指定约束中所有列的相关信息。
      grant select on all_tab_cols to '同步账号';  //授权同步账号查看数据库中表、视图和集群中列的相关信息。
      grant select on sys.obj$ to '同步账号';  //授权同步账号查看数据库中的对象。sys.obj$表是Oracle字典表中的对象基础表,存放Oracle的所有对象。
      grant select on SYS.COL$ to '同步账号';  //授权同步账号查看数据库表中列的定义信息。SYS.COL$用于保存表中列的定义信息。
      grant select on sys.USER$ to '同步账号';  //授权同步账号查看数据库的系统表。sys.USER$是用户会话的默认服务。
      grant select on sys.cdef$ to '同步账号';  //授权同步账号查看数据库的系统表。
      grant select on sys.con$ to '同步账号';  //授权同步账号查看数据库的约束信息。sys.con$记录了Oracle的相关约束信息。
      grant select on all_indexes to '同步账号';  //授权同步账号查看数据库的所有索引。
      grant select on v_$database to '同步账号';  //授权同步账号查看数据库的v_$database视图。
      grant select on V_$ARCHIVE_DEST to '同步账号';  //授权同步账号查看数据库的V_$ARCHIVE_DEST视图。
      grant select on v_$log to '同步账号';  //授权同步账号查看数据库的v_$log视图。v_$log用于显示控制文件中的日志文件信息。
      grant select on v_$logfile to '同步账号';  //授权同步账号查看数据库的v_$logfile视图。v_$logfile包含有关Redo日志文件的信息。
      grant select on v_$archived_log to '同步账号';  //授权同步账号查看数据库的v$archived_log视图。v$archived_log包含有关归档日志的相关信息。
      grant select on V_$LOGMNR_CONTENTS to '同步账号';  //授权同步账号查看数据库的V_$LOGMNR_CONTENTS视图。
      grant select on DUAL to '同步账号';   //授权同步账号查看数据库的DUAL表。DUAL是用来构成select语法规则的虚拟表,Oracle的中DUAL中仅保留一条记录。
      grant select on v_$parameter to '同步账号';  //授权同步账号查看数据库的v_$parameter视图。v$parameter是Oracle的动态字典表,保存了数据库参数的设置值。
      grant select any transaction to '同步账号';  //授权同步账号查看数据库的任意事务。
      grant execute on SYS.DBMS_LOGMNR to '同步账号';  //授权同步账号使用数据库的Logmnr工具。Logmnr工具可以帮助您分析事务,并找回丢失的数据。
      grant alter session to '同步账号';  //授权同步账号修改数据库的连接。
      grant select on dba_objects to '同步账号';  //授权同步账号查看数据库的所有对象。
      grant select on v_$standby_log to '同步账号';  //授权同步账号查看数据库的v_$standby_log视图。v_$standby_log包含备用库的归档日志。
      grant select on v_$ARCHIVE_GAP to '同步账号';  //授权同步账号查询缺失的归档日志。
      如果您涉及使用离线全量同步数据,还需要执行如下命令,授权同步账号所有表的查询权限。
      grant select any table to '同步账号'; 
      Oracle 12c及之后的版本需要执行如下命令,授权同步账号可以进行日志挖掘。Oracle 12c之前的版本,内置日志挖掘功能,无需执行该命令。
      grant LOGMINING TO '同步账号';
  3. 开启归档日志、补充日志并切换Redo日志文件。
    您需要进入主库执行如下操作:
    1. 开启归档日志,SQL语句如下。
      shutdown immediate;
      startup mount;
      alter database archivelog;
      alter database open;
    2. 开启补充日志。

      您可以根据需要选择开启合适的补充日志,SQL语句如下。

      alter database add supplemental log data(primary key) columns; //为数据库的主键列开启补充日志。
      alter database add supplemental log data(unique) columns; //为数据库的唯一索引列开启补充日志。
    3. 切换Redo日志文件。
      开启补充日志后,您需要多次(一般建议执行5次)执行如下命令,切换Redo日志文件。
      alter system switch logfile;
      说明 多次执行上述命令切换Redo日志文件,是保证当前日志文件被写满后可以切换至下一个日志文件。使执行过的操作记录不会丢失,便于后续恢复数据。
  4. 检查数据库的字符编码。
    您需要在当前使用的数据库中,执行如下命令检查数据库的字符编码。
    select * from v$nls_parameters where PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');
    • v$nls_parameters用于存放数据库参数的设置值。
    • NLS_CHARACTERSETNLS_NCHAR_CHARACTERSET为数据库字符集和国家字符集,表明Oracle中两大类字符型数据的存储类型。
    当前数据集成同步数据时,仅支持UTF8、AL32UTF8、AL16UTF16及ZHS16GBK编码格式。如果数据库中包含不支持的字符编码,请进行修改后再执行数据同步。
  5. 检查数据库表的数据类型。
    您可以使用查看表的SQL相关语句(SELECT)查询数据库表的数据类型。示例查看'tablename'表数据类型的语句如下。
    select COLUMN_NAME,DATA_TYPE from all_tab_columns where TABLE_NAME='tablename'; 
    • COLUMN_NAME:表的列名称。
    • DATA_TYPE:对应列的数据类型。
    • all_tab_columns:存放数据库表所有列相关信息的视图。
    • TABLE_NAME:需要查询的目标表的名称。执行上述语句时,请替换'tablename'为实际需要查看的表名称。
    您也可以执行select * from 'tablename';,查询目标表的所有信息,获取数据类型。
    当前数据集成进行实时同步时,不支持LONG、BFILE、LONG RAW及NCLOB数据类型 。如果表里包含这些字段类型,请将该表从实时同步任务列表中移除,或修改表字段类型后再执行数据同步。

后续步骤

配置完成数据源后,来源数据源、资源实例、去向数据源彼此间已可网络联通,且不存在访问限制。您可将来源数据源和去向数据源添加至DataWorks的数据源列表中,便于后续创建数据同步方案时关联来源和去向数据源。

添加数据源操作可参见添加数据源