将二进制读取器用于 Amazon RDS for Oracle 时,我的 AWS DMS 任务为什么失败?

上次更新日期:2022 年 11 月 25 日

为什么当我将二进制读取器用于 Amazon Relational Database Service (Amazon RDS) for Oracle 时我的 AWS Database Migration Service (AWS DMS) 任务失败?

简短描述

在变更数据捕获 (CDC) 阶段期间,Oracle 提供了两种读取重做日志的方法:Oracle LogMiner 和二进制读取器。Oracle LogMiner 是一个 SQL 接口,用于访问在线和存档重做日志。二进制读取器是一项 AWS DMS 功能,可直接读取和解析重做日志。

使用二进制阅读器进行大量更改的迁移时,与使用 Oracle LogMiner 相比,对 Oracle 源的影响较小。这是因为存档日志被复制,然后在复制实例上进行解析。对于包含大量变更的迁移,二进制读取器通常比 Oracle LogMiner 具有更好的 CDC 性能。请务必预配置足够的网络带宽,以避免网络性能瓶颈。

如果使用二进制读取器时未满足前提条件,您可能会收到两种类型的错误:

  • 权限错误
  • 额外连接属性错误

解决方法

权限错误

AWS DMS 在源数据库上创建目录以使用二进制读取器。因此,AWS DMS 用户账户必须拥有必需的权限以访问源 Oracle 端点并创建必要的目录。如果 AWS DMS 没有权限,您会看到与此类似的日志条目:

消息

"[SOURCE_CAPTURE ]E: OCI error 'ORA-00604: error occurred at rMeecursive SQL level 1 ORA-20900: Invalid path used for directory: /rdsdbdata/log/arch ORA-06512: at "RDSADMIN.RDSADMIN", line 321 ORA-06512: at line 2' [1022307] (oradcdc_bfilectx.c:164)"

要解决这些错误,请使用 Amazon RDS 主用户作为 AWS DMS 用户。当 AWS DMS 任务开始运行时,将会自动创建这些目录。如果未创建这些目录,请先使用主用户登录到 Oracle 数据库。。然后,运行下面的命令以测试是否可创建这些目录:

SQL> exec rdsadmin.rdsadmin_master_util.create_archivelog_dir; 
SQL> exec rdsadmin.rdsadmin_master_util.create_onlinelog_dir;

通过查询 all_directories 表来检查结果:

SQL> select directory_path from all_directories where directory_name in ('ONLINELOG_DIR','ARCHIVELOG_DIR');
DIRECTORY_PATH
--------------------------------------------------------------------------------
/rdsdbdata/log/arch
/rdsdbdata/log/onlinelog

创建所需的目录 ONLINELOG_DIRARCHIVELOG_DIR 后,请重新启动您的 AWS DMS 任务。

额外连接属性错误

如果您使用二进制读取器,但是您的 Oracle 源缺少必要的额外连接属性,您将看到此日志条目:

消息

"[TASK_MANAGER ]E: ORA-00604: error occurred at recursive SQL level 1 ORA-20900: Invalid path used for directory: awsdms_dir_test ORA-06512: at "RDSADMIN.RDSADMIN", line 321 ORA-06512: at line 2 ; Invalid RDS Oracle binary reader db settings, replacePathPrefix should be set to TRUE and usePathPrefix should be set to '/rdsdbdata/log/'; Invalid RDS Oracle binary reader db settings, useAlternateFolderForOnline should be set to TRUE; Invalid RDS Oracle binary reader db setting, oraclePathPrefix should not be empty; Invalid RDS Oracle binary reader db settings; Failed while preparing stream component 'st_0_4MGMBIOJCILNOU3UHICCDBCNFQ'.; Cannot initialize subtask; Stream component 'st_0_4MGMBIOJCILNOU3UHICCDBCNFQ' terminated [1020418] (replicationtask.c:2680)"

要使用二进制读取器捕获 Amazon RDS for Oracle 源的变更数据,请将这些额外的连接属性添加至源端点:

useLogMinerReader=N;useBfile=Y;replacePathPrefix=true;usePathPrefix=/rdsdbdata/log/;useAlternateFolderForOnline=true;oraclePathPrefix=/rdsdbdata/db/ORCL_A/;accessAlternateDirectly=false