

# 设置 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))
    )
```