本页介绍了如何配置变更数据捕获 (CDC),以将数据从 Amazon RDS Oracle 数据库流式传输到支持的目标位置,例如 BigQuery 或 Cloud Storage。
您可以配置源 Oracle 数据库,以用于以下 CDC 方法:
如需详细了解二进制日志读取器和 LogMiner API,请参阅使用 Oracle 数据库重做日志文件。
如需详细了解如何针对每种方法配置源 Oracle 数据库,请参阅以下部分。
为二进制日志读取器配置 Amazon RDS Oracle 数据库
对于 Amazon RDS 源,Datastream 仅支持数据库目录对象作为二进制日志读取器的日志访问方法。您需要创建指向在线重做日志文件和归档日志文件的数据库目录。这些目录的名称是静态的,以后无法更改。 您需要在创建数据流时向 Datastream 提供这些名称。
- 连接到源 Amazon RDS 实例。 
- 在终端中或使用 Amazon RDS 控制面板运行以下命令: - BEGIN rdsadmin.rdsadmin_master_util.create_archivelog_dir; END; BEGIN rdsadmin.rdsadmin_master_util.create_onlinelog_dir; END; COMMIT; GRANT READ ON DIRECTORY ONLINELOG_DIR TO USER_NAME; GRANT READ ON DIRECTORY ARCHIVELOG_DIR TO USER_NAME; 
- 验证数据库是否正以 - ARCHIVELOG模式运行。为此,请登录您的 Oracle 数据库,然后在 SQL 提示符处运行以下命令:- SELECT LOG_MODE FROM V$DATABASE;- 如果结果为 ARCHIVELOG,则继续执行第 2 步。
- 如果结果为 NOARCHIVELOG,则需要为数据库启用ARCHIVELOG模式。
- 归档的日志文件会占用磁盘空间,因此您需要为数据库配置 DB_RECOVERY_FILE_DEST_SIZE 参数。使用此参数指定目标数据库恢复文件要使用的总空间硬性限制(以字节为单位)。通过设置此参数,您可以管理以下两者之间的折衷:保护数据库免于磁盘空间不足,以及防止因日志位置丢失而导致流失败。
- 通过运行以下命令,为数据库定义数据保留政策:
exec rdsadmin.rdsadmin_util.set_configuration('archivelog retention hours',96); 
- 配置 Oracle 日志文件轮替政策。我们建议将日志文件大小上限设置为小于 1 GB 的值。
 
- 如果结果为 
- 启用补充日志数据。为此,请先运行以下命令,以启用最低限度的数据库级补充日志记录: - exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD'); - 接下来,选择是为特定表还是整个数据库启用日志记录。 - 如需仅记录特定表的更改,请针对要复制的每个表运行以下命令: - ALTER TABLE SCHEMA.TABLE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; - 替换以下内容: - SCHEMA:包含相应表的架构的名称。
- TABLE:您要记录更改的表的名称。
 - 如需复制数据库中的大部分或所有表,请考虑为整个数据库启用日志记录。在 SQL 提示符处,运行以下命令可为整个数据库启用补充日志数据: - exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD','ALL'); 
- 向数据库用户授予以下权限: - exec rdsadmin.rdsadmin_util.grant_sys_object('GV_$LOG','USER_NAME','SELECT'); exec rdsadmin.rdsadmin_util.grant_sys_object('GV_$LOGFILE','USER_NAME','SELECT'); exec rdsadmin.rdsadmin_util.grant_sys_object('GV_$ARCHIVED_LOG','USER_NAME','SELECT'); exec rdsadmin.rdsadmin_util.grant_sys_object('GV_$INSTANCE','USER_NAME','SELECT'); exec rdsadmin.rdsadmin_util.grant_sys_object('GV_$STANDBY_LOG','USER_NAME','SELECT'); exec rdsadmin.rdsadmin_util.grant_sys_object('V_$INSTANCE','USER_NAME','SELECT'); exec rdsadmin.rdsadmin_util.grant_sys_object('V_$PDBS','USER_NAME','SELECT'); exec rdsadmin.rdsadmin_util.grant_sys_object('V_$TRANSPORTABLE_PLATFORM','USER_NAME', - 'SELECT'); exec rdsadmin.rdsadmin_util.grant_sys_object('V_$DATABASE','USER_NAME','SELECT'); exec rdsadmin.rdsadmin_util.grant_sys_object('V_$PARAMETER','USER_NAME','SELECT'); exec rdsadmin.rdsadmin_util.grant_sys_object('COL$','USER_NAME','SELECT'); exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_OBJECTS','USER_NAME','SELECT'); exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_TABLESPACES','USER_NAME','SELECT'); exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_ENCRYPTED_COLUMNS','USER_NAME','SELECT'); exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_EXTENTS','USER_NAME','SELECT'); GRANT CONNECT TO USER_NAME; GRANT CREATE SESSION TO USER_NAME; GRANT SELECT ANY TABLE TO USER_NAME; - 将 USER_NAME 替换为您打算用于连接到数据库的用户账号的名称。 
为 LogMiner 配置 Amazon RDS Oracle 数据库
- 验证数据库是否正以 - ARCHIVELOG模式运行。为此,请登录您的 Oracle 数据库,然后在 SQL 提示符处运行以下命令:- SELECT LOG_MODE FROM V$DATABASE;- 如果结果为 ARCHIVELOG,则继续执行第 2 步。
- 如果结果为 - NOARCHIVELOG,则需要为数据库启用- ARCHIVELOG模式。- 要点:如需让数据库以 - ARCHIVELOG模式运行,您必须为数据库启用备份。
- 归档的日志文件会占用磁盘空间,因此您需要为数据库配置 DB_RECOVERY_FILE_DEST_SIZE 参数。使用此参数指定目标数据库恢复文件要使用的总空间硬性限制(以字节为单位)。通过设置此参数,您可以管理以下两者之间的折衷:保护数据库免于磁盘空间不足,以及避免因日志位置丢失而导致流失败。 
- 通过运行以下命令,为数据库定义数据保留政策: - exec rdsadmin.rdsadmin_util.set_configuration('archivelog retention hours',96);- 我们建议您将备份和归档日志至少保留 4 天,建议保留 7 天。 
 
