

# 使用适用于 RDS Custom for Oracle 的 Oracle 副本
<a name="custom-rr"></a>

您可以为运行 Oracle Enterprise Edition 的 RDS Custom for Oracle 数据库实例创建 Oracle 副本。支持容器数据库（CDB）和非 CDB。Standard Edition 2 不支持 Oracle Data Guard。

创建 RDS Custom for Oracle 副本类似于创建 RDS for Oracle 副本，但有重大区别。有关创建和管理 Oracle 副本的一般信息，请参阅[使用数据库实例只读副本](USER_ReadRepl.md)和[使用 Amazon RDS for Oracle 的只读副本](oracle-read-replicas.md)。

**Topics**
+ [RDS Custom for Oracle 复制概述](#custom-rr.overview)
+ [RDS Custom for Oracle 复制的指南和限制](custom-rr.reqs-limitations.md)
+ [将 RDS Custom for Oracle 副本提升为独立的数据库实例](custom-rr.promoting.md)
+ [在 RDS Custom for Oracle 主实例和副本实例之间配置 VPN 隧道](cfo-standby-vpn-tunnel.md)

## RDS Custom for Oracle 复制概述
<a name="custom-rr.overview"></a>

RDS Custom for Oracle 复制的架构类似于 RDS for Oracle 复制。主数据库实例异步复制到一个或多个 Oracle 副本。

![\[RDS Custom for Oracle 支持 Oracle 副本\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/read-replica-custom-oracle.png)


### 最大副本数
<a name="custom-rr.overview.number"></a>

与 RDS for Oracle 一样，您最多可以创建 RDS Custom for Oracle 主数据库实例的五个托管式 Oracle 副本。您还可以创建自己的手动配置的（外部）Oracle 副本。外部副本不计入您的数据库实例限制。它们还位于 RDS Custom 支持外围之外。有关支持外围的更多信息，请参阅 [RDS Custom 支持外围](custom-concept.md#custom-troubleshooting.support-perimeter)。

### 副本命名约定
<a name="custom-rr.overview.names"></a>

Oracle 副本名称基于数据库的唯一名称。格式为 `DB_UNIQUE_NAME_X`，并按顺序附加字母。例如，如果您的数据库唯一名称为 `ORCL`，则前两个副本命名为 `ORCL_A` 和 `ORCL_B`。前六个字母 A–F 是为 RDS Custom 保留的。RDS Custom 将数据库参数从主数据库实例复制到副本。有关更多信息，请参阅 Oracle 文档中的 [DB\$1UNIQUE\$1NAME](https://docs.oracle.com/database/121/REFRN/GUID-3547C937-5DDA-49FF-A9F9-14FF306545D8.htm#REFRN10242)。

### 副本备份保留期
<a name="custom-rr.overview.backups"></a>

原定设置情况下，RDS Custom Oracle 副本使用与主数据库实例相同的备份保留期。您可以将备份保留期修改为 1–35 天。RDS Custom 支持备份、还原和时间点故障恢复（PITR）。有关备份和还原 RDS Custom 数据库实例的更多信息，请参阅[备份和还原 Amazon RDS Custom for Oracle 数据库实例](custom-backup.md)。

**注意**  
当创建 Oracle 副本时，RDS Custom 会暂时暂停清理重做日志文件。通过这种方式，RDS Custom 可确保在新的 Oracle 副本变为可用后将这些日志应用于该副本。

### 副本提升
<a name="custom-rr.overview.promotion"></a>

您可以使用控制台、`promote-read-replica` AWS CLI 命令或 `PromoteReadReplica` API 在 RDS Custom for Oracle 中提升托管式 Oracle 副本。如果您删除了主数据库实例，并且所有副本都运行正常，则 RDS Custom for Oracle 会自动将您的托管式副本提升为独立实例。如果副本已暂停自动化或超出支持外围，则必须先修复副本，RDS Custom 才能自动对其进行提升。您只能手动提升外部 Oracle 副本。

# RDS Custom for Oracle 复制的指南和限制
<a name="custom-rr.reqs-limitations"></a>

创建 RDS Custom for Oracle 副本时，并非所有 RDS Oracle 副本选项都受支持。

**Topics**
+ [RDS Custom for Oracle 复制的一般指南](#custom-rr.guidelines)
+ [RDS Custom for Oracle 复制的一般限制](#custom-rr.limitations)
+ [RDS Custom for Oracle 复制的网络要求和限制](#custom-rr.network)
+ [RDS Custom for Oracle 的外部副本限制](#custom-rr.external-replica-reqs)

## RDS Custom for Oracle 复制的一般指南
<a name="custom-rr.guidelines"></a>

使用 RDS Custom for Oracle 时，请遵循以下指南：
+ 您只能在 Oracle Enterprise Edition 中使用 RDS Custom for Oracle 复制。不支持 Standard Edition 2。
+ 强烈建议您实施 VPN 隧道来加密主实例和备用实例之间的通信。有关更多信息，请参阅 [在 RDS Custom for Oracle 主实例和副本实例之间配置 VPN 隧道](cfo-standby-vpn-tunnel.md)。
+ 不要修改 `RDS_DATAGUARD` 用户。此用户保留用于 RDS Custom for Oracle 自动化。修改此用户可能会导致不希望的结果，例如无法为 RDS Custom for Oracle 数据库实例创建 Oracle 副本。
+ 不要更改复制用户密码。管理 RDS Custom 主机上的 Oracle Data Guard 配置需要使用此密码。如果您更改密码，RDS Custom for Oracle 可能会将您的 Oracle 副本置于支持外围之外。有关更多信息，请参阅 [RDS Custom 支持外围](custom-concept.md#custom-troubleshooting.support-perimeter)。

  此密码存储在 AWS Secrets Manager 中，用数据库资源 ID 进行标记。每个 Oracle 副本在 Secret Manager 中都有自己的密钥。密钥使用以下任一命名格式。

  ```
  do-not-delete-rds-custom-db-DB_resource_id-uuid-dg
  rds-custom!oracle-do-not-delete-DB_resource_id-uuid-dg
  ```
+ 不要更改主数据库实例的 `DB_UNIQUE_NAME`。更改名称会导致任何还原操作卡住。
+ 不要在 RDS Custom CDB 的 `CREATE PLUGGABLE DATABASE` 命令中指定子句 `STANDBYS=NONE`。这样，如果发生失效转移，您的备用 CDB 将包含所有 PDB。

## RDS Custom for Oracle 复制的一般限制
<a name="custom-rr.limitations"></a>

RDS Custom for Oracle 副本具有以下限制：
+ 无法在只读模式下创建 RDS Custom for Oracle 副本。但是，您可以将已挂载副本的模式手动更改为只读，以及从只读更改为已挂载。有关更多信息，请参阅 [create-db-instance-read-replica](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance-read-replica.html) AWS CLI 命令的文档。
+ 您无法创建跨区域 RDS Custom for Oracle 副本。
+ 您无法更改 Oracle Data Guard `CommunicationTimeout` 参数的值。对于 RDS Custom for Oracle 数据库实例，此参数设置为 15 秒。

## RDS Custom for Oracle 复制的网络要求和限制
<a name="custom-rr.network"></a>

确保您的网络配置支持 RDS Custom for Oracle 副本。请考虑以下事项：
+ 确保为主数据库实例和其所有副本的虚拟私有云（VPC）内的入站和出站通信启用端口 1140。这对于只读副本之间的 Oracle Data Guard 通信是必需的。
+ RDS Custom for Oracle 会在创建 Oracle 副本时对网络进行验证。如果主数据库实例和新副本无法通过网络连接，则 RDS Custom for Oracle 不会创建副本并将其置于 `INCOMPATIBLE_NETWORK` 状态。
+ 对于外部 Oracle 副本，例如您在 Amazon EC2 或本地创建的只读副本，请使用另一个端口和侦听器进行 Oracle Data Guard 复制。尝试使用端口 1140 可能会导致与 RDS Custom 自动化发生冲突。
+ `/rdsdbdata/config/tnsnames.ora` 文件包含映射到侦听器协议地址的网络服务名称。请注意以下要求和建议：
  + 当处理 Oracle 副本操作时，`tnsnames.ora` 中前缀为 `rds_custom_` 的条目保留用于 RDS Custom。

    在 `tnsnames.ora` 中创建手动条目时，不要使用此前缀。
  + 在某些情况下，您可能希望手动切换或进行失效转移，或者使用快速启动失效转移 (FSFO) 等失效转移技术。如果是这样，请确保将 `tnsnames.ora` 条目从主数据库实例手动同步到所有备用实例。此建议同时适用于 RDS Custom 管理的 Oracle 副本和外部 Oracle 副本。

    RDS Custom 自动化只会更新主数据库实例上的 `tnsnames.ora` 条目。请务必在添加或删除 Oracle 副本时也要进行同步。

    如果您不同步 `tnsnames.ora` 文件并且手动切换或失效转移，主数据库实例上的 Oracle Data Guard 可能无法与 Oracle 副本进行通信。

## RDS Custom for Oracle 的外部副本限制
<a name="custom-rr.external-replica-reqs"></a>

 RDS Custom for Oracle 外部副本（包括本地副本）具有以下限制：
+ RDS Custom for Oracle 在手动失效转移（如 FSFO）时不会检测到外部 Oracle 副本的实例角色更改。

  RDS Custom for Oracle 的确会检测托管式副本的更改。角色更改在事件日志中进行了记录。您还可以通过使用 [describe-db-instances](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-instances.html) AWS CLI 命令查看新状态。
+ RDS Custom for Oracle 不检测到外部 Oracle 副本的高复制滞后。

  RDS Custom for Oracle 的确会检测托管式副本的滞后。高复制滞后会产生 `Replication has stopped` 事件。您还可以通过使用 [describe-db-instances](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-instances.html) AWS CLI 命令查看复制状态，但它的更新可能会延迟。
+ 如果您删除主数据库实例，RDS Custom for Oracle 不会自动提升外部 Oracle 副本。

  自动提升功能仅适用于托管式 Oracle 副本。有关手动提升 Oracle 副本的信息，请参阅白皮书[在 Amazon RDS Custom for Oracle 上使用 Data Guard 启用高可用性](https://d1.awsstatic.com/whitepapers/enabling-high-availability-with-data-guard-on-amazon-rds-custom-for-oracle.pdf)。

# 将 RDS Custom for Oracle 副本提升为独立的数据库实例
<a name="custom-rr.promoting"></a>

就像使用 RDS for Oracle 一样，您可以将 RDS Custom for Oracle 副本提升为独立的数据库实例。提升 Oracle 副本时，RDS Custom for Oracle 会在数据库实例变为可用之前重新启动数据库实例。有关提升 Oracle 副本的更多信息，请参阅[将只读副本提升为独立的数据库实例](USER_ReadRepl.Promote.md)。

提升副本时，请注意以下指南：
+ 在 RDS Custom for Oracle 提升您的副本时不要启动失效转移。否则，提升工作流可能会卡住。
+ 在 RDS Custom for Oracle 提升 Oracle 副本时，不要切换主数据库实例。否则，提升工作流可能会卡住。
+ 在 RDS Custom for Oracle 提升 Oracle 副本时，不要关闭主数据库实例。否则，提升工作流可能会卡住。
+ 不要尝试将新提升的数据库实例作为目标来重新开始复制。在 RDS Custom for Oracle 提升 Oracle 副本后，它将成为一个独立的数据库实例，不再具有副本角色。

注意 RDS Custom for Oracle 副本提升存在以下限制：
+ 当 RDS Custom for Oracle 正在备份副本时，您无法提升副本。
+ 提升 Oracle 副本时，不能将备份保留期更改为 `0`。
+ 当副本未处于正常运行状态时，您无法提升它。

  如果您在主数据库实例上发出 `delete-db-instance`，RDS Custom for Oracle 会验证每个托管式 Oracle 副本是否正常运行以及是否可供提升。副本可能不符合提升资格，因为自动化已暂停或它不在支持外围内。在这种情况下，RDS Custom for Oracle 会发布一个事件来解释此问题，以便您可以手动修复 Oracle 副本。

以下步骤说明将 Oracle 副本提升为数据库实例的一般过程：

1. 停止将任何事务写入到主数据库实例。

1. 等待 RDS Custom for Oracle 将所有更新应用到 Oracle 副本。

1. 通过在 Amazon RDS 控制台上选择 **Promote**（提升）选项、AWS CLI 命令 [https://docs.aws.amazon.com/cli/latest/reference/rds/promote-read-replica.html](https://docs.aws.amazon.com/cli/latest/reference/rds/promote-read-replica.html) 或 [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_PromoteReadReplica.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_PromoteReadReplica.html) Amazon RDS API 操作来提升 Oracle 副本。

提升一个 Oracle 副本需要几分钟才能完成。在此过程中，RDS Custom for Oracle 会停止复制并重启您的副本。完成重启后，Oracle 副本即可用作独立的数据库实例。有关排查副本提升问题的信息，请参阅[排查 RDS Custom for Oracle 的副本提升问题](custom-troubleshooting.md#custom-troubleshooting-promote)。

## 控制台
<a name="USER_ReadRepl.Promote.Console"></a>

**将 RDS Custom for Oracle 副本提升为独立的数据库实例**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在 Amazon RDS 控制台中，选择**数据库**。

   随后会显示**数据库**窗格。每个 Oracle 副本在 **Role**（角色）列中显示 **Replica**（副本）。

1. 选择您要提升的 RDS Custom for Oracle 副本。

1. 对于**操作**，请选择**提升**。

1. 在 **Promote Oracle replica**（提升 Oracle 副本）页面上，输入新提升的数据库实例的备份保留期和备份时段。您不能将此值设置为 **0**。

1. 根据需要完成设置后，选择 **Promote Oracle replica**（提升 Oracle 副本）。

## AWS CLI
<a name="USER_ReadRepl.Promote.CLI"></a>

要将 RDS Custom for Oracle 副本提升为独立的数据库实例，请使用 AWS CLI [https://docs.aws.amazon.com/cli/latest/reference/rds/promote-read-replica.html](https://docs.aws.amazon.com/cli/latest/reference/rds/promote-read-replica.html) 命令。

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws rds promote-read-replica \
--db-instance-identifier my-custom-read-replica \
--backup-retention-period 2 \
--preferred-backup-window 23:00-24:00
```
对于 Windows：  

```
aws rds promote-read-replica ^
--db-instance-identifier my-custom-read-replica ^
--backup-retention-period 2 ^
--preferred-backup-window 23:00-24:00
```

## RDS API
<a name="USER_ReadRepl.Promote.API"></a>

要将 RDS Custom for Oracle 副本提升为独立的数据库实例，请调用具有必要参数 `PromoteReadReplica` 的 Amazon RDS API [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_PromoteReadReplica.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_PromoteReadReplica.html) 操作。

# 在 RDS Custom for Oracle 主实例和副本实例之间配置 VPN 隧道
<a name="cfo-standby-vpn-tunnel"></a>

VPN 隧道是通过网络在两个或更多个设备之间建立的加密连接。为了确保 RDS Custom for Oracle 中的 Oracle Data Guard 实例具有最高级别的安全性，我们强烈建议您实施 VPN 隧道来对主实例与备用实例之间的通信进行加密。该隧道在实例之间进行网络传输时，可保护敏感数据。虽然此配置是可选的，但我们建议将其作为实现数据安全性和法规合规性的最佳实践。

请确保满足以下先决条件：
+ 您拥有主要主机和备用主机的根访问权限。
+ 您拥有运行 `ipsec` 命令的技术专业知识。

**在 RDS Custom for Oracle 中配置主副本之间的 VPN 隧道**

1. 使用以下规则将主实例和备用实例的安全组添加到允许列表中：

   ```
   ACTION FLOW SOURCE PROTO PORT
   
   ALLOW ingress this-SG 50 (ESP) all (N/A)
   ALLOW egress this-SG 50 (ESP) all (N/A)
   
   ALLOW ingress this-SG 17 (UDP) 500 (IKE)
   ALLOW egress this-SG 17 (UDP) 500 (IKE)
   ```

1. 切换到根用户。

   ```
   $ sudo su – root
   ```

1. 在主实例和备用实例上运行以下命令，以初始化用户 `root` 下的网络安全服务（NSS）数据库。

   ```
   ipsec initnss --nssdir /etc/ipsec.d
   ```

1. 按如下方式生成 RSA 密钥：

   1. 在主实例上，使用以下任一 `ipsec` 命令生成密钥，具体取决于您的操作系统版本。

      ```
      ipsec newhostkey --nssdir /etc/ipsec.d       ## for Oracle Linux Version 8
      ipsec newhostkey --output /etc/ipsec.secrets ## for Oracle Linux version 7.9
      ```

   1. 获取创建配置所需的公有密钥。在以下示例中，主实例是 `left`，因为在 `ipsec` 术语中，`left` 是指您当前正在配置的设备，而 `right` 是指隧道另一端的设备。

      ```
      ipsec showhostkey --left --ckaid ckaid-returned-in-last-statement
      ```

   1. 在备用实例上，为备用实例生成密钥。

      ```
      ipsec newhostkey --nssdir /etc/ipsec.d       ## for Oracle Linux Version 8
      ipsec newhostkey --output /etc/ipsec.secrets ## for Oracle Linux version 7.9
      ```

   1. 获取备用实例的公有密钥，创建配置时需要该公有密钥。在以下示例中，备用实例为 `right`，因为它指的是隧道另一端的设备。

      ```
      ipsec showhostkey --right --ckaid ckaid-returned-in-last-statement
      ```

1. 根据您获得的 RSA 密钥生成配置。主实例与备用实例的配置相同。您可以在 AWS 控制台中找到主实例 IPv4 地址和备用实例 IPv4 地址。

   在主实例和备用实例上，将以下配置保存到文件 `/etc/ipsec.d/custom-fb-tunnel.conf` 中。

   ```
   conn custom-db-tunnel
    type=transport
    auto=add
    authby=rsasig
    left=IPV4-for-primary 
    leftrsasigkey=RSA-key-generated-on-primary
    right=IPV4-for-standby
    rightrsasigkey=RSA-key-generated-on-standby
   ```

1. 在主实例和备用实例上，在两台主机上启动 `ipsec` 进程守护程序。

   ```
   ipsec setup start
   ```

1. 在主实例或备用实例上启动隧道。该输出值应该类似于以下内容。

   ```
   [root@ip-172-31-6-81 ~]# ipsec auto --up custom-db-tunnel
   181 "custom-db-tunnel" #1: initiating IKEv2 connection
   181 "custom-db-tunnel" #1: sent IKE_SA_INIT request to 172.31.32.196:500
   182 "custom-db-tunnel" #1: sent IKE_AUTH request {cipher=AES_GCM_16_256 integ=n/a prf=HMAC_SHA2_512 group=DH19}
   003 "custom-db-tunnel" #1: initiator established IKE SA; authenticated peer '3584-bit PKCS#1 1.5 RSA with SHA1' signature using preloaded certificate '172.31.32.196'
   004 "custom-db-tunnel" #2: initiator established Child SA using #1; IPsec transport [172.31.6.81-172.31.6.81:0-65535 0] -> [172.31.32.196-172.31.32.196:0-65535 0] {ESP/ESN=>0xda9c4815 <0xb742ca42 xfrm=AES_GCM_16_256-NONE DPD=passive}
   [root@ip-172-31-6-81 ~]#
   ```