为什么当我将二进制读取器用于 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_DIR 和 ARCHIVELOG_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
相关信息
AWS DMS 的 AWS 托管式 Oracle 源上所需的用户账户权限
访问在线和存档重做日志
使用 Oracle bystander 和 AWS DMS 将本地 Oracle 数据库迁移到 Amazon RDS for PostgreSQL