将 Oracle GoldenGate 与 Amazon RDS 结合使用 - Amazon Relational Database Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

将 Oracle GoldenGate 与 Amazon RDS 结合使用

Oracle GoldenGate (GoldenGate) 可收集、复制和管理数据库之间的事务数据。它是一个基于日志的更改数据捕获 (CDC) 和复制软件包,与 Oracle 数据库结合使用,适用于联机事务处理 (OLTP) 系统。GoldenGate 从源数据库创建包含最近更改的数据的跟踪文件,然后将这些文件推送到目标数据库。Amazon RDS 支持针对 Oracle 数据库标准版二 (SE2) 和企业版 (EE) 的 GoldenGate。

您可以将 GoldenGate 与 Amazon RDS 结合使用来执行以下操作:

  • 主动/主动数据库复制

  • 零停机时间迁移和升级

  • 灾难恢复

  • 数据保护

  • 区域中和跨区域复制

在 Amazon RDS 上使用 GoldenGate 时,请考虑以下事项:

  • 您负责设置和维护 GoldenGate 以用于 Amazon RDS。

  • 您负责管理 GoldenGate 许可(自带许可)以用于所有 Amazon 区域中的 Amazon RDS。有关更多信息,请参阅Oracle 许可选项

  • Amazon RDS 支持 GoldenGate 版本 11.2.1 及更高版本。

  • Amazon RDS 支持使用 GoldenGate 跨 Oracle 数据库进行迁移和复制。我们既不支持也不阻止客户跨异构数据库进行迁移或复制。

  • 您可以在使用 Oracle 透明数据加密 (TDE) 的 Amazon RDS for Oracle 数据库实例上使用 GoldenGate。要保持复制的数据的完整性,应使用 EBS 加密卷或跟踪文件加密在 GoldenGate 枢纽上配置加密。您还应该为 GoldenGate 枢纽与源和目标数据库实例之间发送的数据配置加密。Amazon RDS for Oracle 数据库实例支持使用 Oracle 安全套接字层Oracle 本机网络加密 进行加密。

  • 在使用集成捕获模式时,GoldenGate 12.1 和更高版本支持 GoldenGate DDL。

概述

与 Amazon RDS 结合使用的 GoldenGate 架构包含三个分离的模块。源数据库可以是本地 Oracle 数据库、Amazon EC2 实例上的 Oracle 数据库或 Amazon RDS 数据库实例上的 Oracle 数据库。您还可以使用 GoldGate 枢纽,将事务信息从源数据库移动到目标数据库。您的枢纽可以是以下之一:

  • 安装了 Oracle 数据库和 GoldenGate 的 Amazon EC2 实例

  • 本地 Oracle 安装。

您可以有多个 Amazon EC2 枢纽;如果要将 GoldenGate 用于跨区域复制,则建议使用两个枢纽。

目标数据库可位于 Amazon RDS 数据库实例上、位于 Amazon EC2 实例上或位于一个本地位置。

Amazon RDS 上的 GoldenGate 支持以下常见方案:

方案 1:本地 Oracle 源数据库和本地 GoldenGate 枢纽,用于向目标 Amazon RDS 数据库实例提供数据。


			使用 Amazon RDS 的 GoldenGate 配置 0

方案 2:充当源数据库的本地 Oracle 数据库,连接到向目标 Amazon RDS 数据库实例提供数据的 Amazon EC2 实例枢纽。


			使用 Amazon RDS 的 GoldenGate 配置 1

方案 3:Amazon RDS 数据库实例上充当源数据库的 Oracle 数据库,连接到向目标 Amazon RDS 数据库实例提供数据的 Amazon EC2 实例枢纽。


			使用 Amazon RDS 的 GoldenGate 配置 2

方案 4:Amazon EC2 实例上充当源数据库的 Oracle 数据库,连接到向目标 Amazon RDS 数据库实例提供数据的 Amazon EC2 实例枢纽。


			使用 Amazon RDS 的 GoldenGate 配置 3

场景 5:连接到相同 Amazon 区域中的 Amazon EC2 实例枢纽的 Amazon RDS 数据库实例上的 Oracle 数据库。在这种情况下,该枢纽连接到其他 Amazon 区域中的 Amazon EC2 实例枢纽。第二个枢纽向与第二个 Amazon EC2 实例枢纽位于相同 Amazon 区域中的目标 Amazon RDS 数据库实例提供数据。


			使用 Amazon RDS 的 GoldenGate 配置 4
