本部分包含有关以下内容的信息:
- Datastream 如何处理从来源 Oracle 数据库中拉取的数据的行为
- Datastream 支持的 Oracle 数据库版本
- 如何设置来源 Oracle 数据库以便将数据从该数据库流式传输到目标位置的概述
- 将 Oracle 数据库用作来源的已知限制
行为
Datastream 支持两种方法从 在线重做日志文件中提取数据变更:Oracle 二进制日志读取器 (预览版)和 Oracle LogMiner。
使用二进制日志读取器方法 (预览版)时,会观察到以下行为 :
如果在从在线日志文件中提取变更时存在读取延迟,Datastream 会从归档的日志文件中提取变更。
Datastream 仅将已提交的变更复制到目标位置。 未提交或回滚的事务不会被复制。
二进制读取器支持复制长度超过 4000 个字符的 Oracle
VARCHAR2列。
Datastream 还支持 Oracle LogMiner 功能来公开数据变更。该方法具有以下行为:
- 可以选择给定数据库中的所有架构或特定架构,以及架构或特定表中的所有表。
- 复制所有历史数据。
- 复制所有数据操纵语言 (DML) 变更,例如从指定数据库和表插入、更新和删除。
- Datastream 将已提交和(在某些情况下)未提交的变更复制到目标位置。Datastream 读取未提交的变更。如果回滚,则 Datastream 输出记录还包括相反的操作。例如,如果存在回滚的
INSERT操作,则输出记录也将包含相应的DELETE操作。在这种情况下,该事件将显示为仅包含ROWID的DELETE事件。
基于 ROWID 的回填
在 Oracle 中,ROWID 是一个伪列,用于存储表中行的唯一标识符。Datastream 将 ROWID 值用于其回填操作。因此,我们建议您在回填操作完成之前,不要执行任何可能会更改来源 Oracle 数据库中的 ROWID 值的操作。
可能会更改 ROWID 值的操作包括:
行的物理移动:
- 导出和导入操作:当您导出表,然后将其重新导入时,行的物理位置可能会发生变化,从而导致新的
ROWID值。 ALTER TABLE (...) MOVE命令:将表移动到其他表空间可能会更改物理存储,并导致ROWID发生变化。ALTER TABLE (...) SHRINK SPACE命令:此命令会压缩表,可能会移动行并影响其ROWID值。- 分区操作:拆分、合并或移动分区可能会更改行的物理位置及其
ROWID值。
- 导出和导入操作:当您导出表,然后将其重新导入时,行的物理位置可能会发生变化,从而导致新的
闪回操作:
FLASHBACK TABLE命令:将表恢复到之前的状态涉及删除和重新插入行,从而创建新的ROWID值。FLASHBACK_TRANSACTION_QUERY:与FLASHBACK TABLE类似。如果在事务中删除了或更新了行,则回滚事务可能会导致ROWID发生变化。
排查 Oracle 11.2.0.4 分区表回填问题
如果 Oracle 11.2.0.4 上的分区表回填失败,并出现意外的提取错误(索引超出范围),这是因为 Oracle 元数据存在 bug,导致对 ALL_OBJECTS 的查询无法返回子分区。
- 解决方法:暂时撤消 Datastream 用户的
SELECT ON DBA_EXTENTS权限(例如,REVOKE SELECT ON sys.dba_extents FROM USER_NAME;)。这会强制 Datastream 使用基于索引的回填,从而绕过元数据问题。
备用数据库
当您使用 Oracle Active Data Guard 备用数据库作为来源时,Datastream 会读取归档的重做日志。为确保
Datastream 仅处理已成功
应用于备用数据库的重做日志,您必须过滤标准 Oracle 视图(例如
V$ARCHIVED_LOG 和 GV$ARCHIVED_LOG),以仅包含具有
APPLIED = 'YES' 过滤条件的记录。
您可以通过创建自定义视图来实现此目的。确保您为 Datastream 用户授予对这些视图的适当访问权限。例如:
CREATE OR REPLACE VIEW USER_NAME.local_v$archived_log AS
SELECT * FROM sys.v_$ARCHIVED_LOG
WHERE RESETLOGS_CHANGE# = (SELECT resetlogs_change# FROM v$database)
AND APPLIED = 'YES';
CREATE OR REPLACE VIEW USER_NAME.local_gv$archived_log AS
SELECT * FROM sys.gv_$ARCHIVED_LOG
WHERE RESETLOGS_CHANGE# = (SELECT resetlogs_change# FROM v$database)
AND APPLIED = 'YES';
CREATE SYNONYM USER_NAME.v$archived_log FOR USER_NAME.local_v$archived_log;
CREATE SYNONYM USER_NAME.gv$archived_log FOR USER_NAME.local_gv$archived_log;
使用 APPLIED = 'YES' 过滤条件会对数据新鲜度产生影响。
Datastream 会等待备用数据库的托管恢复进程 (MRP) 应用日志并将 APPLIED 列更新为 YES,然后再提取变更。如果 MRP 进程延迟或暂停(例如,如果您暂停备用应用进程),这会直接影响复制数据的新鲜度。Datastream 会进入重试循环,并延迟处理,直到新应用的归档日志可用为止。
在复制包含大型对象 (LOB) 列的表时,此配置非常重要。对于 UPDATE 操作,重做日志中不存在 LOB 列的详细值;因此,Datastream 必须查询数据库以提取关联的行。如果 Datastream 处理未应用的重做日志并尝试从备用数据库提取 LOB 值,则可能会提取不正确、过时的值。通过过滤日志以确保它们先被完全应用,Datastream 可以检索正确的数据。
版本
Datastream 支持以下版本的 Oracle 数据库:
- Oracle 11g,11.2.0.4 版(仅支持 Logminer CDC 方法)
- Oracle 12c,12.1.0.2 版
- Oracle 12c,12.2.0.1 版
- Oracle 18c
- Oracle 19c
- Oracle 21c
Datastream 支持以下类型的 Oracle 数据库:
- 本地或任何云服务商处的自托管数据库
- Amazon RDS for Oracle
- Oracle Cloud
- Oracle Exadata
- Oracle RAC
- Oracle Active Data Guard 备用数据库
设置
要设置来源 Oracle 数据库,以便将来自该数据库的数据流式传输到目标位置,您必须配置数据库以授予访问权限、设置日志记录和定义保留政策。
请参阅 配置来源 Oracle 数据库,了解如何配置此数据库,以便 Datastream 能够从该数据库将数据拉取到目标位置。
最佳做法
本部分介绍了将 Oracle 来源配置为与 Datastream 搭配使用的建议最佳实践。
二进制读取器区分大小写
使用二进制读取器 CDC 方法配置 Oracle 来源并为重做日志和归档日志指定目录名称时,请注意名称区分大小写。确保您在 Datastream 连接配置文件中提供的目录名称与 Oracle 数据库中目录名称的大小写完全一致。
CDC 并发
为最大限度地减少复制延迟,请确保 Datastream 可以像 Oracle 来源创建重做日志一样快速地处理这些日志。使用二进制读取器 CDC 方法时,Datastream 并发性处于重做日志文件级别:由 maxConcurrentCdcTasks 定义的每个任务一次处理一个文件。
我们建议您使用以下方法:
- 调整 Datastream 中的并发性 :确定业务高峰时段的平均
重做日志切换次数,并相应地配置
maxConcurrentCdcTasks参数。如需了解详情,请参阅 CDC 任务数量上限。 - 配置 Oracle 日志切换 :将 Oracle 配置为频繁切换日志,例如每 10-20 分钟切换一次。这会创建稳定的较小工作单元流,使 Datastream 并发任务能够有效地并行工作。
我们建议您优化设置,以便 Datastream 中有足够的并发任务来处理 Oracle 频繁创建的较小重做日志。如需了解详情,请参阅 数据流并发控制。
已知限制
将 Oracle 数据库用作来源的已知限制包括:
- 数据流限 10,000 个表。如果数据流包含的表超过 10,000 个,则可能会遇到错误。
- Datastream 支持 Oracle 多租户架构 (CDB/PDB),但您只能在一个数据流中复制一个可插入数据库。
- 不支持 Oracle 自治数据库。
- 对于没有主键的表,Datastream 会使用行的
ROWID在用户端执行合并操作。请注意,ROWID可能不是唯一的。例如,如果您使用 Oracle 的导出/导入实用程序删除并重新插入一行,则该行的ROWID可能会发生变化。如果您删除一行,则 Oracle 可以将其ROWID重新分配给稍后插入的新行。 - 不支持索引整理表 (IOT)。
- 不支持临时表。
- 不支持 以下 Oracle 数据类型,并且不会复制这些数据类型。这些类型的列在目标位置复制为
NULL值:ANYDATA、ANYDATASET、ANYTYPEVARRAY(Oracle 数组)BFILE、BFILENAMEINTERVAL DAY TO SECOND、INTERVAL YEAR TO MONTHLONG、LONG RAWUROWIDUDT- 媒体和空间类型:
ORDAUDIO、ORDDATASOURCE、ORDDICOM、ORDDOC、ORDIMAGE、ORDVIDEO、SDO_GEOMETRY(以及所有其他MDSYS.SDO_*类型)。
如需流式传输大型对象数据类型(例如
XMLTYPE、二进制大型对象 (BLOB)、字符大型对象 (CLOB) 和国家字符大型对象 (NCLOB))的列,您需要在数据流配置中添加streamLargeObjects标志。如果您不添加该标志,Datastream 不会流式传输此类列,并且这些列在目标位置会被替换为NULL值。如需了解详情,请参阅为 Oracle 来源启用大型对象流式传输。 在流式传输这些数据类型时,Datastream 必须查询来源数据库,以提取时间点缺失的 LOB 值(在称为补充的主动查找过程中)。这会在以下情况下发生:- 在
UPDATE期间,当未更改的 LOB 有效负载从重做日志中删除时 - 在涉及二进制 XML 类型的任何 DML 操作期间
- 如果数据流使用 LogMiner 方法,则在包含 LOB 的表上执行任何已解析的 DML 期间
由于 Datastream 通过查询数据库来流式传输这些列,因此在涉及快速连续更新或在插入后快速删除的情况下,可能无法捕获中间变更。请注意,
DELETE操作不会触发补充。当使用仅追加写入模式时,此限制尤其重要,因为该模式需要捕获所有中间变更。- 在
对于 Oracle 11g,不支持列的数据类型为
ANYDATA或UDT的表,并且不会复制整个表。不复制 Oracle 标签安全 (OLS)。
Datastream 在处理事件时定期从来源提取最新的架构。如果架构发生更改,则在仍然应用旧架构时,系统可能会读取新架构中的某些事件。在这种情况下,Datastream 会检测架构更改、触发架构提取并重新处理失败的事件。
并非所有对源架构的更改都可以自动检测到,在这种情况下可能会发生数据损坏。以下架构更改可能会导致数据损坏或无法处理下游事件:
- 删除列
- 在表中间添加列
- 更改列的数据类型
- 对列重新排序
- 删除表(如果同一表被重新创建并添加了新的数据,则与此相关)
- 截断表
Datastream 不支持复制视图。
Datastream 支持具体化视图。但是,在数据流运行期间创建的新视图不会自动回填。
使用 Oracle LogMiner 方法时,
SAVEPOINT语句不受支持,并且在回滚时可能会导致数据不一致。使用二进制读取器方法时,不支持动态分区表。
使用 Oracle LogMiner 方法时,Datastream 不支持复制名称超过 30 个字符的表和列。
Datastream 支持以下 Oracle 数据库字符集编码:
AL16UTF16AL32UTF8IN8ISCIIIW8ISO8859P8JA16SJISJA16SJISTILDEKO16MSWIN949US7ASCIIUTF8WE8ISO8859P1WE8ISO8859P9WE8ISO8859P15WE8MSWIN1252ZHT16BIG5
Datastream 不支持复制零日期值。此类日期会被替换为
NULL值。Datastream 不支持使用 Oracle Real Application Clusters (RAC) 环境中的单个客户端访问名称 (SCAN) 功能直接连接到数据库。如需了解可能的解决方案,请参阅 Oracle 来源行为和限制。
如果来源是 Oracle Active Data Guard 备用数据库,Datastream 仅支持表空间级加密,不支持列级加密。
使用二进制读取器时的其他限制
高性能二进制读取器方法仅适用于 Oracle 12c 及更高版本。对于 Oracle 11g 及更低版本,您必须使用 LogMiner。
二进制读取器不支持以下功能:
- 透明数据库加密 (TDE)
- 混合列压缩
- 安全文件
- Amazon RDS 来源不支持 ASM。
- 二进制读取器 CDC 方法不支持 Oracle 11g 及更低版本。
后续步骤
- 了解如何配置 Oracle 来源 以与 Datastream 搭配使用。