- 如果结果为 
- 启用补充日志数据。为此,请先运行以下命令,启用最低限度的数据库级补充日志记录: - exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD');- 接下来,选择是为特定表还是整个数据库启用日志记录。 - 如需仅记录特定表的更改,请针对要复制的每个表运行以下命令: - ALTER TABLE SCHEMA.TABLE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; - 替换以下内容: - SCHEMA:包含相应表的架构的名称。
- TABLE:您要记录更改的表的名称。
 - 如需复制数据库中的大部分或所有表,请考虑为整个数据库启用日志记录。 - 在 SQL 提示符处,运行以下命令可为整个数据库启用补充日志数据: - exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD','ALL');
- 向将用于连接到数据库的用户账号授予适当的权限。为此,请运行以下命令: - GRANT EXECUTE_CATALOG_ROLE TO USER_NAME; GRANT CONNECT TO USER_NAME; GRANT CREATE SESSION TO USER_NAME; exec rdsadmin.rdsadmin_util.grant_sys_object('V_$DATABASE','USER_NAME','SELECT'); exec rdsadmin.rdsadmin_util.grant_sys_object('V_$ARCHIVED_LOG','USER_NAME','SELECT'); exec rdsadmin.rdsadmin_util.grant_sys_object('V_$LOG','USER_NAME','SELECT'); -- for primary databases exec rdsadmin.rdsadmin_util.grant_sys_object('V_$STANDBY_LOG','USER_NAME','SELECT'); -- for standby databases exec rdsadmin.rdsadmin_util.grant_sys_object('V_$LOGFILE','USER_NAME','SELECT'); exec rdsadmin.rdsadmin_util.grant_sys_object('V_$LOGMNR_LOGS','USER_NAME','SELECT'); exec rdsadmin.rdsadmin_util.grant_sys_object('V_$LOGMNR_CONTENTS','USER_NAME','SELECT'); exec rdsadmin.rdsadmin_util.grant_sys_object('V_$PARAMETER','USER_NAME','SELECT'); exec rdsadmin.rdsadmin_util.grant_sys_object('DBMS_LOGMNR','USER_NAME','EXECUTE'); exec rdsadmin.rdsadmin_util.grant_sys_object('DBMS_LOGMNR_D','USER_NAME','EXECUTE'); GRANT SELECT ANY TRANSACTION TO USER_NAME; GRANT SELECT ANY TABLE TO USER_NAME; - 如果您的数据库使用透明数据加密 (TDE),请授予以下权限: - exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_TABLESPACES','USER_NAME','SELECT'); exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_ENCRYPTED_COLUMNS','USER_NAME','SELECT'); - 如果您的组织不允许授予 - GRANT SELECT ANY TABLE权限,请使用 Datastream 常见问题解答页面中 Oracle 变更数据捕获 (CDC) 部分所述的解决方案。- 如果您的来源数据库是 Oracle 12c 或更新版本,则授予以下额外的权限: - GRANT LOGMINING TO USER_NAME; 
- 向用户账号 - SELECT授予对数据库中- DBA_EXTENTS视图的访问权限。有了此权限,您就可以为 Oracle 来源使用基于- ROWID的回填:- GRANT SELECT ON DBA_EXTENTS TO USER_NAME; 
后续步骤
- 详细了解 Datastream 如何使用 Oracle 来源。