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

上次更新时间:2019 年 10 月 2 日

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

简短描述

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

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

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

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

解决方法

权限错误

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

消息
[SOURCE_CAPTURE ]E: OCI error 'ORA-00604: error occurred at recursive 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 Oracle 数据源的变更数据,请将以下额外连接属性添加到源终端节点:

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