注意

影响在本地环境中运行 GoldenGate 的任何问题也会影响在 Amazon 上运行 GoldenGate。强烈建议对 GoldenGate 枢纽进行监控,以确保在发生故障转移的情况下恢复 EXTRACTREPLICAT。由于 GoldenGate 枢纽在 Amazon EC2 实例上运行,因此 Amazon RDS 不管理 GoldenGate 枢纽,且无法确保其运行。

您可以使用 GoldenGate 和 Amazon RDS 升级到 Oracle 的主要版本。例如,可以结合使用 GoldenGate 和 Amazon RDS,从 Oracle9i 本地数据库升级到 Amazon RDS 数据库实例上的 Oracle Database 19c。

要使用 Amazon RDS 设置 GoldenGate,请在 Amazon EC2 实例上配置枢纽,然后配置源数据库和目标数据库。下面的步骤说明了如何设置 GoldenGate 以便与 Amazon RDS 结合使用。以下部分详细说明了每个步骤:

在 Amazon EC2 上设置 GoldenGate 枢纽

要在 Amazon EC2 实例上创建 GoldGate 枢纽,您需要完成几个步骤。首先,使用 Oracle RDBMS 的完整客户端安装创建 Amazon EC2 实例。Amazon EC2 实例也必须已安装 Oracle GoldenGate 软件。确切的软件版本取决于源和目标数据库版本。有关安装 GoldenGate 的更多信息,请参阅 Oracle 文档

用作 GoldGate 枢纽的 Amazon EC2 实例会处理来自源数据库的事务信息并将这些信息存储到跟踪文件中。要支持此过程,请确保满足以下条件:

  • 您为跟踪文件分配了足够的存储空间

  • Amazon EC2 实例有足够的处理能力来管理数据量。

  • EC2 实例在写入跟踪文件之前,有足够的内存来存储事务信息。

下列任务将在 Amazon EC2 实例上设置 GoldenGate 枢纽;此部分详细说明了每个任务:

  1. 创建 GoldenGate 子目录。

  2. 更新 GLOBALS 参数文件。

  3. 配置 mgr.prm 文件并启动管理器。

使用 Amazon EC2 命令行 shell 和 ggsci(GoldenGate 命令解释器)在 GoldenGate 目录中创建子目录。子目录是在 gg 目录下创建的,包含用于放置参数、报告和检查点文件的目录。

prompt$ cd /gg prompt$ ./ggsci GGSCI> CREATE SUBDIRS

使用 Amazon EC2 命令行 shell 创建 GLOBALS 参数文件。在 GLOBALS 参数文件中定义的参数会影响所有 GoldenGate 进程。下面的示例将创建必要的文件:

$ cd $GGHOME $ vi GLOBALS CheckpointTable oggadm1.oggchkpt

设置和配置 GoldenGate 枢纽的最后一步是配置管理器。向 mgr.prm 文件添加下列行,然后使用 ggsci 启动管理器

