

# 将 Oracle GoldenGate 与 Amazon RDS for Oracle 结合使用
<a name="Appendix.OracleGoldenGate"></a>

Oracle GoldenGate 可收集、复制和管理数据库之间的事务数据。它是一个基于日志的更改数据捕获（CDC）和复制软件包，与数据库结合使用，适用于联机事务处理（OLTP）系统。Oracle GoldenGate 从源数据库创建包含最近更改的数据的跟踪记录文件。然后，它将这些文件推送到服务器，在此处，一个进程将跟踪记录文件转换为标准 SQL 以应用于目标数据库。

Oracle GoldenGate 与 RDS for Oracle 结合使用可支持以下功能：
+ 主动/主动数据库复制
+ 灾难恢复
+ 数据保护
+ 区域内和跨区域复制
+ 零停机时间迁移和升级
+ 在 RDS for Oracle 数据库实例与非 Oracle 数据库之间复制数据
**注意**  
有关支持的数据库的列表，请参阅 Oracle 文档中的 [Oracle Fusion Middleware 支持的系统配置](https://www.oracle.com/middleware/technologies/fusion-certification.html)。

您可以将 Oracle GoldenGate 与 RDS for Oracle 结合使用以升级到 Oracle Database 的主要版本。例如，可以使用 Oracle GoldenGate，从 Oracle Database 11g 本地数据库升级到 Amazon RDS 数据库实例上的 Oracle Database 19c。

**Topics**
+ [

## Oracle GoldenGate 支持的版本和许可选项
](#Appendix.OracleGoldenGate.licensing)
+ [

## Oracle GoldenGate 的要求和限制
](#Appendix.OracleGoldenGate.requirements)
+ [

# Oracle GoldenGate 架构
](Appendix.OracleGoldenGate.Overview.md)
+ [

# 设置 Oracle GoldenGate
](Appendix.OracleGoldenGate.setting-up.md)
+ [

# 使用 Oracle GoldenGate 的 EXTRACT 和 REPLICAT 实用程序
](Appendix.OracleGoldenGate.ExtractReplicat.md)
+ [

# 监控 Oracle GoldenGate
](Appendix.OracleGoldenGate.Monitoring.md)
+ [

# Oracle GoldenGate 问题排查
](Appendix.OracleGoldenGate.Troubleshooting.md)

## Oracle GoldenGate 支持的版本和许可选项
<a name="Appendix.OracleGoldenGate.licensing"></a>

可以将 RDS for Oracle 的标准版 2（SE2）或企业版（EE）与 Oracle GoldenGate 版本 12c 和更高版本结合使用。您可以使用以下 Oracle GoldenGate 功能：
+ 支持 Oracle GoldenGate 远程捕获（提取）。
+ 使用传统非 CDB 数据库架构的 RDS for Oracle 数据库实例支持捕获（提取）。运行 Oracle Database 21c 或 Oracle Database 19c 版本 19.0.0.0.ru-2024-04.rur-2024-04.r1 或更高版本的 CDB 支持 Oracle GoldenGate 远程 PDB 捕获。
+ 使用非 CDB 或 CDB 架构的 RDS for Oracle 数据库实例支持 Oracle GoldenGate 远程交付（复制）。远程交付支持集成复制、并行复制、协调复制和经典复制。
+ RDS for Oracle 支持 Oracle GoldenGate 的经典和微服务架构。
+ 在使用集成捕获模式时，支持 Oracle GoldenGate DDL 和序列值复制。

您负责管理 Oracle GoldenGate 许可（自带许可）以用于所有 AWS 区域中的 Amazon RDS。有关更多信息，请参阅 [RDS for Oracle 许可选项](Oracle.Concepts.Licensing.md)。

## Oracle GoldenGate 的要求和限制
<a name="Appendix.OracleGoldenGate.requirements"></a>

在使用 Oracle GoldenGate 和 RDS for Oracle 时，请考虑以下要求和限制：
+ 您负责设置和管理 Oracle GoldenGate 以用于 RDS for Oracle。
+ 您负责设置经过源数据库和目标数据库认证的 Oracle GoldenGate 版本。有关更多信息，请参阅 Oracle 文档中的 [Oracle Fusion Middleware 支持的系统配置](https://www.oracle.com/middleware/technologies/fusion-certification.html)。
+ 您可以在许多不同的 AWS 环境中将 Oracle GoldenGate 用于许多不同的使用案例。如果您遇到与 Oracle GoldenGate 相关的支持相关问题，请联系 Oracle 支持服务。
+ 您可以在使用 Oracle 透明数据加密（TDE）的 RDS for Oracle 数据库实例上使用 Oracle GoldenGate。要保持复制数据的完整性，请使用 Amazon EBS 加密卷或跟踪记录文件加密在 Oracle GoldenGate 枢纽上配置加密。同时，为 Oracle GoldenGate 枢纽与源和目标数据库实例之间发送的数据配置加密。RDS for Oracle 数据库实例支持使用 [Oracle 安全套接字层](Appendix.Oracle.Options.SSL.md) 或 [Oracle 本机网络加密](Appendix.Oracle.Options.NetworkEncryption.md) 加密。

# Oracle GoldenGate 架构
<a name="Appendix.OracleGoldenGate.Overview"></a>

与 Amazon RDS 结合使用的 Oracle GoldenGate 架构包含以下解耦模块：

源数据库  
源数据库可以是本地 Oracle 数据库、Amazon EC2 实例上的 Oracle 数据库或 Amazon RDS 数据库实例上的 Oracle 数据库。

Oracle GoldenGate 枢纽  
Oracle GoldenGate 枢纽将事务信息从源数据库移动到目标数据库。枢纽可以是以下任意一种：  
+ 安装了 Oracle Database 和 Oracle GoldenGate 的 Amazon EC2 实例
+ 本地 Oracle 安装
可以有多个 Amazon EC2 枢纽。如果要将 Oracle GoldenGate 用于跨区域复制，建议您使用两个枢纽。

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

以下各节介绍 Amazon RDS 上 Oracle GoldenGate 的常见场景。

**Topics**
+ [

## 本地源数据库和 Oracle GoldenGate 枢纽
](#Appendix.OracleGoldenGate.on-prem-source-gg-hub)
+ [

## 本地源数据库和 Amazon EC2 枢纽
](#Appendix.OracleGoldenGate.on-prem-source-ec2-hub)
+ [

## Amazon RDS 源数据库和 Amazon EC2 枢纽
](#Appendix.OracleGoldenGate.rds-source-ec2-hub)
+ [

## Amazon EC2 源数据库和 Amazon EC2 枢纽
](#Appendix.OracleGoldenGate.ec2-source-ec2-hub)
+ [

## 不同 AWS 区域中的 Amazon EC2 枢纽
](#Appendix.OracleGoldenGate.cross-region-hubs)

## 本地源数据库和 Oracle GoldenGate 枢纽
<a name="Appendix.OracleGoldenGate.on-prem-source-gg-hub"></a>

在此场景中，本地 Oracle 源数据库和本地 GoldenGate 枢纽向目标 Amazon RDS 数据库实例提供数据。

![\[使用 Amazon RDS 的 Oracle GoldenGate 配置 0\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/oracle-gg0.png)


## 本地源数据库和 Amazon EC2 枢纽
<a name="Appendix.OracleGoldenGate.on-prem-source-ec2-hub"></a>

在此场景中，本地 Oracle 数据库充当源数据库。其会连接到 Amazon EC2 实例枢纽。此枢纽向目标 RDS for Oracle 数据库实例提供数据。

![\[使用 Amazon RDS 的 Oracle GoldenGate 配置 1\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/oracle-gg1.png)


## Amazon RDS 源数据库和 Amazon EC2 枢纽
<a name="Appendix.OracleGoldenGate.rds-source-ec2-hub"></a>

在此场景中，RDS for Oracle 数据库实例充当源数据库。其会连接到 Amazon EC2 实例枢纽。此枢纽向目标 RDS for Oracle 数据库实例提供数据。

![\[使用 Amazon RDS 的 Oracle GoldenGate 配置 2\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/oracle-gg2.png)


## Amazon EC2 源数据库和 Amazon EC2 枢纽
<a name="Appendix.OracleGoldenGate.ec2-source-ec2-hub"></a>

在此场景中，Amazon EC2 实例上的 Oracle 数据库充当源数据库。其会连接到 Amazon EC2 实例枢纽。此枢纽向目标 RDS for Oracle 数据库实例提供数据。

![\[使用 Amazon RDS 的 Oracle GoldenGate 配置 3\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/oracle-gg3.png)


## 不同 AWS 区域中的 Amazon EC2 枢纽
<a name="Appendix.OracleGoldenGate.cross-region-hubs"></a>

在此场景中，Amazon RDS 数据库实例上的 Oracle 数据库连接到相同 AWS 区域中的 Amazon EC2 实例枢纽。该枢纽连接到其他 AWS 区域中的 Amazon EC2 实例枢纽。第二个枢纽向与第二个 Amazon EC2 实例枢纽位于相同 AWS 区域中的目标 RDS for Oracle 数据库实例提供数据。

![\[使用 Amazon RDS 的 Oracle GoldenGate 配置 4\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/oracle-gg4.png)


**注意**  
影响在本地环境中运行 Oracle GoldenGate 的任何问题也会影响在 AWS 上运行 Oracle GoldenGate。强烈建议对 Oracle GoldenGate 枢纽进行监控，确保在发生故障转移的情况下恢复 `EXTRACT` 和 `REPLICAT`。由于 Oracle GoldenGate 枢纽在 Amazon EC2 实例上运行，因此 Amazon RDS 不会管理 Oracle GoldenGate 枢纽，也无法确保其是否在运行。

# 设置 Oracle GoldenGate
<a name="Appendix.OracleGoldenGate.setting-up"></a>

要使用 Amazon RDS 设置 Oracle GoldenGate，请在 Amazon EC2 实例上配置枢纽，然后配置源数据库和目标数据库。以下各节举例说明了如何设置 Oracle GoldenGate 以便与 Amazon RDS for Oracle 结合使用。

**Topics**
+ [

## 在 Amazon EC2 上设置 Oracle GoldenGate 枢纽
](#Appendix.OracleGoldenGate.Hub)
+ [

## 设置源数据库以便与 Amazon RDS 上的 Oracle GoldenGate 结合使用
](#Appendix.OracleGoldenGate.Source)
+ [

## 设置目标数据库以便与 Amazon RDS 上的 Oracle GoldenGate 结合使用
](#Appendix.OracleGoldenGate.Target)

## 在 Amazon EC2 上设置 Oracle GoldenGate 枢纽
<a name="Appendix.OracleGoldenGate.Hub"></a>

要在 Amazon EC2 实例上创建 Oracle GoldenGate 枢纽，首先应使用 Oracle RDBMS 的完整客户端安装创建 Amazon EC2 实例。Amazon EC2 实例也必须已安装 Oracle GoldenGate 软件。Oracle GoldenGate 软件版本取决于源和目标数据库版本。有关安装 Oracle GoldenGate 的更多信息，请参阅 [Oracle GoldenGate 文档](https://docs.oracle.com/en/middleware/goldengate/core/index.html)。

用作 Oracle GoldenGate 枢纽的 Amazon EC2 实例会处理来自源数据库的事务信息并将这些信息存储到跟踪记录文件中。要支持此过程，请确保满足以下要求：
+ 您为跟踪记录文件分配了足够的存储空间。
+ Amazon EC2 实例有足够的处理能力来管理数据量。
+ EC2 实例在写入跟踪文件之前，有足够的内存来存储事务信息。

**在 Amazon EC2 实例上建立 Oracle GoldenGate 经典架构枢纽**

1. 在 Oracle GoldenGate 目录中创建子目录。

   在 Amazon EC2 命令行 shell 中，启动 `ggsci`（Oracle GoldenGate 命令解释器）。`CREATE SUBDIRS` 命令在 `/gg` 目录下为参数、报告和检查点文件创建子目录。

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

1. 配置 `mgr.prm` 文件。

   以下示例向 `$GGHOME/dirprm/mgr.prm` 文件中添加行。

   ```
   PORT 8199
   PurgeOldExtracts ./dirdat/*, UseCheckpoints, MINKEEPDAYS 5
   ```

1. 启动管理器。

   以下示例启动 `ggsci` 并运行 `start mgr` 命令。

   ```
   GGSCI> start mgr
   ```

Oracle GoldenGate 枢纽现已就绪，可供使用。

## 设置源数据库以便与 Amazon RDS 上的 Oracle GoldenGate 结合使用
<a name="Appendix.OracleGoldenGate.Source"></a>

完成以下任务，设置源数据库以便与 Oracle GoldenGate 结合使用：

**Topics**
+ [

### 步骤 1：在源数据库上开启补充日志记录
](#Appendix.OracleGoldenGate.Source.Logging)
+ [

### 步骤 2：将 ENABLE\$1GOLDENGATE\$1REPLICATION 初始化参数设置为 true
](#Appendix.OracleGoldenGate.Source.enable-gg-rep)
+ [

### 步骤 3：在源数据库上设置日志保留期
](#Appendix.OracleGoldenGate.Source.Retention)
+ [

### 步骤 4：在源数据库上创建 Oracle GoldenGate 用户账户。
](#Appendix.OracleGoldenGate.Source.Account)
+ [

### 步骤 5：向用户账户授予对源数据库的权限
](#Appendix.OracleGoldenGate.Source.Privileges)
+ [

### 步骤 6：为源数据库添加 TNS 别名
](#Appendix.OracleGoldenGate.Source.TNS)

### 步骤 1：在源数据库上开启补充日志记录
<a name="Appendix.OracleGoldenGate.Source.Logging"></a>

要启用最低数据库级别的补充日志记录，请运行以下 PL/SQL 过程：

```
EXEC rdsadmin.rdsadmin_util.alter_supplemental_logging(p_action => 'ADD')
```

### 步骤 2：将 ENABLE\$1GOLDENGATE\$1REPLICATION 初始化参数设置为 true
<a name="Appendix.OracleGoldenGate.Source.enable-gg-rep"></a>

将 `ENABLE_GOLDENGATE_REPLICATION` 初始化参数设置为 `true` 时，它允许数据库服务支持逻辑复制。如果源数据库位于 Amazon RDS 数据库实例上，请确保为数据库实例分配一个参数组，且将 `ENABLE_GOLDENGATE_REPLICATION` 初始化参数设置为 `true`。有关 `ENABLE_GOLDENGATE_REPLICATION` 初始化参数的更多信息，请参阅 [Oracle Database 文档](https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/ENABLE_GOLDENGATE_REPLICATION.html)。

### 步骤 3：在源数据库上设置日志保留期
<a name="Appendix.OracleGoldenGate.Source.Retention"></a>

确保将源数据库配置为保留存档重做日志。请考虑以下准则：
+ 以小时为单位指定日志保留的持续时间。最小值为一小时。
+ 设置持续时间以超过源数据库实例的任何可能的停机时间、任何可能的通信时间以及源实例的任何可能的联网问题期间。指定这样的持续时间后，可允许 Oracle GoldenGate 根据需要从源实例恢复日志。
+ 确保您的实例上有足够的文件存储空间。

例如，将存档重做日志的保留期设置为 24 小时。

```
EXEC rdsadmin.rdsadmin_util.set_configuration('archivelog retention hours',24)
```

如果未启用日志保留，或者保留值太小，则将收到类似以下内容的错误消息。

```
2022-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 1306 
Not able to establish initial position for begin time 2022-03-06 06:16:55.
```

由于您的数据库实例会保留存档的重做日志，因此请确保您有足够的空间存放这些文件。要查看过去 *num\$1hours* 小时内使用了多少空间，请使用以下查询，并将 *num\$1hours* 替换为小时数。

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

### 步骤 4：在源数据库上创建 Oracle GoldenGate 用户账户。
<a name="Appendix.OracleGoldenGate.Source.Account"></a>

Oracle GoldenGate 作为数据库用户运行，并且需要相应数据库权限才能访问源数据库的重做和存档的重做日志。要提供这些权限，请在源数据库上创建用户账户。有关 Oracle GoldenGate 用户账户权限的更多信息，请参阅 [Oracle 文档](https://docs.oracle.com/en/middleware/goldengate/core/19.1/oracle-db/establishing-oracle-goldengate-credentials.html#GUID-79122058-27B0-4FB6-B3DC-B7D1B67EB053)。

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

```
CREATE TABLESPACE administrator;
CREATE USER oggadm1  IDENTIFIED BY "password"
   DEFAULT TABLESPACE ADMINISTRATOR TEMPORARY TABLESPACE TEMP;
ALTER USER oggadm1 QUOTA UNLIMITED ON administrator;
```

**注意**  
作为安全最佳实践，请指定除此处所示提示以外的密码。

### 步骤 5：向用户账户授予对源数据库的权限
<a name="Appendix.OracleGoldenGate.Source.Privileges"></a>

在此任务中，您将为源数据库上的数据库用户授予必要的账户权限。

**向账户授予对源数据库的权限**

1. 使用 SQL 命令 `grant` 和 `rdsadmin.rdsadmin_util` 过程 `grant_sys_object` 向 Oracle 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;
   ```

1. 授予用户账户作为 Oracle GoldenGate 管理员所需的权限。运行以下 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` 过程。

### 步骤 6：为源数据库添加 TNS 别名
<a name="Appendix.OracleGoldenGate.Source.TNS"></a>

将以下条目添加到 Oracle 主目录中的 `$ORACLE_HOME/network/admin/tnsnames.ora`，以供 `EXTRACT` 进程使用。有关 `tnsnames.ora` 文件的更多信息，请参阅 [Oracle 文档](https://docs.oracle.com/en/database/oracle/oracle-database/19/netrf/local-naming-parameters-in-tns-ora-file.html#GUID-7F967CE5-5498-427C-9390-4A5C6767ADAA)。

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

## 设置目标数据库以便与 Amazon RDS 上的 Oracle GoldenGate 结合使用
<a name="Appendix.OracleGoldenGate.Target"></a>

在本任务中，您将设置一个目标数据库实例以与 Oracle GoldenGate 结合使用。

**Topics**
+ [

### 步骤 1：将 ENABLE\$1GOLDENGATE\$1REPLICATION 初始化参数设置为 true
](#Appendix.OracleGoldenGate.Target.enable-gg-rep)
+ [

### 步骤 2：在目标数据库上创建 Oracle GoldenGate 用户账户
](#Appendix.OracleGoldenGate.Target.User)
+ [

### 步骤 3：授予账户对目标数据库的权限
](#Appendix.OracleGoldenGate.Target.Privileges)
+ [

### 步骤 4：为目标数据库添加 TNS 别名
](#Appendix.OracleGoldenGate.Target.TNS)

### 步骤 1：将 ENABLE\$1GOLDENGATE\$1REPLICATION 初始化参数设置为 true
<a name="Appendix.OracleGoldenGate.Target.enable-gg-rep"></a>

将 `ENABLE_GOLDENGATE_REPLICATION` 初始化参数设置为 `true` 时，它允许数据库服务支持逻辑复制。如果源数据库位于 Amazon RDS 数据库实例上，请确保为数据库实例分配一个参数组，且将 `ENABLE_GOLDENGATE_REPLICATION` 初始化参数设置为 `true`。有关 `ENABLE_GOLDENGATE_REPLICATION` 初始化参数的更多信息，请参阅 [Oracle Database 文档](https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/ENABLE_GOLDENGATE_REPLICATION.html)。

### 步骤 2：在目标数据库上创建 Oracle GoldenGate 用户账户
<a name="Appendix.OracleGoldenGate.Target.User"></a>

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

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

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

**注意**  
作为安全最佳实践，请指定除此处所示提示以外的密码。

### 步骤 3：授予账户对目标数据库的权限
<a name="Appendix.OracleGoldenGate.Target.Privileges"></a>

在此任务中，您将为目标数据库上的数据库用户授予必要的账户权限。

**授予账户对目标数据库的权限**

1. 向目标数据库上的 Oracle 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;
   ```

1. 授予用户账户作为 Oracle GoldenGate 管理员所需的权限。运行以下 PL/SQL 程序。

   ```
   EXEC rdsadmin.rdsadmin_dbms_goldengate_auth.grant_admin_privilege (
       grantee                 => 'OGGADM1',
       privilege_type          => 'apply',
       grant_select_privileges => true, 
       do_grants               => TRUE);
   ```

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

### 步骤 4：为目标数据库添加 TNS 别名
<a name="Appendix.OracleGoldenGate.Target.TNS"></a>

将以下条目添加到 Oracle 主目录中的 `$ORACLE_HOME/network/admin/tnsnames.ora`，以供 `REPLICAT` 进程使用。对于 Oracle 多租户数据库，请确保 TNS 别名指向 PDB 的服务名称。有关 `tnsnames.ora` 文件的更多信息，请参阅 [Oracle 文档](https://docs.oracle.com/en/database/oracle/oracle-database/19/netrf/local-naming-parameters-in-tns-ora-file.html#GUID-7F967CE5-5498-427C-9390-4A5C6767ADAA)。

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

# 使用 Oracle GoldenGate 的 EXTRACT 和 REPLICAT 实用程序
<a name="Appendix.OracleGoldenGate.ExtractReplicat"></a>

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

## 运行 Oracle GoldenGate EXTRACT 实用程序
<a name="Appendix.OracleGoldenGate.Extract"></a>

`EXTRACT` 实用程序可对源数据库中的数据进行检索、转换并输出至跟踪文件。基本过程如下所示：

1. `EXTRACT` 将事务详细信息排队到内存或临时磁盘存储中。

1. 源数据库提交事务。

1. `EXTRACT` 将事务详细信息写入跟踪文件。

1. 跟踪记录文件将这些详细信息路由到 Oracle GoldenGate 本地或 Amazon EC2 实例枢纽，然后路由到目标数据库。

以下步骤启动 `EXTRACT` 实用程序，从源数据库 `OGGSOURCE` 的 `EXAMPLE.TABLE` 中捕获数据，然后创建跟踪记录文件。

**运行 EXTRACT 实用程序**

1. 在 Oracle GoldenGate 枢纽（本地或 Amazon EC2 实例）上配置 `EXTRACT` 参数文件。下面的列表显示了一个名为 `$GGHOME/dirprm/eabc.prm` 的示例 `EXTRACT` 参数文件。

   ```
   EXTRACT EABC
    
   USERID oggadm1@OGGSOURCE, PASSWORD "my-password"
   EXTTRAIL /path/to/goldengate/dirdat/ab 
    
   IGNOREREPLICATES
   GETAPPLOPS
   TRANLOGOPTIONS EXCLUDEUSER OGGADM1
   	 
   TABLE EXAMPLE.TABLE;
   ```

1. 在 Oracle GoldenGate 枢纽上，登录到源数据库，并启动 Oracle GoldenGate 命令行界面 `ggsci`。下面的示例说明了登录格式。

   ```
   dblogin oggadm1@OGGSOURCE
   ```

1. 添加事务数据以便为数据库表开启补充日志记录。

   ```
   add trandata EXAMPLE.TABLE
   ```

1. 使用 `ggsci` 命令行以及下列命令，启用 `EXTRACT` 实用程序。

   ```
   add extract EABC tranlog, INTEGRATED tranlog, begin now
   add exttrail /path/to/goldengate/dirdat/ab 
      extract EABC, 
      MEGABYTES 100
   ```

1. 向数据库注册 `EXTRACT` 实用程序，以便不删除存档日志。此任务可让您在必要时恢复未提交的旧事务。要向数据库注册 `EXTRACT` 实用程序，请使用下面的命令。

   ```
   register EXTRACT EABC, DATABASE
   ```

1. 使用下面的命令启动 `EXTRACT` 实用程序。

   ```
   start EABC
   ```

## 运行 Oracle GoldenGate REPLICAT 实用程序
<a name="Appendix.OracleGoldenGate.Replicat"></a>

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

以下步骤启用并启动 `REPLICAT` 实用程序，以便它可以将捕获的数据复制到目标数据库 `OGGTARGET` 的表 `EXAMPLE.TABLE` 中。

**运行 REPLICATE 实用程序**

1. 在 Oracle GoldenGate 枢纽（本地或 EC2 实例）上配置 `REPLICAT` 参数文件。下面的列表显示了一个名为 `$GGHOME/dirprm/rabc.prm` 的示例 `REPLICAT` 参数文件。

   ```
   REPLICAT RABC
    
   USERID oggadm1@OGGTARGET, password "my-password"
    
   ASSUMETARGETDEFS
   MAP EXAMPLE.TABLE, TARGET EXAMPLE.TABLE;
   ```
**注意**  
作为安全最佳实践，请指定除此处所示提示以外的密码。

1. 登录目标数据库并启动 Oracle GoldenGate 命令行界面（`ggsci`）。下面的示例说明了登录格式。

   ```
   dblogin userid oggadm1@OGGTARGET
   ```

1. 使用 `ggsci` 命令行，添加检查点表。所指示的用户应是 Oracle GoldenGate 用户账户，而不是目标表架构拥有者。下面的示例创建一个名为 `gg_checkpoint` 的检查点表。

   ```
   add checkpointtable oggadm1.oggchkpt
   ```

1. 要启用 `REPLICAT` 实用程序，请使用下面的命令。

   ```
   add replicat RABC EXTTRAIL /path/to/goldengate/dirdat/ab CHECKPOINTTABLE oggadm1.oggchkpt 
   ```

1. 使用下面的命令启动 `REPLICAT` 实用程序。

   ```
   start RABC
   ```

# 监控 Oracle GoldenGate
<a name="Appendix.OracleGoldenGate.Monitoring"></a>

使用 Oracle GoldenGate 进行复制时，请确保 Oracle GoldenGate 进程已启动并正在运行，且源数据库和目标数据库已同步。您可以使用以下监控工具：
+ [Amazon CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html) 是一种监控服务，在这种模式下用于监控 GoldenGate 错误日志。
+ [Amazon SNS](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/US_SetupSNS.html) 是一种消息通知服务，在此模式中用于发送电子邮件通知。

有关详细说明，请参阅[使用 Amazon CloudWatch 监控 Oracle GoldenGate 日志](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/monitor-oracle-goldengate-logs-by-using-amazon-cloudwatch.html)。

# Oracle GoldenGate 问题排查
<a name="Appendix.OracleGoldenGate.Troubleshooting"></a>

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

**Topics**
+ [

## 打开联机重做日志时出错
](#Appendix.OracleGoldenGate.Troubleshooting.Logs)
+ [

## Oracle GoldenGate 似乎配置正确，但复制不起作用
](#Appendix.OracleGoldenGate.Troubleshooting.Replication)
+ [

## 由于 SYS 上的查询，集成 REPLICAT 速度缓慢。"\$1DBA\$1APPLY\$1CDR\$1INFO"
](#Appendix.OracleGoldenGate.IR)

## 打开联机重做日志时出错
<a name="Appendix.OracleGoldenGate.Troubleshooting.Logs"></a>

确保将数据库配置为保留存档的重做日志。请考虑以下准则：
+ 以小时为单位指定日志保留的持续时间。最小值为一小时。
+ 设置持续时间以超过源数据库实例的任何可能的停机时间、任何可能的通信时间以及源数据库实例的任何可能的联网问题期间。指定这样的持续时间后，可允许 Oracle GoldenGate 根据需要从源数据库实例恢复日志。
+ 确保您的实例上有足够的文件存储空间。

如果未启用日志保留，或者保留值太小，则将收到类似以下内容的错误消息。

```
2022-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 1306 
Not able to establish initial position for begin time 2022-03-06 06:16:55.
```

## Oracle GoldenGate 似乎配置正确，但复制不起作用
<a name="Appendix.OracleGoldenGate.Troubleshooting.Replication"></a>

对于预先存在的表，您必须指定 Oracle GoldenGate 从中运行的 SCN。

**修复此问题**

1. 登录源数据库并启动 Oracle GoldenGate 命令行界面（`ggsci`）。下面的示例说明了登录格式。

   ```
   dblogin userid oggadm1@OGGSOURCE
   ```

1. 使用 `ggsci` 命令行为 `EXTRACT` 进程设置起始 SCN。以下示例为 `EXTRACT` 将 SCN 设置为 223274。

   ```
   ALTER EXTRACT EABC SCN 223274
   start EABC
   ```

1. 登录到目标数据库。下面的示例说明了登录格式。

   ```
   dblogin userid oggadm1@OGGTARGET
   ```

1. 使用 `ggsci` 命令行为 `REPLICAT` 进程设置起始 SCN。以下示例为 `REPLICAT` 将 SCN 设置为 223274。

   ```
   start RABC atcsn 223274
   ```

## 由于 SYS 上的查询，集成 REPLICAT 速度缓慢。"\$1DBA\$1APPLY\$1CDR\$1INFO"
<a name="Appendix.OracleGoldenGate.IR"></a>

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.rdsadmin_util.truncate_apply$_cdr_info`。此过程是作为 2020 年 10 月版本和补丁程序更新的一部分发布的。以下数据库版本中提供该过程：
+ [版本 21.0.0.0.ru-2022-01.rur-2022-01.r1](https://docs.aws.amazon.com/AmazonRDS/latest/OracleReleaseNotes/oracle-version-21-0.html#oracle-version-RU-RUR.21.0.0.0.ru-2022-01.rur-2022-01.r1) 及更高版本
+ [版本 19.0.0.0.ru-2020-10.rur-2020-10.r1](https://docs.aws.amazon.com/AmazonRDS/latest/OracleReleaseNotes/oracle-version-19-0.html#oracle-version-RU-RUR.19.0.0.0.ru-2020-10.rur-2020-10.r1) 及更高版本

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

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