PORT 8199 PurgeOldExtracts ./dirdat/*, UseCheckpoints, MINKEEPDAYS 5
GGSCI> start mgr

完成这些步骤后,GoldenGate 枢纽就随时可以使用了。接下来,设置源数据库和目标数据库。

设置源数据库以便与 Amazon RDS 上的 GoldenGate 结合使用

如果源数据库运行的是 Oracle Database 12c 或更高版本,则设置与 GoldenGate 结合使用的源数据库需要完成以下任务:

  1. ENABLE_GOLDENGATE_REPLICATION 参数设置为 True。该参数用于开启源数据库的补充日志记录。如果源数据库位于 Amazon RDS 数据库实例上,请确保为数据库实例分配一个参数组,且将其 ENABLE_GOLDENGATE_REPLICATION 参数设置为 true。有关 ENABLE_GOLDENGATE_REPLICATION 参数的更多信息,请参阅 Oracle 文档

  2. 为 GoldenGate 源数据库设置存档重做日志的保留期。

  3. 在源数据库上创建 GoldenGate 用户账户。

  4. 为 GoldenGate 用户授予必要权限。

  5. 将源数据库的 TNS 别名添加到 GoldenGate 枢纽上的 tnsnames.ora 文件中。

在源数据库上启用补充日志记录

设置为 TrueENABLE_GOLDENGATE_REPLICATION 参数会开启源数据库的补充日志记录,并配置所需的 GoldenGate 权限。如果源数据库位于 Amazon RDS 数据库实例上,请确保为数据库实例分配一个参数组,且将其 ENABLE_GOLDENGATE_REPLICATION 参数设置为 true。有关 ENABLE_GOLDENGATE_REPLICATION 的更多信息,请参阅 Oracle 文档

在源数据库上设置日志保留期

源数据库还必须保留存档重做日志。例如,将存档重做日志的保留期设置为 24 小时。

exec rdsadmin.rdsadmin_util.set_configuration('archivelog retention hours',24);

以小时为单位指定日志保留的持续时间。持续时间应超过源实例的任何可能的停机时间、任何可能的通信时间以及源实例的任何可能的联网问题时间。指定这样的持续时间后,可允许 Oracle GoldGate 根据需要从源实例恢复日志。

所需的绝对最小值是将日志保留一小时。如果未启用日志保留,或者保留值太小,则将收到以下消息。

2014-03-06 06:17:27 ERROR OGG-00446 error 2 (No such file or directory) opening redo log /rdsdbdata/db/GGTEST3_A/onlinelog/o1_mf_2_9k4bp1n6_.log for sequence 1306Not able to establish initial position for begin time 2014-03-06 06:16:55.

日志将保留在您的数据库实例上。确保您的实例上有足够的文件存储空间。要查看过去 X 小时内使用了多少空间,请使用以下查询,并将 X 替换为小时数。

SELECT SUM(BLOCKS * BLOCK_SIZE) BYTES FROM V$ARCHIVED_LOG WHERE NEXT_TIME>=SYSDATE-X/24 AND DEST_ID=1;

在源上创建用户账户

GoldenGate 作为数据库用户运行,并且需要相应数据库权限才能访问源数据库的重做和存档日志。要提供这些权限,请在源数据库上创建 GoldenGate 用户账户。有关 GoldenGate 用户账户权限的更多信息,请参阅 Oracle 文档中的第 4 节、第 4.4 节和表 4.1。

下列语句创建名为 oggadm1 的用户账户。

CREATE TABLESPACE administrator; CREATE USER oggadm1  IDENTIFIED BY "password"   DEFAULT TABLESPACE ADMINISTRATOR TEMPORARY TABLESPACE TEMP;

在源数据库上授予账户权限

使用 SQL 命令 grantrdsadmin.rdsadmin_util 过程 grant_sys_object 向 GoldenGate 用户账户授予必要的权限。下列语句向名为 oggadm1 的用户授予权限。

GRANT CREATE SESSION, ALTER SESSION TO oggadm1; GRANT RESOURCE TO oggadm1; GRANT SELECT ANY DICTIONARY TO oggadm1; GRANT FLASHBACK ANY TABLE TO oggadm1; GRANT SELECT ANY TABLE TO oggadm1; GRANT SELECT_CATALOG_ROLE TO rds_master_user_name WITH ADMIN OPTION; exec rdsadmin.rdsadmin_util.grant_sys_object ('DBA_CLUSTERS', 'OGGADM1'); GRANT EXECUTE ON DBMS_FLASHBACK TO oggadm1; GRANT SELECT ON SYS.V_$DATABASE TO oggadm1; GRANT ALTER ANY TABLE TO oggadm1;

最后,授予用户账户作为 GoldenGate 管理员所需的权限。用于执行授予的程序包 dbms_goldengate_authrdsadmin_dbms_goldengate_auth 取决于 Oracle 数据库引擎版本。

  • 对于早于 Oracle Database 12c Release 2 (12.2) 的 Oracle 数据库版本,请运行以下 PL/SQL 程序。

    exec dbms_goldengate_auth.grant_admin_privilege (grantee=>'OGGADM1', privilege_type=>'capture', grant_select_privileges=>true, do_grants=>TRUE);
  • 对于高于或等于 Oracle Database 12c 第 2 版 (12.2)(需要补丁级别 12.2.0.1.ru-2019-04.rur-2019-04.r1 或更高版本),请运行以下 PL/SQL 程序。

    exec rdsadmin.rdsadmin_dbms_goldengate_auth.grant_admin_privilege (grantee=>'OGGADM1', privilege_type=>'capture', grant_select_privileges=>true, do_grants=>TRUE);

    要撤消权限,请使用同一个程序包中的 revoke_admin_privilege 过程。

为源数据库添加 TNS 别名

将以下条目添加到 Oracle 主目录中的 $ORACLE_HOME/network/admin/tnsnames.ora,以供 EXTRACT 进程使用。有关 tnsnames.ora 文件的更多信息,请参阅 Oracle 文档

OGGSOURCE= (DESCRIPTION= (ENABLE=BROKEN) (ADDRESS_LIST= (ADDRESS=(PROTOCOL=TCP)(HOST=goldengate-source.abcdef12345.us-west-2.rds.amazonaws.com)(PORT=8200))) (CONNECT_DATA=(SID=ORCL)) )

设置目标数据库以便与 Amazon RDS 上的 GoldenGate 结合使用

以下任务设置了与 GoldenGate 一起使用的目标数据库实例:

  1. ENABLE_GOLDENGATE_REPLICATION 参数设置为 TRUE.如果目标数据库位于 Amazon RDS 数据库实例上,请确保为数据库实例分配一个参数组,且将其 ENABLE_GOLDENGATE_REPLICATION 参数设置为 TRUE。有关 ENABLE_GOLDENGATE_REPLICATION 参数的更多信息,请参阅 Oracle 文档

  2. 创建并管理目标数据库上的 GoldenGate 用户账户

  3. 为 GoldenGate 用户授予必要权限

  4. 将目标数据库的 TNS 别名添加到 GoldenGate 枢纽上的 tnsnames.ora。

在目标数据库上创建用户账户

GoldenGate 以数据库用户身份运行,并且需要相应的数据库权限。为了确保具备这些权限,请在目标数据库上创建 GoldGate 用户帐户。

下列语句将创建名为 oggadm1 的用户:

CREATE TABLESPACE administrator; CREATE TABLESPACE administrator_idx; CREATE USER oggadm1  IDENTIFIED BY "password" DEFAULT TABLESPACE administrator TEMPORARY TABLESPACE temp; ALTER USER oggadm1 QUOTA UNLIMITED ON administrator; ALTER USER oggadm1 QUOTA UNLIMITED ON administrator_idx;

在目标数据库上授予账户权限

在目标数据库上向 GoldenGate 用户账户授予必要的权限。在以下示例中,您向 oggadm1 授予权限。

GRANT CREATE SESSION        TO oggadm1; GRANT ALTER SESSION         TO oggadm1; GRANT CREATE CLUSTER        TO oggadm1; GRANT CREATE INDEXTYPE      TO oggadm1; GRANT CREATE OPERATOR       TO oggadm1; GRANT CREATE PROCEDURE      TO oggadm1; GRANT CREATE SEQUENCE       TO oggadm1; GRANT CREATE TABLE          TO oggadm1; GRANT CREATE TRIGGER        TO oggadm1; GRANT CREATE TYPE           TO oggadm1; GRANT SELECT ANY DICTIONARY TO oggadm1; GRANT CREATE ANY TABLE      TO oggadm1; GRANT ALTER ANY TABLE       TO oggadm1; GRANT LOCK ANY TABLE        TO oggadm1; GRANT SELECT ANY TABLE      TO oggadm1; GRANT INSERT ANY TABLE      TO oggadm1; GRANT UPDATE ANY TABLE      TO oggadm1; GRANT DELETE ANY TABLE      TO oggadm1;

最后,授予用户账户作为 GoldenGate 管理员所需的权限。用于执行授予的程序包 dbms_goldengate_authrdsadmin_dbms_goldengate_auth 取决于 Oracle 数据库引擎版本。

  • 对于早于 Oracle Database 12c Release 2 (12.2) 的 Oracle 数据库版本,请运行以下 PL/SQL 程序。

    exec dbms_goldengate_auth.grant_admin_privilege (grantee=>'OGGADM1', privilege_type=>'capture', grant_select_privileges=>true, do_grants=>TRUE);
  • 对于高于或等于 Oracle Database 12c 第 2 版 (12.2)(需要补丁级别 12.2.0.1.ru-2019-04.rur-2019-04.r1 或更高版本),请运行以下 PL/SQL 程序。

    exec rdsadmin.rdsadmin_dbms_goldengate_auth.grant_admin_privilege (grantee=>'OGGADM1', privilege_type=>'capture', grant_select_privileges=>true, do_grants=>TRUE);

    要撤消权限,请使用同一个程序包中的 revoke_admin_privilege 过程。

为目标数据库添加 TNS 别名

将以下条目添加到 Oracle 主目录中的 $ORACLE_HOME/network/admin/tnsnames.ora,以供 REPLICAT 进程使用。有关 tnsname.ora 文件的更多信息,请参阅 Oracle 文档

OGGTARGET= (DESCRIPTION= (ENABLE=BROKEN) (ADDRESS_LIST= (ADDRESS=(PROTOCOL=TCP)(HOST=goldengate-target.abcdef12345.us-west-2.rds.amazonaws.com)(PORT=8200))) (CONNECT_DATA=(SID=ORCL)) )

使用 GoldenGate 的 EXTRACT 和 REPLICAT 实用程序

GoldenGate 实用程序 EXTRACTREPLICAT 结合使用,以使用跟踪文件通过增量事务复制将源数据库和目标数据库保持同步。源数据库上发生的所有更改会由 EXTRACT 自动检测,进行格式设置,然后传输至本地或 EC2 实例枢纽的 GoldenGate 上的跟踪文件。初始加载完成后,由 REPLICAT 实用程序从这些文件读取数据并复制到目标数据库。

运行 GoldenGate EXTRACT 实用程序

EXTRACT 实用程序可对源数据库的数据进行检索、转换并输出至跟踪文件。将队列事务详细信息 EXTRACT 至内存或临时磁盘存储区。当事务提交到源数据库时,EXTRACT 会将所有事务详细信息刷新到跟踪文件中。跟踪文件将这些详细信息路由到本地 GoldGate 或 EC2 实例枢纽,然后路由到目标数据库。

下列任务将启用并启动 EXTRACT 实用程序:

  1. 在 GoldenGate 枢纽 (本地或 EC2 实例) 上配置 EXTRACT 参数文件。下面的列表显示了一个示例 EXTRACT 参数文件。

    EXTRACT EABC SETENV (ORACLE_SID=ORCL) SETENV (NLSLANG=AL32UTF8)   USERID oggadm1@OGGSOURCE, PASSWORD XXXXXX EXTTRAIL /path/to/goldengate/dirdat/ab   IGNOREREPLICATES GETAPPLOPS TRANLOGOPTIONS EXCLUDEUSER OGGADM1   TABLE EXAMPLE.TABLE;
  2. 在 GoldenGate 枢纽上,启动 GoldenGate 命令行界面 (ggsci)。登录到源数据库。下面的示例说明了登录格式:

    dblogin userid <user>@<db tnsname>
  3. 添加数据库的检查点表:

    add checkpointtable
  4. 添加 transdata 为数据库表开启补充日志记录:

    add trandata <user>.<table>

    或者,您可以添加 transdata 为数据库中的所有表开启补充日志记录:

    add trandata <user>.*
  5. 使用 ggsci 命令行以及下列命令,启用 EXTRACT 实用程序:

    add extract <extract name> tranlog, INTEGRATED tranlog, begin now add exttrail <path-to-trail-from-the param-file> extract <extractname-from-paramfile>, MEGABYTES Xm
  6. 向数据库注册 EXTRACT 实用程序,以便不删除存档日志。这样,您就可以在必要时恢复未提交的旧事务。要向数据库注册 EXTRACT 实用程序,请使用下面的命令:

    register EXTRACT <extract process name>, DATABASE
  7. 要启动 EXTRACT 实用程序,请使用下面的命令:

    start <extract process name>

运行 GoldenGate REPLICAT 实用程序

REPLICAT 实用程序用于将跟踪文件中的事务信息“推送”至目标数据库。

下列任务将启用并启动 REPLICAT 实用程序:

  1. 在 GoldenGate 枢纽 (本地或 EC2 实例) 上配置 REPLICAT 参数文件。下面的列表显示了一个示例 REPLICAT 参数文件。

    REPLICAT RABC SETENV (ORACLE_SID=ORCL) SETENV (NLSLANG=AL32UTF8)   USERID oggadm1@OGGTARGET, password XXXXXX   ASSUMETARGETDEFS MAP EXAMPLE.TABLE, TARGET EXAMPLE.TABLE;
  2. 启动 GoldenGate 命令行界面 (ggsci)。登录到目标数据库。下面的示例说明了登录格式。

    dblogin userid <user>@<db tnsname>
  3. 使用 ggsci 命令行添加检查点表。所指示的用户应是 GoldenGate 用户账户,而不是目标表架构拥有者。下面的示例将创建一个名为 gg_checkpoint 的检查点表。

    add checkpointtable <user>.gg_checkpoint 
  4. 要启用 REPLICAT 实用程序,请使用下面的命令。

    add replicat <replicat name> EXTTRAIL <extract trail file> CHECKPOINTTABLE <user>.gg_checkpoint 
  5. 要启动 REPLICAT 实用程序,请使用下面的命令。

    start <replicat name>

排除将 GoldenGate 与 Amazon RDS 一起使用时出现的问题

本节说明 Oracle GoldenGate 与 Amazon RDS 结合使用时的最常见问题。

日志保留

要将 Oracle GoldGate 与 Amazon RDS 结合使用,请确保您已启用日志保留功能。

以小时为单位指定日志保留的持续时间。持续时间应超过源实例的任何可能的停机时间、任何可能的通信时间以及源实例的任何可能的联网问题时间。指定这样的持续时间后,可允许 Oracle GoldGate 根据需要从源实例恢复日志。

所需的绝对最小值是将日志保留一小时。如果未启用日志保留,或者保留值太小,则将收到以下消息。

2014-03-06 06:17:27 ERROR OGG-00446 error 2 (No such file or directory) opening redo log /rdsdbdata/db/GGTEST3_A/onlinelog/o1_mf_2_9k4bp1n6_.log for sequence 1306Not able to establish initial position for begin time 2014-03-06 06:16:55.

GoldenGate 似乎配置正确,但复制不起作用

对于预先存在的表,需要告知 GoldenGate 该表应通过哪一个 SCN 运行。请执行以下步骤来修复该问题:

  1. 启动 GoldenGate 命令行界面 (ggsci)。登录到源数据库。下面的示例说明了登录格式。

    dblogin userid <user>@<db tnsname>
  2. 使用 ggsci 命令行为 EXTRACT 过程设置起始 SCN。以下示例为提取过程将 SCN 设置为 223274。

    ALTER EXTRACT <extract process name> SCN 223274 start <extract process name>
  3. 登录到目标数据库。下面的示例说明了登录格式。

    dblogin userid <user>@<db tnsname>
  4. 使用 ggsci 命令行为 REPLICAT 过程设置起始 SCN。以下示例为 REPLICAT 将 SCN 设置为 223274。

    start <replicat process name> atcsn 223274

由于系统上的查询,集成 REPLICAT 速度缓慢。"_DBA_APPLY_CDR_INFO"

Oracle GoldenGate 冲突检测和解决 (CDR) 提供了基本的冲突解决例程。例如,CDR 可以解决 INSERT 语句的唯一冲突。

在 CDR 解决冲突时,它可以临时将记录插入异常表 _DBA_APPLY_CDR_INFO 中。集成的 REPLICAT 稍后会删除这些记录。在极少数情况下,集成的 REPLICAT 可以处理大量冲突,但是新的集成 REPLICAT 并不能取代它。_DBA_APPLY_CDR_INFO 中的现有行不会被删除而是被孤立。任何新的集成 REPLICAT 进程都会减慢,因为它们正在查询 _DBA_APPLY_CDR_INFO 中的孤立行。

要从 _DBA_APPLY_CDR_INFO 中删除所有行,请使用 Amazon RDS 过程 rdsadmin_util.truncate_apply$_cdr_info。此过程是作为 2020 年 10 月版本和补丁程序更新的一部分发布的。以下数据库版本中提供该过程:

以下示例展示了将表 _DBA_APPLY_CDR_INFO 截断。

SET SERVEROUTPUT ON SIZE 2000 EXEC rdsadmin.rdsadmin_util.truncate_apply$_cdr_info;