

# 向 Oracle 数据库实例添加选项
<a name="Appendix.Oracle.Options"></a>

在 Amazon RDS 中，选项是额外的功能。您可在下面找到可以添加到运行 Oracle 数据库引擎的 Amazon RDS 实例的选项描述。

**Topics**
+ [Oracle DB 选项概述](Appendix.Oracle.Options.overview.md)
+ [Amazon S3 集成](oracle-s3-integration.md)
+ [Oracle Application Express (APEX)](Appendix.Oracle.Options.APEX.md)
+ [Amazon EFS 集成](oracle-efs-integration.md)
+ [Oracle Java 虚拟机](oracle-options-java.md)
+ [Oracle Enterprise Manager](Oracle.Options.OEM.md)
+ [Oracle Label Security](Oracle.Options.OLS.md)
+ [Oracle Locator](Oracle.Options.Locator.md)
+ [Oracle 本机网络加密](Appendix.Oracle.Options.NetworkEncryption.md)
+ [Oracle OLAP](Oracle.Options.OLAP.md)
+ [Oracle 安全套接字层](Appendix.Oracle.Options.SSL.md)
+ [Oracle Spatial](Oracle.Options.Spatial.md)
+ [Oracle SQLT](Oracle.Options.SQLT.md)
+ [Oracle Statspack](Appendix.Oracle.Options.Statspack.md)
+ [Oracle 时区](Appendix.Oracle.Options.Timezone.md)
+ [Oracle 时区文件自动升级](Appendix.Oracle.Options.Timezone-file-autoupgrade.md)
+ [Oracle 透明数据加密](Appendix.Oracle.Options.AdvSecurity.md)
+ [Oracle UTL\$1MAIL](Oracle.Options.UTLMAIL.md)
+ [Oracle XML DB](Appendix.Oracle.Options.XMLDB.md)

# Oracle DB 选项概述
<a name="Appendix.Oracle.Options.overview"></a>

要为 Oracle 数据库启用选项，可将它们添加到选项组中，然后将选项组关联到数据库实例。有关更多信息，请参阅 [使用选项组](USER_WorkingWithOptionGroups.md)。

**Topics**
+ [“Oracle 数据库”选项摘要](#Appendix.Oracle.Options.summary)
+ [不同版本支持的选项](#Appendix.Oracle.Options.editions)
+ [特定选项的内存要求](#Appendix.Oracle.Options.memory)

## “Oracle 数据库”选项摘要
<a name="Appendix.Oracle.Options.summary"></a>

对于 Oracle 数据库实例，您可以添加以下选项。


****  

| 选项 | 选项 ID | 
| --- | --- | 
|  [Amazon S3 集成](oracle-s3-integration.md)  |  `S3_INTEGRATION`  | 
|  [Oracle Application Express (APEX)](Appendix.Oracle.Options.APEX.md)  |  `APEX` `APEX-DEV`  | 
|  [Oracle Enterprise Manager](Oracle.Options.OEM.md)  |  `OEM` `OEM_AGENT`  | 
|  [Oracle Java 虚拟机](oracle-options-java.md)  |  `JVM`  | 
|  [Oracle Label Security](Oracle.Options.OLS.md)  |  `OLS`  | 
|  [Oracle Locator](Oracle.Options.Locator.md)  |  `LOCATOR`  | 
|  [Oracle 本机网络加密](Appendix.Oracle.Options.NetworkEncryption.md)  |  `NATIVE_NETWORK_ENCRYPTION`  | 
|  [Oracle OLAP](Oracle.Options.OLAP.md)  |  `OLAP`  | 
|  [Oracle 安全套接字层](Appendix.Oracle.Options.SSL.md)  |  `SSL`  | 
|  [Oracle Spatial](Oracle.Options.Spatial.md)  |  `SPATIAL`  | 
|  [Oracle SQLT](Oracle.Options.SQLT.md)  |  `SQLT`  | 
|  [Oracle Statspack](Appendix.Oracle.Options.Statspack.md)  |  `STATSPACK`  | 
|  [Oracle 时区](Appendix.Oracle.Options.Timezone.md)  |  `Timezone`  | 
|  [Oracle 时区文件自动升级](Appendix.Oracle.Options.Timezone-file-autoupgrade.md)  |  `TIMEZONE_FILE_AUTOUPGRADE`  | 
|  [Oracle 透明数据加密](Appendix.Oracle.Options.AdvSecurity.md)  |  `TDE`  | 
|  [Oracle UTL\$1MAIL](Oracle.Options.UTLMAIL.md)  |  `UTL_MAIL`  | 
|  [Oracle XML DB](Appendix.Oracle.Options.XMLDB.md)  |  `XMLDB`  | 

## 不同版本支持的选项
<a name="Appendix.Oracle.Options.editions"></a>

如果不支持该选项，RDS for Oracle 会阻止您将该选项添加到版本中。要了解不同 Oracle 数据库版本中支持哪些 RDS 选项，请使用命令 `aws rds describe-option-group-options`。以下示例列出 Oracle Database 19c 企业版支持的选项。

```
aws rds describe-option-group-options \
    --engine-name oracle-ee \
    --major-engine-version 19
```

有关更多信息，请参阅 *AWS CLI 命令引用*中的 [describe-option-group-options](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-option-group-options.html)。

## 特定选项的内存要求
<a name="Appendix.Oracle.Options.memory"></a>

某些选项需要额外的内存才能在数据库实例上运行。例如，Oracle Enterprise Manager Database Control 使用约 300 MB 的 RAM。如果为小数据库实例启用该选项，则可能会遇到内存限制导致的性能问题。您可以调整 Oracle 参数，以便数据库需要更少的 RAM。或者，您也可以扩展到更大的数据库实例。

# Amazon S3 集成
<a name="oracle-s3-integration"></a>

您可以在 RDS for Oracle 数据库实例和 Amazon S3 存储桶之间传输文件。您可以使用 Amazon S3 与 Oracle Database 集成的功能，例如 Oracle Data Pump。例如，您可以将 Data Pump 文件从 Amazon S3 下载到 RDS for Oracle 数据库实例。有关更多信息，请参阅 [将数据导入到 Amazon RDS 上的 Oracle](Oracle.Procedural.Importing.md)。

**注意**  
数据库实例和 Amazon S3 存储桶必须位于同一 AWS 区域。

**Topics**
+ [为与 Amazon S3 集成的 RDS for Oracle 配置 IAM 权限](oracle-s3-integration.preparing.md)
+ [添加 Amazon S3 集成选项](oracle-s3-integration.preparing.option-group.md)
+ [在 Amazon RDS for Oracle 和 Amazon S3 存储桶之间传输文件](oracle-s3-integration.using.md)
+ [排查 Amazon S3 集成问题](#oracle-s3-integration.troubleshooting)
+ [删除 Amazon S3 集成选项](oracle-s3-integration.removing.md)

# 为与 Amazon S3 集成的 RDS for Oracle 配置 IAM 权限
<a name="oracle-s3-integration.preparing"></a>

若要让 RDS for Oracle 与 Amazon S3 集成，您的数据库实例必须可以访问 Amazon S3 存储桶。数据库实例使用的 Amazon VPC 不需要提供 Amazon S3 终端节点的访问权限。

RDS for Oracle 支持在一个账户中的数据库实例与另一个账户中的 Amazon S3 存储桶之间传输文件。如果需要其他步骤，将在以下各节中说明这些步骤。

**Topics**
+ [步骤 1：为 Amazon RDS 角色创建 IAM 策略](#oracle-s3-integration.preparing.policy)
+ [步骤 2：（可选）为 Amazon S3 存储桶创建 IAM 策略](#oracle-s3-integration.preparing.policy-bucket)
+ [步骤 3：为您的数据库实例创建 IAM 角色并附加策略](#oracle-s3-integration.preparing.role)
+ [步骤 4：将您的 IAM 角色与 RDS for Oracle 数据库实例关联](#oracle-s3-integration.preparing.instance)

## 步骤 1：为 Amazon RDS 角色创建 IAM 策略
<a name="oracle-s3-integration.preparing.policy"></a>

在此步骤中，您将创建一个 AWS Identity and Access Management（IAM）策略，该策略具有在 Amazon S3 存储桶和 RDS 数据库实例之间传输文件所需的权限。此步骤假定您已创建了 S3 桶。

创建策略前，请记下以下信息：
+ 存储桶的 Amazon 资源名称（ARN）。
+ 您的 AWS KMS 密钥的 ARN，如果您的存储桶使用 SSE-KMS 或 SSE-S3 加密
**注意**  
RDS for Oracle 数据库实例无法访问使用 SSE-C 加密的 Amazon S3 桶。

有关更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[使用服务器端加密保护数据](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)。

### 控制台
<a name="oracle-s3-integration.preparing.policy.console"></a>

**创建 IAM policy 以允许 Amazon RDS 访问 Amazon S3 桶**

1. 打开 [IAM 管理控制台](https://console.aws.amazon.com/iam/home?#home)。

1. 在 **Access management (访问管理)** 下，选择 **Policies (策略)**。

1. 选择**创建策略**。

1. 在** Visual editor (可视化编辑器)** 选项卡上，选择 **Choose a service (选择服务)**，然后选择 **S3**。

1. 对于 **Actions (操作)**，选择 **Expand all (全部展开)**，然后选择将文件从 Amazon S3 存储桶传输到 Amazon RDS 所需的存储桶权限和对象权限。例如，执行以下操作：
   + 展开 **List (列表)**，然后选择 **ListBucket**。
   + 展开 **Read (读取)**，然后选择 **GetObject**。
   + 展开**写入**，然后选择 **PutObject**、**DeleteObject**、**AbortMultipartUpload** 和 **ListMultipartUploadParts**。在将大型文件（100 MB 或更大）上传到 Amazon S3 时，需要分段上传权限。
   + 展开 **Permissions management**（权限管理），然后选择**PutObjectAcl**。如果您计划将文件上传到其他账户拥有的存储桶，并且此账户需要完全控制存储桶内容，则需要此权限。

   *对象权限*是 Amazon S3 中的对象操作的权限。您必须为存储桶中的对象而不是存储桶本身授予这些权限。有关更多信息，请参阅[对象操作权限](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-objects)。

1. 选择**资源**，然后执行以下操作：

   1. 选择**特定**。

   1. 对于**桶**，选择**添加 ARN**。输入桶 ARN。桶名称会自动填入。然后，选择 **Add (添加)**。

   1. 如果显示了**对象**资源，请选择**添加 ARN** 以手动添加资源，或者选择**任意**。
**注意**  
您可以将 **Amazon Resource Name (ARN)** 设置为更具体的 ARN 值，以允许 Amazon RDS 仅访问 Amazon S3 存储桶中的特定文件或文件夹。有关如何为 Amazon S3 定义访问策略的更多信息，请参阅[管理您的 Amazon S3 资源的访问权限](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html)。

1. （可选）选择 **Add additional permissions (添加其他权限)**，向策略中添加资源。例如，执行以下操作：

   1. 如果您的存储桶使用自定义 KMS 密钥加密，请为该服务选择 **KMS**。

   1. 对于**手动操作**，请选择以下选项：
      + **Encrypt**
      + **重新加密起点**和**重新加密终点**
      + **Decrypt**
      + **DescribeKey**
      + **GenerateDataKey**

   1. 对于**资源**，选择**特定**。

   1. 对于**密钥**，选择**添加 ARN**。输入自定义密钥的 ARN 作为资源，然后选择**添加**。

      有关更多信息，请参阅 *Amazon Simple Storage Service 用户指南*中的[使用在 AWS Key Management Service (SSE-KMS) 中存储 KMS 密钥的服务器端加密保护数据](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html)。

   1. 如果想要 Amazon RDS 访问其他存储桶，请为这些存储桶添加 ARN。您也可以根据需要授予访问 Amazon S3 中所有存储桶和对象的权限。

1. 选择 **Next: Tags (下一步: 标签)**，然后选择 **Next: Review (下一步: 审核)**。

1. 对于** Name (名称)**，请为您的 IAM 策略输入名称，例如 `rds-s3-integration-policy`。在创建 IAM 角色与您的数据库实例关联时，需要使用此名称。您也可以添加可选的 **Description (描述)** 值。

1. 选择**创建策略**。

### AWS CLI
<a name="oracle-s3-integration.preparing.policy.CLI"></a>

创建向 Amazon RDS 授予对 Amazon S3 存储桶的访问权限的 AWS Identity and Access Management（IAM）策略。创建策略后，请记下策略的 ARN。后续步骤需要该 ARN。

根据所需的访问类型，在策略中包括适合的操作：
+ `GetObject` – 从 Amazon S3 存储桶向 Amazon RDS 传输文件所必需的。
+ `ListBucket` – 从 Amazon S3 存储桶向 Amazon RDS 传输文件所必需的。
+ `PutObject` – 从 Amazon RDS 向 Amazon S3 存储桶传输文件所必需的。
+ `AbortMultipartUpload`：当将大型文件（100 MB 或更大）从 Amazon RDS 传输到 Amazon S3 存储桶时，进行分段上传所需。
+ `ListMultipartUploadParts`：当将大型文件（100 MB 或更大）从 Amazon RDS 传输到 Amazon S3 存储桶时，进行分段上传所需。

以下 AWS CLI 命令使用这些选项创建一个名为 `rds-s3-integration-policy` 的 IAM 策略。该策略授予对名为 `amzn-s3-demo-bucket` 的存储桶的访问权限。

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

```
aws iam create-policy \
   --policy-name rds-s3-integration-policy \
   --policy-document '{
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "s3integration",
         "Action": [
           "s3:GetObject",
           "s3:ListBucket",
           "s3:PutObject",
           "s3:AbortMultipartUpload",
           "s3:ListMultipartUploadParts"
         ],
         "Effect": "Allow",
         "Resource": [
           "arn:aws:s3:::amzn-s3-demo-bucket", 
           "arn:aws:s3:::amzn-s3-demo-bucket/*"
         ]
       }
     ]
   }'
```
以下示例包含自定义 KMS 密钥的权限。  

```
aws iam create-policy \
   --policy-name rds-s3-integration-policy \
   --policy-document '{
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "s3integration",
         "Action": [
           "s3:GetObject",
           "s3:ListBucket",
           "s3:PutObject",
           "kms:Decrypt",
           "kms:Encrypt",
           "kms:ReEncrypt*",
           "kms:GenerateDataKey",
           "kms:DescribeKey",
         ],
         "Effect": "Allow",
         "Resource": [
           "arn:aws:s3:::amzn-s3-demo-bucket", 
           "arn:aws:s3:::amzn-s3-demo-bucket/*",
           "arn:aws:kms:::your-kms-arn"
         ]
       }
     ]
   }'
```
对于：Windows  

```
aws iam create-policy ^
   --policy-name rds-s3-integration-policy ^
   --policy-document '{
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "s3integration",
         "Action": [
           "s3:GetObject",
           "s3:ListBucket",
           "s3:PutObject",
           "s3:AbortMultipartUpload",
           "s3:ListMultipartUploadParts"
         ],
         "Effect": "Allow",
         "Resource": [
           "arn:aws:s3:::amzn-s3-demo-bucket", 
           "arn:aws:s3:::amzn-s3-demo-bucket/*"
         ]
       }
     ]
   }'
```
以下示例包含自定义 KMS 密钥的权限。  

```
aws iam create-policy ^
   --policy-name rds-s3-integration-policy ^
   --policy-document '{
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "s3integration",
         "Action": [
           "s3:GetObject",
           "s3:ListBucket",
           "s3:PutObject",
           "kms:Decrypt",
           "kms:Encrypt",
           "kms:ReEncrypt",
           "kms:GenerateDataKey",
           "kms:DescribeKey",
         ],
         "Effect": "Allow",
         "Resource": [
           "arn:aws:s3:::amzn-s3-demo-bucket", 
           "arn:aws:s3:::amzn-s3-demo-bucket/*",
           "arn:aws:kms:::your-kms-arn"
         ]
       }
     ]
   }'
```

## 步骤 2：（可选）为 Amazon S3 存储桶创建 IAM 策略
<a name="oracle-s3-integration.preparing.policy-bucket"></a>

只有在以下情况下才需要此步骤：
+ 您计划从一个账户（账户 A）将文件上传到 Amazon S3 存储桶，然后从另一个账户（账户 B）访问它们。
+ 账户 B 拥有该存储桶。
+ 账户 B 需要完全控制加载到存储桶中的对象。

如果上述条件不适用于您，请跳至[步骤 3：为您的数据库实例创建 IAM 角色并附加策略](#oracle-s3-integration.preparing.role)。

要创建存储桶策略，请确保您具备以下各项：
+ 账户 A 的账户 ID
+ 账户 A 的用户名
+ 账户 B 中 Amazon S3 存储桶的 ARN 值

### 控制台
<a name="oracle-s3-integration.preparing.policy-bucket.console"></a>

**创建或编辑存储桶策略**

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在 **Buckets (存储桶)** 列表中，请选择要为其创建或编辑存储桶策略的存储桶的名称。

1. 选择**权限**。

1. 在 **Bucket policy (存储桶策略)** 下，请选择 **Edit (编辑)**。这将打开编辑存储桶策略页面。

1. 在**编辑存储桶策略**页面上，探索《Amazon S3 用户指南》**中的**策略示例**，选择**策略生成器**自动生成策略，或者在**策略**部分编辑 JSON。

   如果选择 **Policy generator**（策略生成器）则 AWS 策略生成器将在新的窗口中打开。

   1. 在 **AWS 策略生成器**页面，在 **Select Type of Policy**（选择策略类型）中，请选择 **S3 存储桶Policy**（S3 存储桶策略）。

   1. 通过在提供的字段中输入信息来添加语句，然后选择 **Add Statement**（添加语句）。对所有您想添加的语句重复执行此操作。有关这些字段的更多信息，请参阅 *IAM 用户指南*中的 [IAM JSON 策略元素参考](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html)。
**注意**  
为方便起见，**Edit bucket policy**（编辑存储桶策略）页面会在 **Policy**（策略）文本字段上方显示当前存储桶的 **Bucket ARN **（Amazon 资源名称）。您可以复制此 ARN，以便在 **AWS 策略生成器**页面上的语句中使用。

   1. 添加完语句后，请选择**生成策略**。

   1. 复制生成的策略文本，请选择 **Close**（关闭），然后返回到 Amazon S3 控制台中的 **Edit bucket policy**（编辑存储桶策略）页面。

1. 在 **Policy**（策略）框中，编辑现有策略或从策略生成器粘贴存储桶策略。确保在保存策略之前解决安全警告、错误、一般警告和建议。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "ExamplePermissions",
         "Effect": "Allow",
         "Principal": {
           "AWS": "arn:aws:iam::123456789012:user/account-A-user"
         },
         "Action": [
           "s3:PutObject",
           "s3:PutObjectAcl"
         ],
         "Resource": [
           "arn:aws:s3:::amzn-s3-demo-destination-bucket",
           "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
         ]
       }
     ]
   }
   ```

------

1. 请选择 **Save changes**（保存更改），此操作将让您返回到存储桶权限页面。

## 步骤 3：为您的数据库实例创建 IAM 角色并附加策略
<a name="oracle-s3-integration.preparing.role"></a>

此步骤假定您已在[步骤 1：为 Amazon RDS 角色创建 IAM 策略](#oracle-s3-integration.preparing.policy)中创建了 IAM 策略。在此步骤中，您将为 RDS for Oracle 数据库实例创建一个角色，然后将策略附加到该角色。

### 控制台
<a name="oracle-s3-integration.preparing.role.console"></a>

**创建 IAM 角色以允许 Amazon RDS 访问 Amazon S3 桶**

1. 打开 [IAM 管理控制台](https://console.aws.amazon.com/iam/home?#home)。

1. 在导航窗格中，选择**角色**。

1. 选择**创建角色**。

1. 选择 **AWS 服务**。

1. 对于**其他 AWS 服务的使用案例：**，选择 **RDS**，然后选择 **RDS – 向数据库添加角色**。然后选择**下一步**。

1. 对于**权限策略**下面的**搜索**，请输入您在[步骤 1：为 Amazon RDS 角色创建 IAM 策略](#oracle-s3-integration.preparing.policy)中创建的 IAM policy 的名称，然后当策略在列表中显示时选择该策略。然后选择**下一步**。

1. 对于**角色名称**，输入 IAM 角色的名称，例如 `rds-s3-integration-role`。您也可以添加可选的**描述**值。

1. 选择**创建角色**。

### AWS CLI
<a name="integration.preparing.role.CLI"></a>

**创建一个角色并向该角色附加策略**

1. 创建一个让 Amazon RDS 可代表您访问 Amazon S3 存储桶的 IAM 角色。

   我们建议在基于资源的信任关系中使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 和 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 全局条件上下文键，以此限制服务对特定资源的权限。这是防范[混淆代理问题](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)最有效的方法。

   您可以使用这两个全局条件上下文键并让 `aws:SourceArn` 值包含账户 ID。在这种情况下，当 `aws:SourceAccount` 值和 `aws:SourceArn` 值中的账户使用相同策略语句时，确保二者使用相同的账户 ID。
   + 如果您想对单个资源进行跨服务访问，请使用 `aws:SourceArn`。
   + 如果您想允许该账户中的任何资源与跨服务使用操作相关联，请使用 `aws:SourceAccount`。

   在信任关系中，请务必使用 `aws:SourceArn` 全局条件上下文键和访问角色资源的完整 Amazon Resource Name (ARN)。

   以下 AWS CLI 命令会创建名为 `rds-s3-integration-role` 的角色来实现此目的。  
**Example**  

   对于 Linux、macOS 或 Unix：

   ```
   aws iam create-role \
      --role-name rds-s3-integration-role \
      --assume-role-policy-document '{
        "Version": "2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
               "Service": "rds.amazonaws.com"
             },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "my_account_ID",
                    "aws:SourceArn": "arn:aws:rds:Region:my_account_ID:db:dbname"
                }
            }
          }
        ]
      }'
   ```

   对于：Windows

   ```
   aws iam create-role ^
      --role-name rds-s3-integration-role ^
      --assume-role-policy-document '{
        "Version": "2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
               "Service": "rds.amazonaws.com"
             },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "my_account_ID",
                    "aws:SourceArn": "arn:aws:rds:Region:my_account_ID:db:dbname"
                }
            }
          }
        ]
      }'
   ```

   有关更多信息，请参阅 *IAM 用户指南* 中的[创建向 IAM 用户委派权限的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)。

1. 创建角色之后，记下该角色的 ARN。后续步骤需要该 ARN。

1. 将您创建的策略附在您创建的角色上。

   以下 AWS CLI 命令将策略附加到名为 `rds-s3-integration-role` 的角色。  
**Example**  

   对于 Linux、macOS 或 Unix：

   ```
   aws iam attach-role-policy \
      --policy-arn your-policy-arn \
      --role-name rds-s3-integration-role
   ```

   对于：Windows

   ```
   aws iam attach-role-policy ^
      --policy-arn your-policy-arn ^
      --role-name rds-s3-integration-role
   ```

   将 `your-policy-arn` 替换为您在上一步中记下的策略 ARN。

## 步骤 4：将您的 IAM 角色与 RDS for Oracle 数据库实例关联
<a name="oracle-s3-integration.preparing.instance"></a>

配置进行 Amazon S3 集成的权限的最后一步是将您的 IAM 角色与数据库实例相关联。请注意以下要求：
+ 您必须具有访问 IAM 角色的权限，并向此角色附加所需的 Amazon S3 权限策略。
+ 您一次只能将一个 IAM 角色与 RDS for Oracle 数据库实例关联。
+ 数据库实例必须处于**可用**状态。

### 控制台
<a name="oracle-s3-integration.preparing.instance.console"></a>

**将您的 IAM 角色与 RDS for Oracle 数据库实例关联**

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

1. 从导航窗格中选择 **Databases (数据库)**。

1. 选择 RDS for Oracle 数据库实例名称以显示其详细信息。

1. 在 **Connectivity & security**（连接性和安全性）选项卡上，向下滚动到页面底部的 **Manage IAM roles**（管理 IAM 角色）部分。

1. 对于**向此实例添加 IAM 角色**，选择您在[步骤 3：为您的数据库实例创建 IAM 角色并附加策略](#oracle-s3-integration.preparing.role)中创建的角色。

1. 对于 **Feature (功能)**，选择 **S3\$1INTEGRATION**。  
![\[添加 S3_INTEGRATION 角色\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/ora-s3-integration-role.png)

1. 选择 **Add role (添加角色)**。

### AWS CLI
<a name="oracle-s3-integration.preparing.instance.CLI"></a>

以下 AWS CLI 命令将角色添加到名为 `mydbinstance` 的 Oracle 数据库实例。

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

```
aws rds add-role-to-db-instance \
   --db-instance-identifier mydbinstance \
   --feature-name S3_INTEGRATION \
   --role-arn your-role-arn
```
对于：Windows  

```
aws rds add-role-to-db-instance ^
   --db-instance-identifier mydbinstance ^
   --feature-name S3_INTEGRATION ^
   --role-arn your-role-arn
```

将 `your-role-arn` 替换为您在上一步中记下的角色 ARN。必须为 `S3_INTEGRATION` 选项指定 `--feature-name`。

# 添加 Amazon S3 集成选项
<a name="oracle-s3-integration.preparing.option-group"></a>

要将 Amazon RDS for Oracle 与 Amazon S3 集成，您的数据库实例必须与包括 `S3_INTEGRATION` 选项的选项组关联。

## 控制台
<a name="oracle-s3-integration.preparing.option-group.console"></a>

**为 Amazon S3 集成配置选项组**

1. 创建新选项组或识别现有选项组，然后您可以将 `S3_INTEGRATION` 选项添加到其中。

   有关创建选项组的信息，请参阅 [创建选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)。

1. 将 `S3_INTEGRATION` 选项添加到该选项组。

   有关向选项组添加选项的信息，请参阅 [将选项添加到选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption)。

1. 创建新的 RDS for Oracle 数据库实例并将选项组与其关联，或者修改要将选项组与其关联的 RDS for Oracle 数据库实例。

   有关创建数据库实例的信息，请参阅[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)。

   有关修改 数据库实例的信息，请参阅。[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)

## AWS CLI
<a name="oracle-s3-integration.preparing.option-group.cli"></a>

**为 Amazon S3 集成配置选项组**

1. 创建新选项组或识别现有选项组，然后您可以将 `S3_INTEGRATION` 选项添加到其中。

   有关创建选项组的信息，请参阅 [创建选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)。

1. 将 `S3_INTEGRATION` 选项添加到该选项组。

   例如，以下 AWS CLI 命令将 `S3_INTEGRATION` 选项添加到名为 **myoptiongroup** 的选项组。  
**Example**  

   对于 Linux、macOS 或 Unix：

   ```
   aws rds add-option-to-option-group \
      --option-group-name myoptiongroup \
      --options OptionName=S3_INTEGRATION,OptionVersion=1.0
   ```

   对于 Windows：

   ```
   aws rds add-option-to-option-group ^
      --option-group-name myoptiongroup ^
      --options OptionName=S3_INTEGRATION,OptionVersion=1.0
   ```

1. 创建新的 RDS for Oracle 数据库实例并将选项组与其关联，或者修改要将选项组与其关联的 RDS for Oracle 数据库实例。

   有关创建数据库实例的信息，请参阅[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)。

   有关修改 RDS for Oracle 数据库实例的信息，请参阅[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

# 在 Amazon RDS for Oracle 和 Amazon S3 存储桶之间传输文件
<a name="oracle-s3-integration.using"></a>

要在 RDS for Oracle 数据库实例和 Amazon S3 桶之间传输文件，您可以使用 Amazon RDS 软件包 `rdsadmin_s3_tasks`。您可以在上传文件时使用 GZIP 压缩文件，并在下载时解压缩它们。

**Topics**
+ [文件传输功能的要求和限制](#oracle-s3-integration.using.reqs)
+ [将文件从 RDS for Oracle 数据库实例上传到 Amazon S3 存储桶](#oracle-s3-integration.using.upload)
+ [将文件从 Amazon S3 存储桶下载到 Oracle 数据库实例](#oracle-s3-integration.using.download)
+ [监控文件传输的状态](#oracle-s3-integration.using.task-status)

## 文件传输功能的要求和限制
<a name="oracle-s3-integration.using.reqs"></a>

在您的数据库实例和 Amazon S3 存储桶之间传输文件之前，请注意以下事项：
+ `rdsadmin_s3_tasks` 软件包传输位于单个目录中的文件。您不能在传输中包括子目录。
+ Amazon S3 存储桶中的最大对象大小为 5 TB。
+ `rdsadmin_s3_tasks` 创建的任务以异步方式运行。
+ 您可以从 Data Pump 目录（例如 `DATA_PUMP_DIR`）或用户创建的任何目录上传文件。您不能从 Oracle 后台进程使用的目录（例如 `adump`、`bdump` 或 `trace` 目录）上传文件。
+ 对于 `download_from_s3`，每次过程调用的下载限制为 2000 个文件。如果您需要从 Amazon S3 下载超过 2000 个文件，请将您的下载分成多个单独的操作，每个过程调用不超过 2000 个文件。
+ 如果您的下载文件夹中存在文件，并且您尝试下载同名的文件，`download_from_s3` 将跳过下载。要从下载目录中移除文件，请使用 PL/SQL 过程 [UTL\$1FILE.FREMOVE](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/UTL_FILE.html#GUID-09B09C2A-2C21-4F70-BF04-D0EEA7B59CAF)。

## 将文件从 RDS for Oracle 数据库实例上传到 Amazon S3 存储桶
<a name="oracle-s3-integration.using.upload"></a>

要将文件从数据库实例上传到 Amazon S3 存储桶，请使用 `rdsadmin.rdsadmin_s3_tasks.upload_to_s3` 过程。例如，您可以上传 Oracle Recovery Manager（RMAN）备份文件或 Oracle Data Pump 文件。有关使用对象的更多信息，请参阅 [Amazon Simple Storage Service 用户指南](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingObjects.html)。有关执行 RMAN 备份的更多信息，请参阅 [执行 Oracle 数据库实例的常见 RMAN 任务](Appendix.Oracle.CommonDBATasks.RMAN.md)。

`rdsadmin.rdsadmin_s3_tasks.upload_to_s3` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_bucket_name`  |  VARCHAR2  |  –  |  必需  |  要将文件上传到其中的 Amazon S3 存储桶的名称。  | 
|  `p_directory_name`  |  VARCHAR2  |  –  |  必需  |  要从其中上传文件的 Oracle 目录对象的名称。该目录可以是用户创建的任何目录对象或 Data Pump 目录，例如 `DATA_PUMP_DIR`。您不能从后台进程使用的目录（例如 `adump`、`bdump` 和 `trace`）上传文件。  您只可以从指定目录上传文件。您不能上传指定目录的子目录中的文件。   | 
|  `p_s3_prefix`  |  VARCHAR2  |  –  |  必需  |  待上传文件的 Amazon S3 文件名前缀。如果前缀为空，则将所有文件上传到指定 Amazon S3 存储桶的最顶层，且不为文件名添加前缀。 例如，如果前缀为 `folder_1/oradb`，则文件上传到 `folder_1`。在这个例子中，`oradb` 前缀添加到每个文件。  | 
|  `p_prefix`  |  VARCHAR2  |  –  |  必需  |  一个文件名前缀，文件名必须与其匹配才会上传。如果前缀为空，则将所有文件上传到指定目录。  | 
|  `p_compression_level`  |  NUMBER  |  `0`   |  optional  |  GZIP 压缩级别。有效值范围为 `0` 至 `9`： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/oracle-s3-integration.using.html)  | 
|  `p_bucket_owner_full_control`  |  VARCHAR2  |  –  |  可选  |  存储桶的访问控制设置。有效值仅为 null 和 `FULL_CONTROL`。仅当您从一个账户（账户 A）将文件上传到另一账户（账户 B）拥有的存储桶，并且账户 B 需要完全控制这些文件时，才需要此设置。  | 

`rdsadmin.rdsadmin_s3_tasks.upload_to_s3` 过程的返回值是任务 ID。

下面的示例将 `DATA_PUMP_DIR` 目录中的所有文件上传到名为 *amzn-s3-demo-bucket* 的 Amazon S3 存储桶。文件不会被压缩。

```
SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3(
      p_bucket_name    =>  'amzn-s3-demo-bucket',
      p_prefix         =>  '', 
      p_s3_prefix      =>  '', 
      p_directory_name =>  'DATA_PUMP_DIR') 
   AS TASK_ID FROM DUAL;
```

下面的示例将 `db` 目录中前缀为 `DATA_PUMP_DIR` 的所有文件上传到名为 `amzn-s3-demo-bucket` 的 Amazon S3 存储桶。Amazon RDS 将最高级别的 GZIP 压缩应用于这些文件。

```
SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3(
      p_bucket_name       =>  'amzn-s3-demo-bucket', 
      p_prefix            =>  'db', 
      p_s3_prefix         =>  '', 
      p_directory_name    =>  'DATA_PUMP_DIR',
      p_compression_level =>  9) 
   AS TASK_ID FROM DUAL;
```

下面的示例将 `DATA_PUMP_DIR` 目录中的所有文件上传到名为 `amzn-s3-demo-bucket` 的 Amazon S3 存储桶。文件上传到 `dbfiles` 文件夹。在此示例中，GZIP 压缩级别为 *1*，这是速度最快的压缩级别。

```
SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3(
      p_bucket_name       =>  'amzn-s3-demo-bucket', 
      p_prefix            =>  '', 
      p_s3_prefix         =>  'dbfiles/', 
      p_directory_name    =>  'DATA_PUMP_DIR',
      p_compression_level =>  1) 
   AS TASK_ID FROM DUAL;
```

下面的示例将 `DATA_PUMP_DIR` 目录中的所有文件上传到名为 `amzn-s3-demo-bucket` 的 Amazon S3 存储桶。文件上传到 `dbfiles` 文件夹，且 `ora` 添加到每个文件名的开头。不应用压缩。

```
SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3(
      p_bucket_name    =>  'amzn-s3-demo-bucket', 
      p_prefix         =>  '', 
      p_s3_prefix      =>  'dbfiles/ora', 
      p_directory_name =>  'DATA_PUMP_DIR') 
   AS TASK_ID FROM DUAL;
```

以下示例假定该命令在账户 A 中运行，但账户 B 需要完全控制存储桶内容。命令 `rdsadmin_s3_tasks.upload_to_s3` 将 `s3bucketOwnedByAccountB` 目录中的所有文件传输到名为 `DATA_PUMP_DIR` 的存储桶。访问控制设置为 `FULL_CONTROL`，以便账户 B 可以访问存储桶中的文件。GZIP 压缩级别为 *6*，它可平衡速度和文件大小。

```
SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3(
      p_bucket_name               =>  's3bucketOwnedByAccountB', 
      p_prefix                    =>  '', 
      p_s3_prefix                 =>  '', 
      p_directory_name            =>  'DATA_PUMP_DIR',
      p_bucket_owner_full_control =>  'FULL_CONTROL',
      p_compression_level         =>  6) 
   AS TASK_ID FROM DUAL;
```

在每个示例中，`SELECT` 语句返回 `VARCHAR2` 数据类型的任务 ID。

您可以通过显示任务的输出文件来查看结果。

```
SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-task-id.log'));
```

将 *`task-id`* 替换为由此过程返回的任务 ID。

**注意**  
任务以异步方式执行。

## 将文件从 Amazon S3 存储桶下载到 Oracle 数据库实例
<a name="oracle-s3-integration.using.download"></a>

要将文件从 Amazon S3 桶下载到 RDS for Oracle 实例，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_s3_tasks.download_from_s3`。

`download_from_s3` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_bucket_name`  |  VARCHAR2  |  –  |  必需  |  要从中下载文件的 Amazon S3 存储桶的名称。  | 
|  `p_directory_name`  |  VARCHAR2  |  –  |  必需  |  要将文件下载到其中的 Oracle 目录对象的名称。该目录可以是用户创建的任何目录对象或 Data Pump 目录，例如 `DATA_PUMP_DIR`。  | 
|  `p_error_on_zero_downloads`  |  VARCHAR2  | FALSE |  可选  |  一个标志，用于确定当 Amazon S3 桶中没有与前缀匹配的对象时，任务是否引发错误。如果此参数未设置或设置为 FALSE（原定设置），则任务会输出一条消息，指出未找到任何对象，但不会引发异常或失败。如果此参数为 TRUE，则任务会引发异常并失败。 可能无法通过匹配测试的前缀规范的示例包括前缀中的空格（如在 `' import/test9.log'` 中）和大小写不匹配（如在 `test9.log` 和 `test9.LOG` 中）。  | 
|  `p_s3_prefix`  |  VARCHAR2  |  –  |  必需  |  一个文件名前缀，文件名必须与其匹配才会下载。使用空前缀将下载指定 Amazon S3 存储桶中的所有顶级文件，但不包括存储桶中文件夹内的文件。 该过程仅从匹配前缀的第一级文件夹下载 Amazon S3 对象。匹配指定前缀的嵌套目录结构不会下载。 例如，假定 Amazon S3 存储桶拥有文件夹结构 `folder_1/folder_2/folder_3`。您可以指定 `'folder_1/folder_2/'` 前缀。在这种情况下，只会下载 `folder_2` 中的文件，不会下载 `folder_1` 或 `folder_3` 中的文件。 如果您改为指定 `'folder_1/folder_2'` 前缀，则将下载 `folder_1` 中与 `'folder_2'` 前缀匹配的所有文件，不下载 `folder_2` 中的文件。  | 
|  `p_decompression_format`  |  VARCHAR2  |  –  |  可选  |  解压缩格式。不解压缩时有效值为 `NONE`；解压缩时有效值为 `GZIP`。  | 

`rdsadmin.rdsadmin_s3_tasks.download_from_s3` 过程的返回值是任务 ID。

下面的示例将名为 `amzn-s3-demo-bucket` 的 Amazon S3 桶中的所有文件下载到 `DATA_PUMP_DIR` 目录。这些文件没有被压缩，因此不会应用解压缩。

```
SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3(
      p_bucket_name    =>  'amzn-s3-demo-bucket',
      p_directory_name =>  'DATA_PUMP_DIR') 
   AS TASK_ID FROM DUAL;
```

下面的示例将名为 `db` 的 Amazon S3 存储桶中前缀为 `amzn-s3-demo-bucket` 的所有文件下载到 `DATA_PUMP_DIR` 目录。这些文件是用 GZIP 压缩的，因此将应用解压缩。参数 `p_error_on_zero_downloads` 开启前缀错误检查，因此，如果前缀与桶中的任何文件都不匹配，则任务会引发异常并失败。

```
SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3(
      p_bucket_name               =>  'amzn-s3-demo-bucket', 
      p_s3_prefix                 =>  'db', 
      p_directory_name            =>  'DATA_PUMP_DIR',
      p_decompression_format      =>  'GZIP',
      p_error_on_zero_downloads   =>  'TRUE') 
   AS TASK_ID FROM DUAL;
```

下面的示例将名为 `myfolder/` 的 Amazon S3 存储桶中的 `amzn-s3-demo-bucket` 文件夹中的所有文件下载到 `DATA_PUMP_DIR` 目录。使用 `p_s3_prefix` 参数来指定 Amazon S3 文件夹。上传的文件使用 GZIP 压缩，但在下载期间不会解压缩。

```
SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3(
      p_bucket_name          =>  'amzn-s3-demo-bucket', 
      p_s3_prefix            =>  'myfolder/', 
      p_directory_name       =>  'DATA_PUMP_DIR',
      p_decompression_format =>  'NONE')
   AS TASK_ID FROM DUAL;
```

以下示例会将名为 `amzn-s3-demo-bucket` 的 Amazon S3 存储桶中的所有文件 `mydumpfile.dmp` 下载到 `DATA_PUMP_DIR` 目录。不应用解压缩。

```
SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3(
      p_bucket_name    =>  'amzn-s3-demo-bucket', 
      p_s3_prefix      =>  'mydumpfile.dmp', 
      p_directory_name =>  'DATA_PUMP_DIR') 
   AS TASK_ID FROM DUAL;
```

在每个示例中，`SELECT` 语句返回 `VARCHAR2` 数据类型的任务 ID。

您可以通过显示任务的输出文件来查看结果。

```
SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-task-id.log'));
```

将 *`task-id`* 替换为由此过程返回的任务 ID。

**注意**  
任务以异步方式执行。  
您可以使用 `UTL_FILE.FREMOVE` Oracle 过程从目录中删除文件。有关更多信息，请参阅 Oracle 文档中的 [FREMOVE 过程](https://docs.oracle.com/database/121/ARPLS/u_file.htm#ARPLS70924)。

## 监控文件传输的状态
<a name="oracle-s3-integration.using.task-status"></a>

文件传输任务开始和结束时会发布 Amazon RDS 事件。事件消息包含文件传输的任务 ID。有关查看事件的信息，请参阅 [查看 Amazon RDS 事件](USER_ListEvents.md)。

您可以查看 bdump 文件中的持续任务的状态。bdump 文件位于 `/rdsdbdata/log/trace` 目录下。每个 bdump 文件名称格式如下。

```
dbtask-task-id.log
```

将 `task-id` 替换为您想要监控的任务的 ID。

**注意**  
任务以异步方式执行。

您可以使用 `rdsadmin.rds_file_util.read_text_file` 存储过程查看 bdump 文件的内容。例如，以下查询将返回 `dbtask-1234567890123-1234.log` bdump 文件的内容。

```
SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-1234567890123-1234.log'));
```

以下示例显示传输失败的日志文件。

```
TASK_ID                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1234567890123-1234


TEXT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2023-04-17 18:21:33.993 UTC [INFO ] File #1: Uploading the file /rdsdbdata/datapump/A123B4CDEF567890G1234567890H1234/sample.dmp to Amazon S3 with bucket name amzn-s3-demo-bucket and key sample.dmp.
2023-04-17 18:21:34.188 UTC [ERROR] RDS doesn't have permission to write to Amazon S3 bucket name amzn-s3-demo-bucket and key sample.dmp.
2023-04-17 18:21:34.189 UTC [INFO ] The task failed.
```

## 排查 Amazon S3 集成问题
<a name="oracle-s3-integration.troubleshooting"></a>

有关问题排查提示，请参阅 AWS re:Post 文章[如何排查将 Amazon RDS for Oracle 与 Amazon S3 集成时出现的问题？](https://repost.aws/en/knowledge-center/rds-oracle-s3-integration)。

# 删除 Amazon S3 集成选项
<a name="oracle-s3-integration.removing"></a>

您可以从数据库实例中删除 Amazon S3 集成选项。

要从数据库实例中删除 Amazon S3 集成选项，请执行下列操作之一：
+ 要从多个数据库实例中删除 Amazon S3 集成选项，请从数据库实例所属的选项组中删除 `S3_INTEGRATION` 选项。此更改会影响使用该选项组的所有数据库实例。有关更多信息，请参阅 [从选项组中删除选项](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.RemoveOption)。

   
+ 要从单个数据库实例中删除 Amazon S3 集成选项，请修改该实例，并指定不包含 `S3_INTEGRATION` 选项的另一个选项组。您可以指定默认（空）选项组，或指定其他自定义选项组。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

# Oracle Application Express (APEX)
<a name="Appendix.Oracle.Options.APEX"></a>

Amazon RDS 通过使用 `APEX` 和 `APEX-DEV` 选项支持 Oracle Application Express (APEX)。您可以将 Oracle APEX 部署为运行时环境或基于 Web 的应用程序的完整开发环境。使用 Oracle APEX，您可完全在 Web 浏览器内构建应用程序。有关更多信息，请参阅 Oracle 文档中的 [Oracle Application Express](https://apex.oracle.com/)。

**Topics**
+ [Oracle APEX 组件](#Appendix.Oracle.Options.APEX.components)
+ [要求和限制](Appendix.Oracle.Options.APEX.Requirements.md)
+ [设置 Oracle APEX 和 Oracle Rest Data Services（ORDS）](Appendix.Oracle.Options.APEX.settingUp.md)
+ [配置 Oracle Rest Data Services（ORDS）](Appendix.Oracle.Options.APEX.ORDSConf.md)
+ [升级和移除 Oracle APEX](Appendix.Oracle.Options.APEX.UpgradeandRemove.md)

## Oracle APEX 组件
<a name="Appendix.Oracle.Options.APEX.components"></a>

Oracle APEX 包含以下主要组件：
+ 存储 Oracle APEX 应用程序和组件元数据的*存储库*。该存储库包含安装在 Amazon RDS 数据库实例内的表、索引和其他对象。
+ 管理与 Oracle APEX 客户端的 HTTP 通信的*侦听器*。侦听器位于单独的主机上，例如 Amazon EC2 实例、公司的本地服务器或您的台式计算机。该侦听器接受来自 Web 浏览器的传入连接并将这些连接转发至 Amazon RDS 数据库实例进行处理，然后将来自存储库的结果发送回浏览器。

  RDS for Oracle 支持以下类型的侦听器：
  + 对于 Oracle APEX 版本 5.0 和更高版本，请使用 Oracle REST Data Services（ORDS）19.1 和更高版本。建议您使用支持的最新版本 Oracle APEX 和 ORDS。本文档仅出于向后兼容的目的介绍旧版本。
  + 对于 Oracle APEX 版本 4.1.1，可以使用 Oracle APEX Listener 版本 1.1.4。
  + 您可以使用 Oracle HTTP Server 和`mod_plsql`侦听器。
**注意**  
Amazon RDS 不支持将嵌入式 PL/SQL 网关作为 Oracle APEX 侦听器的 Oracle XML DB HTTP 服务器。对于在 Internet 上运行的应用程序而言，Oracle 一般不建议使用嵌入 PL/SQL 网关。

  有关这些侦听器类型的更多信息，请参阅 Oracle 文档中的[关于选择 Web 侦听器](https://docs.oracle.com/database/apex-5.1/HTMIG/choosing-web-listener.htm#HTMIG29321)。

将 `APEX` 或 `APEX-DEV` 选项添加到 RDS for Oracle 数据库实例时，Amazon RDS 仅安装 Oracle APEX 存储库。将您的侦听器安装在单独的主机上。

# 要求和限制
<a name="Appendix.Oracle.Options.APEX.Requirements"></a>

以下主题列出了 Oracle APEX 和 ORDS 的要求和限制。

## Oracle APEX 版本要求
<a name="Appendix.Oracle.Options.APEX.versions"></a>

`APEX` 选项将数据库实例类中的存储用于数据库实例。下面是支持的 Oracle APEX 版本和大致的存储要求。


****  

| Oracle APEX 版本 | 存储需求 | 支持的 Oracle 数据库版本 | 备注 | 
| --- | --- | --- | --- | 
|  Oracle APEX 版本 24.2.v1  |  114 MiB  |  全部  |  此版本包括补丁 37885097：PSE BUNDLE FOR APEX 24.2（PSES ON TOP OF 24.2.0）、PATCH\$1VERSION 4。  | 
|  Oracle APEX 版本 24.1.v1  |  112 MiB  |  全部  |  此版本包括补丁 36695709：PSE BUNDLE FOR APEX 24.1（PSES ON TOP OF 24.1.0）、PATCH\$1VERSION 3。如果您需要在 EC2 实例上安装完全相同的 APEX 映像版本，请下载补丁 37544819：24.1.3 PSE BUNDLE FOR APEX 24.1（PSES ON TOP OF 24.1.0）。  | 
|  Oracle APEX 版本 23.2.v1  |  110 MiB  |  全部  |  此版本包括补丁 35895964：PSE BUNDLE FOR APEX 23.2（PSES ON TOP OF 23.2.0）、PATCH\$1VERSION 6。如果您需要在 EC2 实例上安装完全相同的 APEX 映像版本，请下载补丁 37593125：23.2.6 PSE BUNDLE FOR APEX 23.2（PSES ON TOP OF 23.2.0）。  | 
|  Oracle APEX 版本 23.1.v1  |  106 MiB  |  全部  |  此版本包括补丁 35283657：PSE BUNDLE FOR APEX 23.1（PSES ON TOP OF 23.1.0）、PATCH\$1VERSION 2。  | 
|  Oracle APEX 版本 22.2.v1  |  106MiB  |  全部  |  此版本包括补丁 34628174：PSE BUNDLE FOR APEX 22.2（PSES ON TOP OF 22.2.0）、PATCH\$1VERSION 4。  | 
|  Oracle APEX 版本 22.1.v1  |  124MiB  |  全部  |  此版本包括补丁 34020981：PSE BUNDLE FOR APEX 22.1（PSES ON TOP OF 22.1.0）、PATCH\$1VERSION 6。  | 
|  Oracle APEX 版本 21.2.v1  |  125 MiB  |  全部  |  此版本包括补丁 33420059：PSE BUNDLE FOR APEX 21.2（PSES ON TOP OF 21.2.0）、PATCH\$1VERSION 8。  | 
|  Oracle APEX 版本 21.1.v1  |  125 MiB  |  全部  |  此版本包括补丁 32598392：PSE BUNDLE FOR APEX 21.1、PATCH\$1VERSION 3。  | 
|  Oracle APEX 版本 20.2.v1  |  148 MiB  |  全部，但 Oracle Database 21c 除外  |  此版本包括补丁 32006852：PSE BUNDLE FOR APEX 20.2、PATCH\$1VERSION 2020.11.12。您可以通过运行以下查询来查看补丁编号和日期： <pre>SELECT PATCH_VERSION, PATCH_NUMBER <br />FROM   APEX_PATCHES;</pre>  | 
|  Oracle APEX 版本 20.1.v1  |  173 MiB  |  全部，但 Oracle Database 21c 除外  |  此版本包括补丁 30990551：PSE BUNDLE FOR APEX 20.1、PATCH\$1VERSION 2020.07.15。  | 
|  Oracle APEX 版本 19.2.v1  |  149 MiB  |  全部，但 Oracle Database 21c 除外  |  | 
|  Oracle APEX 版本 19.1.v1  |  148 MiB  |  全部，但 Oracle Database 21c 除外  |  | 

有关可下载的 Oracle APEX .zip 文件，请参阅 Oracle 网站上的 [Oracle APEX Prior Release Archives](https://www.oracle.com/tools/downloads/apex-all-archives-downloads.html)。

## Oracle APEX 和 ORDS 的先决条件
<a name="Appendix.Oracle.Options.APEX.PreReqs"></a>

请注意使用 Oracle APEX 和 ORDS 的以下先决条件：
+ 系统必须使用 Java 运行时环境（JRE）。
+ 您的 Oracle 客户端安装必须包括以下内容：
  + 用于执行管理任务的 SQL\$1Plus 或 SQL Developer
  + 用于配置与 RDS for Oracle 数据库实例的连接的 Oracle Net Services

## Oracle APEX 限制
<a name="Appendix.Oracle.Options.APEX.limitations"></a>

您无法修改 `APEX_version` 用户账户，该账户由 Amazon RDS 管理。因此，您不能对该用户应用数据库配置文件或强制执行密码规则。`APEX_version` 的配置文件和密码设置由 Oracle 和 AWS 预定义，旨在满足 Amazon RDS 的安全要求。

# 设置 Oracle APEX 和 Oracle Rest Data Services（ORDS）
<a name="Appendix.Oracle.Options.APEX.settingUp"></a>

以下主题列出了设置 Oracle APEX 和 ORDS 所需的步骤

**Topics**
+ [将 APEX 和 APEX-DEV 选项添加到数据库实例](#Appendix.Oracle.Options.APEX.Add)
+ [解锁数据库实例上的公有用户账户](#Appendix.Oracle.Options.APEX.PublicUser)
+ [为 Oracle APEX 配置 RESTful 服务](#Appendix.Oracle.Options.APEX.ConfigureRESTful)
+ [准备好在单独的主机上安装 ORDS](#Appendix.Oracle.Options.APEX.ORDS.ords-setup)
+ [设置 Oracle APEX Listener](#Appendix.Oracle.Options.APEX.Listener)

## 将 APEX 和 APEX-DEV 选项添加到数据库实例
<a name="Appendix.Oracle.Options.APEX.Add"></a>

要将 `APEX` 和 `APEX-DEV` 选项添加到 RDS for Oracle 数据库实例，请执行以下操作：

1. 创建新的选项组，或者复制或修改现有选项组。

1. 将 `APEX` 和 `APEX-DEV` 选项添加到该选项组。

1. 将选项组与数据库实例相关联。

如果添加 `APEX` 和 `APEX-DEV` 选项，则在数据库实例自动重新启动时会出现短暂中断。

**注意**  
安装 `APEX` 选项时，`APEX_MAIL` 可用。`APEX_MAIL` 包的执行权限授予 `PUBLIC`，因此您不需要 APEX 管理账户即可使用它。

**将 APEX 和 APEX-DEV 选项添加到数据库实例**

1. 确定您要使用的选项组。您可以创建新的选项组，或使用现有选项组。如果您想使用现有选项组，请跳到下一步。或者，通过以下设置创建自定义数据库选项组：

   1. 对于 **Engine**，请选择要使用的 Oracle 版本。所有版本均支持 `APEX` 和 `APEX-DEV` 选项。

   1. 对于**主引擎版本**，选择数据库实例的版本。

   有关更多信息，请参阅“[创建选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)”。

1. 将选项添加到该选项组。如果您只希望部署 Oracle APEX 运行时环境，则仅添加 `APEX` 选项。要部署完整开发环境，则同时添加 `APEX` 和 `APEX-DEV` 选项。

   对于**版本**，选择要使用的 Oracle APEX 版本。
**重要**  
如果向已经附加到一个或多个数据库实例的现有选项组添加 `APEX` 或 `APEX-DEV` 选项，则会发生短暂中断。在此中断期间，将自动重新启动所有数据库实例。

   有关添加选项的更多信息，请参阅 [将选项添加到选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption)。

1. 将选项组应用到新的或现有的数据库实例：
   + 对于新数据库实例，您可以在启动实例时应用选项组。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。
   + 对于现有数据库实例，您可以通过修改实例并附加新的选项组来应用选项组。如果您将 `APEX` 和 `APEX-DEV` 选项添加到现有数据库实例，则在数据库实例自动重新启动时会出现短暂中断。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

## 解锁数据库实例上的公有用户账户
<a name="Appendix.Oracle.Options.APEX.PublicUser"></a>

在数据库实例上安装 `APEX` 或 `APEX-DEV` 选项后，请确保执行以下操作：

1. 更改 `APEX_PUBLIC_USER` 账户的密码。

1. 解锁此账户。

您可以使用 Oracle SQL\$1Plus 命令行实用程序执行该操作。以主用户身份连接到数据库实例，并发出以下命令。使用所选密码替换 `new_password`。

```
1. ALTER USER APEX_PUBLIC_USER IDENTIFIED BY new_password;
2. ALTER USER APEX_PUBLIC_USER ACCOUNT UNLOCK;
```

## 为 Oracle APEX 配置 RESTful 服务
<a name="Appendix.Oracle.Options.APEX.ConfigureRESTful"></a>

要在 Oracle APEX 中配置 RESTful 服务（对 Oracle APEX 4.1.1.V1 不需要），请使用 SQL\$1Plus 以主用户的身份连接到数据库实例。执行此操作后，运行 `rdsadmin.rdsadmin_run_apex_rest_config` 存储过程。当您运行该存储过程时，请为以下用户提供密码：
+ `APEX_LISTENER`
+ `APEX_REST_PUBLIC_USER`

该存储过程运行 `apex_rest_config.sql` 脚本，从而为这些用户创建新的数据库账户。

**注意**  
Oracle APEX 版本 4.1.1.v1 无需配置。仅对于此 Oracle APEX 版本，您不需要运行该存储过程。

以下命令运行该存储过程。

```
1. EXEC rdsadmin.rdsadmin_run_apex_rest_config('apex_listener_password', 'apex_rest_public_user_password');
```

## 准备好在单独的主机上安装 ORDS
<a name="Appendix.Oracle.Options.APEX.ORDS.ords-setup"></a>

将 ORDS 安装在单独的主机上，例如 Amazon EC2 实例、公司的本地服务器或您的台式计算机。本节中的示例假设您的主机运行 Linux 且名为 `myapexhost.example.com`。

在安装 ORDS 之前，您需要创建非特权操作系统用户，然后下载并解压缩 Oracle APEX 安装文件。

**为安装 ORDS 做准备**

1. 以 `myapexhost.example.com` 身份登录到 `root`。

1. 创建一个非特权操作系统用户以控制侦听器安装。以下命令会创建一个名为 *apexuser* 的新用户。

   ```
   useradd -d /home/apexuser apexuser
   ```

   以下命令会为新用户分配密码。

   ```
   passwd apexuser;
   ```

1. 以 `apexuser` 身份登录 `myapexhost.example.com`，并从 Oracle 将 Oracle APEX 安装文件下载到您的 `/home/apexuser` 目录：
   + [http://www.oracle.com/technetwork/developer-tools/apex/downloads/index.html](http://www.oracle.com/technetwork/developer-tools/apex/downloads/index.html) 
   + [Oracle Application Express 早期版本存档](http://www.oracle.com/technetwork/developer-tools/apex/downloads/all-archives-099381.html) 

1. 在 `/home/apexuser` 目录中解压缩该文件。

   ```
   unzip apex_version.zip
   ```

   在解压缩该文件后，`apex` 目录中会有一个 `/home/apexuser` 目录。

1. 在您仍以 `myapexhost.example.com` 身份登录 `apexuser` 时，从 Oracle 网站将 Oracle REST Data Services 文件下载到您的 `/home/apexuser` 目录：[http://www.oracle.com/technetwork/developer-tools/apex-listener/downloads/index.html](http://www.oracle.com/technetwork/developer-tools/apex-listener/downloads/index.html)

## 设置 Oracle APEX Listener
<a name="Appendix.Oracle.Options.APEX.Listener"></a>

**注意**  
Oracle APEX Listener 已被弃用。

Amazon RDS for Oracle 继续支持 Oracle APEX 版本 4.1.1 和 Oracle APEX Listener 版本 1.1.4。建议您使用支持的最新版本 Oracle APEX 和 ORDS。

将 Oracle APEX Listener 安装到独立的主机上，例如 Amazon EC2 实例、您公司的本地服务器或您的台式计算机上。假设您的主机名称为 `myapexhost.example.com` 且运行 Linux。

### 为安装 Oracle APEX Listener 做准备
<a name="Appendix.Oracle.Options.APEX.Listener.preparing"></a>

在安装 Oracle APEX Listener 之前，您需要创建非特权操作系统用户，然后下载并解压缩 Oracle APEX 安装文件。

**为安装 Oracle APEX Listener 做准备**

1. 以 `myapexhost.example.com` 身份登录到 `root`。

1. 创建一个非特权操作系统用户以控制侦听器安装。以下命令会创建一个名为 *apexuser* 的新用户。

   ```
   useradd -d /home/apexuser apexuser
   ```

   以下命令会为新用户分配密码。

   ```
   passwd apexuser;
   ```

1. 以 `apexuser` 身份登录 `myapexhost.example.com`，并从 Oracle 将 Oracle APEX 安装文件下载到您的 `/home/apexuser` 目录：
   + [http://www.oracle.com/technetwork/developer-tools/apex/downloads/index.html](http://www.oracle.com/technetwork/developer-tools/apex/downloads/index.html) 
   + [Oracle Application Express 早期版本存档](http://www.oracle.com/technetwork/developer-tools/apex/downloads/all-archives-099381.html) 

1. 在 `/home/apexuser` 目录中解压缩该文件。

   ```
   unzip apex_<version>.zip                
   ```

   在解压缩该文件后，`apex` 目录中会有一个 `/home/apexuser` 目录。

1. 当您仍以 `myapexhost.example.com` 身份登录 `apexuser` 时，从 Oracle 网站将 Oracle APEX Listener 文件下载到您的 `/home/apexuser` 目录。

#### 安装和配置 Oracle APEX Listener
<a name="Appendix.Oracle.Options.APEX.Listener.installing"></a>

在使用 Oracle APEX 之前，您需要下载 `apex.war` 文件，使用 Java 安装 Oracle APEX Listener，然后启动侦听器。

**安装和配置 Oracle APEX Listener**

1. 创建一个基于 Oracle APEX Listener 的新目录并打开侦听器文件。

   运行以下代码：

   ```
   mkdir /home/apexuser/apexlistener
   cd /home/apexuser/apexlistener 
   unzip ../apex_listener.version.zip
   ```

1. 运行以下代码。

   ```
   java -Dapex.home=./apex -Dapex.images=/home/apexuser/apex/images -Dapex.erase -jar ./apex.war
   ```

1. 输入该程序提示的以下信息：
   + APEX Listener Administrator 用户名。默认值为 *adminlistener*。
   + APEX Listener Administrator 密码。
   + APEX Listener Manager 用户名。默认值为 *managerlistener*。
   + APEX Listener Administrator 密码。

   该程序将输出完成配置所需的 URL，如下所示。

   ```
   INFO: Please complete configuration at: http://localhost:8080/apex/listenerConfigure
   Database is not yet configured
   ```

1. 让 Oracle APEX Listener 保持运行，以便您可以使用 Oracle Application Express。完成此配置过程后，可在后台运行侦听器。

1. 从 Web 浏览器中转到 Oracle APEX Listener 程序提供的 URL。显示 Oracle Application Express Listener 管理窗口。输入以下信息：
   + **用户名** – `APEX_PUBLIC_USER`
   + **密码** – *APEX\$1PUBLIC\$1USER* 的密码。这是您先前配置 Oracle APEX 存储库时指定的密码。有关更多信息，请参阅 [解锁数据库实例上的公有用户账户](#Appendix.Oracle.Options.APEX.PublicUser)。
   + **连接类型** – 基本 
   + **主机名** – 您的 Amazon RDS 数据库实例的端点，例如 `mydb.f9rbfa893tft.us-east-1.rds.amazonaws.com`。
   + **端口** – 1521
   + **SID** – Amazon RDS 实例上的数据库名称，例如，`mydb`​。

1. 选择 **Apply**。此时会显示 Oracle APEX 管理窗口。

1. 为 Oracle APEX `admin` 用户设置密码。为此，请使用 SQL\$1Plus 以主用户身份连接到数据库实例，然后运行以下命令。

   ```
   1. EXEC rdsadmin.rdsadmin_util.grant_apex_admin_role;
   2. grant APEX_ADMINISTRATOR_ROLE to master;
   3. @/home/apexuser/apex/apxchpwd.sql
   ```

   使用主用户名替换 `master`。在 `apxchpwd.sql` 脚本提示您时，输入新的 `admin` 密码。

1. 返回浏览器中的 Oracle APEX 管理窗口，然后选择**管理**。接下来选择 **Application Express Internal Administration**。在提示您输入凭证时，请输入以下信息：
   + **用户名** – `admin` 
   + **密码** – 使用 `apxchpwd.sql` 脚本设置的密码 

   选择 **Login**，然后设置 `admin` 用户的新密码。

您的侦听器现在已可以使用。

# 配置 Oracle Rest Data Services（ORDS）
<a name="Appendix.Oracle.Options.APEX.ORDSConf"></a>

以下主题列出了 ORDS 21 和 22 的配置选项：

**Topics**
+ [安装并配置 ORDS 21 及更低版本](#Appendix.Oracle.Options.APEX.ORDS)
+ [安装和配置 ORDS 22 及更高版本](#Appendix.Oracle.Options.APEX.ORDS22)

## 安装并配置 ORDS 21 及更低版本
<a name="Appendix.Oracle.Options.APEX.ORDS"></a>

现在一切就绪，可以安装和配置用于 Oracle APEX 的 Oracle Rest Data Services (ORDS) 了。对于 Oracle APEX 版本 5.0 及更高版本，请使用 ORDS 版本 19.1 到 21。要了解如何安装 ORDS 22 及更高版本，请参阅[安装和配置 ORDS 22 及更高版本](#Appendix.Oracle.Options.APEX.ORDS22)。

将侦听器安装在单独的主机上，例如 Amazon EC2 实例、公司的本地服务器或您的台式计算机。对于本节中的示例，我们假定您的主机的名称为 `myapexhost.example.com`，并且您的主机运行的是 Linux。

**安装并配置 ORDS 21 及更低版本以与 Oracle APEX 结合使用**

1. 转至 [Oracle REST Data Services](https://www.oracle.com/database/technologies/appdev/rest-data-services-downloads-212.html)，查看自述文件。确保安装了所需的 Java 版本。

1. 为 ORDS 安装创建一个新目录。

   ```
   mkdir /home/apexuser/ORDS
   cd /home/apexuser/ORDS
   ```

1. 从 [Oracle REST data services](https://www.oracle.com/database/technologies/appdev/rest-data-services-downloads-212.html) 下载文件 `ords.version.number.zip`。

1. 将该文件解压缩到 `/home/apexuser/ORDS` 目录中。

1. 如果要将 ORDS 安装到多租户数据库中，请将如下命令行添加到文件 `/home/apexuser/ORDS/params/ords_params.properties`：

   ```
   pdb.disable.lockdown=false
   ```

1. 为主用户授予所需的权限以安装 ORDS。

   在安装 Oracle APEX 的选项后，为主用户提供所需的权限以安装 ORDS 架构。您可以连接到数据库并运行以下命令以完成该操作。将 `MASTER_USER` 替换为主用户的大写名称。
**重要**  
输入用户名时，除非您使用区分大小写的标识符创建了用户，否则请使用大写字母。例如，如果您运行 `CREATE USER myuser` 或 `CREATE USER MYUSER`，则数据字典将存储 `MYUSER`。但是，如果您在 `CREATE USER "MyUser"` 中使用双引号，则数据字典将存储 `MyUser`。有关更多信息，请参阅“[向 SYS 对象授予 SELECT 或 EXECUTE 权限](Appendix.Oracle.CommonDBATasks.TransferPrivileges.md)”。

   ```
   exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_OBJECTS', 'MASTER_USER', 'SELECT', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_ROLE_PRIVS', 'MASTER_USER', 'SELECT', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_TAB_COLUMNS', 'MASTER_USER', 'SELECT', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('USER_CONS_COLUMNS', 'MASTER_USER', 'SELECT', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('USER_CONSTRAINTS', 'MASTER_USER', 'SELECT', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('USER_OBJECTS', 'MASTER_USER', 'SELECT', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('USER_PROCEDURES', 'MASTER_USER', 'SELECT', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('USER_TAB_COLUMNS', 'MASTER_USER', 'SELECT', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('USER_TABLES', 'MASTER_USER', 'SELECT', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('USER_VIEWS', 'MASTER_USER', 'SELECT', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('WPIUTL', 'MASTER_USER', 'EXECUTE', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('DBMS_SESSION', 'MASTER_USER', 'EXECUTE', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('DBMS_UTILITY', 'MASTER_USER', 'EXECUTE', true);
   ```
**注意**  
这些命令适用于 ORDS 版本 19.1 和更高版本。

1. 使用下载的 ords.war 文件安装 ORDS 架构。

   ```
   java -jar ords.war install advanced
   ```

   程序会提示您输入以下信息。括号中为默认值。有关更多信息，请参阅 Oracle 文档中的 [Oracle REST Data Services 简介](https://docs.oracle.com/en/database/oracle/oracle-rest-data-services/20.2/aelig/installing-REST-data-services.html#GUID-6F7B4E61-B730-4E73-80B8-F53299123730)。
   + 输入用于存储配置数据的位置：

     输入 */apexuser/ORDS*。这是 ORDS 配置文件的位置。
   + 指定要使用的数据库连接类型。输入 [1] 基本 [2] TNS [3] 自定义 URL [1] 的编号：

     选择所需的连接类型。
   + 输入数据库服务器 [localhost] 的名称：*DB\$1instance\$1endpoint*

     选择默认值或输入正确的值。
   + 输入数据库侦听器端口 [1521]：*DB\$1instance\$1port*

     选择默认值或输入正确的值。
   + 输入 1 以指定数据库服务名称，或输入 2 以指定数据库 SID [1]：

     选择 `2` 以指定数据库 SID。
   + 数据库 SID [xe]

     选择默认值或输入正确的值。
   + 如果要验证/安装 Oracle REST Data Services 架构，请输入 1，或输入 2 以跳过此步骤 [1]：

     选择 `1`。此步骤将创建名为 ORDS\$1PUB\$1USER 的 Oracle REST Data Services 代理用户。
   + 输入 ORDS\$1PUBLIC\$1USER 的数据库密码：

     输入密码，然后确认。
   + 要求使用管理员权限登录以验证 Oracle REST Data Services 架构。

     输入管理员用户名：*master\$1user*

     输入 *master\$1user* 的数据库密码：*master\$1user\$1password*

     确认该密码：*master\$1user\$1password*
**注意**  
作为安全最佳实践，请指定除此处所示提示以外的密码。
   + 输入 ORDS\$1METADATA [SYSAUX] 的默认表空间。

     输入 ORDS\$1METADATA [TEMP] 的临时表空间。

     输入 ORDS\$1PUBLIC\$1USER [USERS] 的默认表空间。

     输入 ORDS\$1PUBLIC\$1USER [TEMP] 的临时表空间。
   + 如果要使用 PL/SQL 网关，请输入 1，或者输入 2 以跳过该步骤。如果使用 Oracle Application Express 或从 mod\$1plsql 迁移，您必须输入 1 [1]。

     选择默认值。
   + 输入 PL/SQL 网关数据库用户名 [APEX\$1PUBLIC\$1USER]

     选择默认值。
   + 输入 APEX\$1PUBLIC\$1USER 的数据库密码：

     输入密码，然后确认。
   + 输入 1 以指定 Application Express RESTful Services 数据库用户（APEX\$1LISTENER、APEX\$1REST\$1PUBLIC\$1USER）的密码，或输入 2 以跳过此步骤 [1]：

     为 APEX 4.1.1.V1 选择 `2`；为所有其他 APEX 版本选择 `1`。
   + [对于 APEX 4.1.1.v1 不需要] APEX\$1LISTENER 的数据库密码

     输入密码（如果需要），然后确认。
   + [对于 APEX 4.1.1.v1 不需要] APEX\$1REST\$1PUBLIC\$1USER 的数据库密码

     输入密码（如果需要），然后确认。
   + 输入一个数字以选择要启用的特征：

     输入 `1` 以启用所有特征：SQL 开发人员 Web、启用 REST 的 SQL 和数据库 API。
   + 如果您希望在独立模式下启动，请输入 1；或输入 2 退出 [1]：

     输入 `1`。
   + 输入 APEX 静态资源位置：

     如果已将 APEX 安装文件解压缩到 `/home/apexuser` 中，请输入 `/home/apexuser/apex/images`。否则，请输入 `unzip_path/apex/images`，其中 *unzip\$1path* 是解压缩文件的目录。
   + 如果使用 HTTP，则输入 1；如果使用 HTTPS，则输入 2 [1]：

     如果您输入 `1`，请指定 HTTP 端口。如果您输入 `2`，请指定 HTTPS 端口和 SSL 主机名。HTTPS 选项提示您指定提供证书的方式：
     + 输入 `1` 以使用自签名证书。
     + 输入 `2` 以提供您自己的证书。如果输入 `2`，请指定 SSL 证书的路径和 SSL 证书私有密钥的路径。

1. 为 APEX `admin` 用户设置密码。为此，请使用 SQL\$1Plus 以主用户身份连接到数据库实例，然后运行以下命令。

   ```
   1. EXEC rdsadmin.rdsadmin_util.grant_apex_admin_role;
   2. grant APEX_ADMINISTRATOR_ROLE to master;
   3. @/home/apexuser/apex/apxchpwd.sql
   ```

   使用主用户名替换 `master`。在 `apxchpwd.sql` 脚本提示您时，输入新的 `admin` 密码。

1. 启动 ORDS 侦听器。运行以下代码。

   ```
   java -jar ords.war
   ```

   首次启动 ORDS 时，系统会提示您提供 APEX 静态资源的位置。此映像文件夹位于 APEX 安装目录下的 `/apex/images` 目录中。

1. 返回浏览器中的 Oracle APEX 管理窗口，然后选择**管理**。接下来选择 **Application Express Internal Administration**。在提示您输入凭证时，请输入以下信息：
   + **用户名** – `admin` 
   + **密码** – 使用 `apxchpwd.sql` 脚本设置的密码 

   选择 **Login**，然后设置 `admin` 用户的新密码。

您的侦听器现在已可以使用。

## 安装和配置 ORDS 22 及更高版本
<a name="Appendix.Oracle.Options.APEX.ORDS22"></a>

现在一切就绪，可以安装和配置用于 Oracle APEX 的 Oracle Rest Data Services (ORDS) 了。对于本节中的示例，我们假定单独主机的名称为 `myapexhost.example.com`，并且主机运行的是 Linux。ORDS 22 的说明与先前版本的说明不同。

**安装并配置 ORDS 22 及更高版本以与 Oracle APEX 结合使用**

1. 转至 [Oracle REST Data Services](http://www.oracle.com/technetwork/developer-tools/rest-data-services/downloads/index.html)，查看您计划下载的 ORDS 版本的自述文件。确保安装了所需的 Java 版本。

1. 为 ORDS 安装创建一个新目录。

   ```
   mkdir /home/apexuser/ORDS
   cd /home/apexuser/ORDS
   ```

1. 从 [Oracle REST Data Services](http://www.oracle.com/technetwork/developer-tools/rest-data-services/downloads/index.html) 下载文件 `ords.version.number.zip` 或 `ords-latest.zip`。

1. 将该文件解压缩到 `/home/apexuser/ORDS` 目录中。

1. 为主用户授予所需的权限以安装 ORDS。

   在安装 `APEX` 选项后，为主用户提供所需的权限以安装 ORDS 架构。您可以登录到数据库并运行以下命令来完成该操作。将 `MASTER_USER` 替换为主用户的大写名称。
**重要**  
输入用户名时，除非您使用区分大小写的标识符创建了用户，否则请使用大写字母。例如，如果您运行 `CREATE USER myuser` 或 `CREATE USER MYUSER`，则数据字典将存储 `MYUSER`。但是，如果您在 `CREATE USER "MyUser"` 中使用双引号，则数据字典将存储 `MyUser`。有关更多信息，请参阅 [向 SYS 对象授予 SELECT 或 EXECUTE 权限](Appendix.Oracle.CommonDBATasks.TransferPrivileges.md)。

   ```
   exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_OBJECTS', 'MASTER_USER', 'SELECT', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_ROLE_PRIVS', 'MASTER_USER', 'SELECT', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_TAB_COLUMNS', 'MASTER_USER', 'SELECT', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('USER_CONS_COLUMNS', 'MASTER_USER', 'SELECT', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('USER_CONSTRAINTS', 'MASTER_USER', 'SELECT', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('USER_OBJECTS', 'MASTER_USER', 'SELECT', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('USER_PROCEDURES', 'MASTER_USER', 'SELECT', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('USER_TAB_COLUMNS', 'MASTER_USER', 'SELECT', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('USER_TABLES', 'MASTER_USER', 'SELECT', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('USER_VIEWS', 'MASTER_USER', 'SELECT', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('WPIUTL', 'MASTER_USER', 'EXECUTE', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('DBMS_SESSION', 'MASTER_USER', 'EXECUTE', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('DBMS_UTILITY', 'MASTER_USER', 'EXECUTE', true);
   
   exec rdsadmin.rdsadmin_util.grant_sys_object('DBMS_LOB', 'MASTER_USER', 'EXECUTE', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('DBMS_ASSERT', 'MASTER_USER', 'EXECUTE', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('DBMS_OUTPUT', 'MASTER_USER', 'EXECUTE', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('DBMS_SCHEDULER', 'MASTER_USER', 'EXECUTE', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('HTP', 'MASTER_USER', 'EXECUTE', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('OWA', 'MASTER_USER', 'EXECUTE', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('WPG_DOCLOAD', 'MASTER_USER', 'EXECUTE', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('DBMS_CRYPTO', 'MASTER_USER', 'EXECUTE', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('DBMS_METADATA', 'MASTER_USER', 'EXECUTE', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('DBMS_SQL', 'MASTER_USER', 'EXECUTE', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('UTL_SMTP', 'MASTER_USER', 'EXECUTE', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('DBMS_NETWORK_ACL_ADMIN', 'MASTER_USER', 'EXECUTE', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('SESSION_PRIVS', 'MASTER_USER', 'SELECT', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_USERS', 'MASTER_USER', 'SELECT', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_NETWORK_ACL_PRIVILEGES', 'MASTER_USER', 'SELECT', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_NETWORK_ACLS', 'MASTER_USER', 'SELECT', true);
   exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_REGISTRY', 'MASTER_USER', 'SELECT', true);
   ```
**注意**  
上述命令适用于 ORDS 22 及更高版本。

1. 使用下载的 `ords` 脚本安装 ORDS 架构。指定要包含配置文件和日志文件的目录。Oracle Corporation 建议不要将这些目录放在包含 ORDS 产品软件的目录中。

   ```
   mkdir -p /home/apexuser/ords_config /home/apexuser/ords_logs
   
   /home/apexuser/ORDS/bin/ords \
     --config /home/apexuser/ords_config \
     install --interactive --log-folder /home/apexuser/ords_logs
   ```

   对于运行容器数据库（CDB）架构的数据库实例，请使用 ORDS 23.3 及更高版本，并在安装 ORDS 时传递 `--pdb-skip-disable-lockdown` 参数。

   ```
   /home/apexuser/ORDS/bin/ords \
     --config /home/apexuser/ords_config \
     install --interactive --log-folder /home/apexuser/ords_logs --pdb-skip-disable-lockdown
   ```

   程序会提示您输入以下信息。括号中为默认值。有关更多信息，请参阅 Oracle 文档中的 [Oracle REST Data Services 简介](https://docs.oracle.com/en/database/oracle/oracle-rest-data-services/20.2/aelig/installing-REST-data-services.html#GUID-6F7B4E61-B730-4E73-80B8-F53299123730)。
   + `Choose the type of installation:`

     选择 **2** 可在数据库中安装 ORDS 架构，并在本地 ORDS 配置文件中创建数据库连接池。
   + `Specify the database connection type to use. Enter number for [1] Basic [2] TNS [3] Custom URL:`

     选择所需的连接类型。此示例假设您选择 **1**。
   + `Enter the name of the database server [localhost]:` ***DB\$1instance\$1endpoint***

     选择默认值或输入正确的值。
   + `Enter the database listener port [1521]:` ***DB\$1instance\$1port***

     选择默认值 **1521** 或输入正确的值。
   + `Enter the database service name [orcl]:`

     输入 RDS for Oracle 数据库实例所使用的数据库名称。
   + `Provide database user name with administrator privileges`

      输入 RDS for Oracle 数据库实例的主用户名。
   + `Enter the database password for [username]:`

     输入 RDS for Oracle 数据库实例的主用户密码。
   + `Enter the default tablespace for ORDS_METADATA and ORDS_PUBLIC_USER [SYSAUX]:`
   + `Enter the temporary tablespace for ORDS_METADATA [TEMP]. Enter the default tablespace for ORDS_PUBLIC_USER [USERS]. Enter the temporary tablespace for ORDS_PUBLIC_USER [TEMP].`
   + `Enter a number to select additional feature(s) to enable [1]:`
   + `Enter a number to configure and start ORDS in standalone mode [1]: `

      选择 **2** 可在独立模式下立即跳过启动 ORDS。
   + `Enter a number to select the protocol [1] HTTP`
   + `Enter the HTTP port [8080]:`
   + `Enter the APEX static resources location:`

     输入 Oracle APEX 安装文件的路径（`/home/apexuser/apex/images`）。

1. 为 Oracle APEX `admin` 用户设置密码。为此，请使用 SQL\$1Plus 以主用户身份连接到数据库实例，然后运行以下命令。

   ```
   1. EXEC rdsadmin.rdsadmin_util.grant_apex_admin_role;
   2. grant APEX_ADMINISTRATOR_ROLE to master;
   3. @/home/apexuser/apex/apxchpwd.sql
   ```

   使用主用户名替换 `master`。在 `apxchpwd.sql` 脚本提示您时，输入新的 `admin` 密码。

1. 使用带有 `serve` 命令的 `ords` 脚本在独立模式下运行 ORDS。对于生产部署，可以考虑使用支持的 Java EE 应用程序服务器，例如 Apache Tomcat 或 Oracle WebLogic 服务器。有关更多信息，请参阅 Oracle 数据库文档中的 [Deploying and Monitoring Oracle REST Data Services](https://docs.oracle.com/en/database/oracle/oracle-rest-data-services/23.1/ordig/deploying-and-monitoring-oracle-rest-data-services.html#GUID-6791F5DF-AC67-4885-BFFA-B80964C17EC9)。

   ```
   /home/apexuser/ORDS/bin/ords \
     --config /home/apexuser/ords_config serve \
     --port 8193 \
     --apex-images /home/apexuser/apex/images
   ```

   如果 ORDS 正在运行但无法访问 Oracle APEX 安装，您可能会看到以下错误，尤其是在非 CDB 实例上。

   ```
   The procedure named apex_admin could not be accessed, it may not be declared, or the user executing this request may not have been granted execute privilege on the procedure, or a function specified by security.requestValidationFunction configuration property has prevented access.
   ```

   要修复此错误，请通过运行带有 `config` 命令的 `ords` 脚本来更改 ORDS 使用的请求验证函数。默认情况下，ORDS 使用 `ords_util.authorize_plsql_gateway` 程序包，只有 CDB 实例支持该程序包。对于非 CDB 实例，您可以将此程序包更改为 `wwv_flow_epg_include_modules.authorize` 软件包。有关为您的用例配置正确的请求验证函数的最佳实践，请参阅 Oracle 数据库文档和 Oracle Support。

1. 返回浏览器中的 Oracle APEX 管理窗口，然后选择**管理**。接下来选择 **Application Express Internal Administration**。在提示您输入凭证时，请输入以下信息：
   + **用户名** – `admin` 
   + **密码** – 使用 `apxchpwd.sql` 脚本设置的密码 

   选择 **Login**，然后设置 `admin` 用户的新密码。

您的侦听器现在已可以使用。

# 升级和移除 Oracle APEX
<a name="Appendix.Oracle.Options.APEX.UpgradeandRemove"></a>

要升级和移除 Oracle APEX，请遵循本主题中的说明：

**Topics**
+ [升级 Oracle APEX 版本](#Appendix.Oracle.Options.APEX.Upgrade)
+ [移除 APEX 和 APEX-DEV 选项](#Appendix.Oracle.Options.APEX.Remove)

## 升级 Oracle APEX 版本
<a name="Appendix.Oracle.Options.APEX.Upgrade"></a>

**重要**  
在升级 Oracle APEX 之前，请对数据库实例进行备份。有关更多信息，请参阅[为 Amazon RDS 的单可用区数据库实例创建数据库快照](USER_CreateSnapshot.md)和[测试 Oracle 数据库升级](USER_UpgradeDBInstance.Oracle.UpgradeTesting.md)。

要将 Oracle APEX 与数据库实例一起升级，请执行以下操作：
+ 为数据库实例的升级后版本创建一个新的选项组。
+ 将 `APEX` 和 `APEX-DEV` 选项的升级后版本添加到新的选项组。确保包括数据库实例使用的任何其他选项。有关更多信息，请参阅“[选项组注意事项](USER_UpgradeDBInstance.Oracle.OGPG.md#USER_UpgradeDBInstance.Oracle.OGPG.OG)”。
+ 在升级数据库实例时，请为升级后的数据库实例指定该新选项组。

在升级 Oracle APEX 的版本后，早期版本的 Oracle APEX 架构可能仍在您的数据库中。如果您不再需要旧的 Oracle APEX 架构，可在升级后从数据库中将其删除。

如果您升级 Oracle APEX 版本，并且在先前的 Oracle APEX 版本中未配置 RESTful 服务，我们建议您配置 RESTful 服务。有关更多信息，请参阅 [为 Oracle APEX 配置 RESTful 服务](Appendix.Oracle.Options.APEX.settingUp.md#Appendix.Oracle.Options.APEX.ConfigureRESTful)。

在某些情况下，当您计划对数据库实例进行主要版本升级时，您可能会发现您使用的是与目标数据库版本不兼容的 Oracle APEX 版本。在这些情况下，您可以在升级数据库实例之前升级 Oracle APEX 的版本。先升级 Oracle APEX 可以减少升级数据库实例所需的时间。

**注意**  
在升级 Oracle APEX 后，安装并配置用于已升级版本的侦听器。有关说明，请参阅[设置 Oracle APEX Listener](Appendix.Oracle.Options.APEX.settingUp.md#Appendix.Oracle.Options.APEX.Listener)。

## 移除 APEX 和 APEX-DEV 选项
<a name="Appendix.Oracle.Options.APEX.Remove"></a>

您可以从数据库实例中移除 `APEX` 和 `APEX-DEV` 选项。要从数据库实例中移除这些选项，请执行下列操作之一：
+ 要从多个数据库实例中移除 `APEX` 和 `APEX-DEV` 选项，请从其所属的选项组中移除这些选项。此更改会影响使用该选项组的所有数据库实例。如果从已附加到多个数据库实例的选项组中移除选项，数据库实例重新启动时会发生短暂中断。

  有关更多信息，请参阅 [从选项组中删除选项](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.RemoveOption)。
+ 要从单个数据库实例中移除 `APEX` 和 `APEX-DEV` 选项，请修改数据库实例，并指定不包含这些选项的另一个选项组。您可以指定默认 (空) 选项组，或指定其他自定义选项组。如果移除选项，数据库实例在自动重新启动时会出现短暂中断。

  有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

在从数据库实例中移除 `APEX` 和 `APEX-DEV` 选项时，将从数据库中移除 APEX 架构。

# Amazon EFS 集成
<a name="oracle-efs-integration"></a>

Amazon Elastic File System（Amazon EFS）提供无服务器的完全弹性文件存储，因此，您无需预调配或管理存储容量和性能，即可共享文件数据。使用 Amazon EFS，您可以创建文件系统，然后通过 NFS 版本 4.0 和 4.1（NFSv4）协议将其安装在您的 VPC 中。然后，您可以像任何其他兼容 POSIX 的文件系统一样使用 EFS 文件系统。有关一般信息，请参阅[什么是 Amazon Elastic File System？](https://docs.aws.amazon.com/efs/latest/ug/whatisefs.html)和 AWS 博客[将 Amazon RDS for Oracle 与 Amazon EFS 集成](https://aws.amazon.com//blogs/database/integrate-amazon-rds-for-oracle-with-amazon-efs/)。

**Topics**
+ [Amazon EFS 集成概述](#oracle-efs-integration.overview)
+ [为 RDS for Oracle 与 Amazon EFS 集成配置网络权限](oracle-efs-integration.network.md)
+ [为 RDS for Oracle 与 Amazon EFS 集成配置 IAM 权限](oracle-efs-integration.iam.md)
+ [添加 EFS\$1INTEGRATION 选项](oracle-efs-integration.adding.md)
+ [配置 Amazon EFS 文件系统权限](oracle-efs-integration.file-system.md)
+ [在 RDS for Oracle 和 Amazon EFS 文件系统之间传输文件](oracle-efs-integration.transferring.md)
+ [删除 EFS\$1INTEGRATION 选项](oracle-efs-integration.removing.md)
+ [Amazon EFS 集成问题排查](oracle-efs-integration.troubleshooting.md)

## Amazon EFS 集成概述
<a name="oracle-efs-integration.overview"></a>

使用 Amazon EFS，您可以在 RDS for Oracle 数据库实例和 EFS 文件系统之间传输文件。例如，您可以使用 EFS 来支持以下使用案例：
+ 在应用程序和多个数据库服务器之间共享文件系统。
+ 为与迁移相关的文件（包括可传输的表空间数据文件）创建共享目录。有关更多信息，请参阅 [使用 Oracle 可传输表空间进行迁移](oracle-migrating-tts.md)。
+ 存储和共享存档的重做日志文件，无需在服务器上分配额外的存储空间。
+ 使用 Oracle 数据库实用程序（例如 `UTL_FILE`）读取和写入文件。

### Amazon EFS 集成的优势
<a name="oracle-efs-integration.overview.advantages"></a>

当您选择 EFS 文件系统而不是替代的数据传输解决方案时，您将获得以下优势：
+ 您可以在 Amazon EFS 和 RDS for Oracle 数据库实例之间传输 Oracle Data Pump 文件。您无需在本地复制这些文件，因为 Data Pump 直接从 EFS 文件系统导入。有关更多信息，请参阅 [将数据导入到 Amazon RDS 上的 Oracle](Oracle.Procedural.Importing.md)。
+ 数据迁移比使用数据库链接更快。
+ 避免在 RDS for Oracle 数据库实例上分配存储空间来存放文件。
+ EFS 文件系统可以自动扩展存储，无需您进行预调配。
+ Amazon EFS 集成没有最低费用或设置成本。您仅需按实际用量付费。
+ Amazon EFS 集成支持两种形式的加密：传输中数据加密和静态加密。默认情况下，使用 TLS 版本 1.2 启用传输中数据加密。您可以在创建 Amazon EFS 文件系统时启用静态数据加密。有关更多信息，请参阅 *Amazon Elastic File System User Guide*（《Amazon Elastic File System 用户指南》）中的 [Encrypting data at rest](https://docs.aws.amazon.com/efs/latest/ug/encryption-at-rest.html)（加密静态数据）。

### Amazon EFS 集成的要求
<a name="oracle-efs-integration.overview.requirements"></a>

确保您满足以下要求：
+ 数据库必须运行数据库版本 19.0.0.0.ru-2022-07.rur-2022-07.r1 或更高版本。
+ 数据库实例和 EFS 文件系统必须位于同一个 AWS 区域、VPC 和 AWS 账户中。RDS for Oracle 不支持 EFS 的跨账户和跨区域访问。
+ VPC 必须同时启用了 **DNS 解析**和 **DNS 主机名**。有关更多信息，请参阅《Amazon Virtual Private Cloud 用户指南》**中的 [VPC 中的 DNS 属性](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html#vpc-dns-support)。
+ 如果您在 `mount` 命令中使用 DNS 名称，请确保 VPC 配置为使用由 Amazon 提供的 DNS 服务器。不支持自定义 DNS 服务器。
+ 必须使用非 RDS 解决方案来备份 EFS 文件系统。RDS for Oracle 不支持 EFS 文件系统的自动备份或手动数据库快照。有关更多信息，请参阅[备份您的 Amazon EFS 文件系统](https://docs.aws.amazon.com/efs/latest/ug/efs-backup-solutions.html)。

# 为 RDS for Oracle 与 Amazon EFS 集成配置网络权限
<a name="oracle-efs-integration.network"></a>

要让 RDS for Oracle 与 Amazon EFS 集成，请确保您的数据库实例具有网络访问权限，可访问 EFS 文件系统。有关更多信息，请参阅《Amazon Elastic File System 用户指南》**中的 [控制 NFS 客户端对 Amazon EFS 文件系统的网络访问权限](https://docs.aws.amazon.com/efs/latest/ug/NFS-access-control-efs.html)。

**Topics**
+ [使用安全组控制网络访问权限](#oracle-efs-integration.network.inst-access)
+ [使用文件系统策略控制网络访问权限](#oracle-efs-integration.network.file-system-policy)

## 使用安全组控制网络访问权限
<a name="oracle-efs-integration.network.inst-access"></a>

您可以使用 VPC 安全组等网络层安全机制控制数据库实例对 EFS 文件系统的访问权限。要允许访问数据库实例的 EFS 文件系统，请确保您的 EFS 文件系统满足以下要求：
+ EFS 挂载目标存在于 RDS for Oracle 数据库实例使用的每个可用区中。

  *EFS 挂载目标*提供您可以在其中挂载 EFS 文件系统的 NFSv4 端点的 IP 地址。您使用其 DNS 名称挂载文件系统，该名称将解析为数据库实例的可用区使用的 EFS 挂载目标的 IP 地址。

  您可以将不同可用区中的数据库实例配置为使用相同的 EFS 文件系统。对于多可用区，部署中的每个可用区都需要一个挂载点。您可能需要将数据库实例移到其他可用区。出于这些原因，我们建议您在 VPC 的每个可用区中创建一个 EFS 挂载点。默认情况下，当您使用控制台创建新的 EFS 文件系统时，RDS 会为所有可用区创建挂载目标。
+ 安全组已连接到挂载目标。
+ 安全组有一条入站规则，允许在 TCP/2049（类型 NFS）上使用 RDS for Oracle 数据库实例的网络子网或安全组。

有关更多信息，请参阅《Amazon Elastic File System 用户指南》**中的[创建 Amazon EFS 文件系统](https://docs.aws.amazon.com/efs/latest/ug/creating-using-create-fs.html#configure-efs-network-access)和[创建和管理 EFS 挂载目标和安全组](https://docs.aws.amazon.com/efs/latest/ug/accessing-fs.html)。

## 使用文件系统策略控制网络访问权限
<a name="oracle-efs-integration.network.file-system-policy"></a>

Amazon EFS 与 RDS for Oracle 的集成使用默认（空）EFS 文件系统策略。默认策略不使用 IAM 进行身份验证。相反，它向可以使用挂载目标连接到文件系统的任何匿名客户端授予完全访问权限。当用户配置的文件系统策略不生效时（包括在创建文件系统时），默认策略将生效。有关更多信息，请参阅《Amazon Elastic File System 用户指南》**中的[默认 EFS 文件系统策略](https://docs.aws.amazon.com/efs/latest/ug/iam-access-control-nfs-efs.html#default-filesystempolicy)。

要增强所有客户端（包括 RDS for Oracle）的 EFS 文件系统的访问权限，您可以配置 IAM 权限。使用这种方法，您可以创建文件系统策略。有关更多信息，请参阅《Amazon Elastic File System 用户指南》**中的[创建文件系统策略](https://docs.aws.amazon.com/efs/latest/ug/create-file-system-policy.html)。

# 为 RDS for Oracle 与 Amazon EFS 集成配置 IAM 权限
<a name="oracle-efs-integration.iam"></a>

默认情况下，Amazon EFS 集成功能不使用 IAM 角色：`USE_IAM_ROLE` 选项设置为 `FALSE`。要将 RDS for Oracle 与 Amazon EFS 和 IAM 角色集成，您的数据库实例必须具有可以访问 Amazon EFS 文件系统的 IAM 权限。

**Topics**
+ [步骤 1：为您的数据库实例创建 IAM 角色并附加策略](#oracle-efs-integration.iam.role)
+ [步骤 2：为您的 Amazon EFS 文件系统创建文件系统策略](#oracle-efs-integration.iam.policy)
+ [步骤 3：将您的 IAM 角色与 RDS for Oracle 数据库实例关联](#oracle-efs-integration.iam.instance)

## 步骤 1：为您的数据库实例创建 IAM 角色并附加策略
<a name="oracle-efs-integration.iam.role"></a>

在此步骤中，您将为 RDS for Oracle 数据库实例创建一个角色，以允许 Amazon RDS 访问您的 EFS 文件系统。

### 控制台
<a name="oracle-efs-integration.iam.role.console"></a>

**创建 IAM 角色以允许 Amazon RDS 访问 EFS 文件系统**

1. 打开 [IAM 管理控制台](https://console.aws.amazon.com/iam/home?#home)。

1. 在导航窗格中，选择**角色**。

1. 选择 **Create role (创建角色)**。

1. 对于 **AWS service (亚马逊云科技服务)**，选择 **RDS**。

1. 对于 **Select your use case (选择您的用例)**，选择 **RDS – Add Role to Database (RDS - 将角色添加到数据库)**。

1. 选择**下一步**。

1. 不要添加任何权限策略。选择**下一步**。

1. 将 **Role name (角色名称)** 设置为您的 IAM 角色的名称，例如，`rds-efs-integration-role`。您也可以添加可选的**描述**值。

1. 选择**创建角色**。

### AWS CLI
<a name="integration.preparing.role.CLI"></a>

要限制服务对特定资源的权限，我们建议在基于资源的信任关系中使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 和 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 全局条件上下文键。这是防范[混淆代理问题](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)最有效的方法。

您可以使用这两个全局条件上下文键并让 `aws:SourceArn` 值包含账户 ID。在这种情况下，当 `aws:SourceAccount` 值和 `aws:SourceArn` 值中的账户使用相同策略语句时，确保二者使用相同的账户 ID。
+ 如果您想对单个资源进行跨服务访问，请使用 `aws:SourceArn`。
+ 如果您想允许该账户中的任何资源与跨服务使用操作相关联，请使用 `aws:SourceAccount`。

在信任关系中，请务必使用 `aws:SourceArn` 全局条件上下文键和访问角色资源的完整 Amazon Resource Name (ARN)。

以下 AWS CLI 命令会创建名为 `rds-efs-integration-role` 的角色来实现此目的。

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

```
aws iam create-role \
   --role-name rds-efs-integration-role \
   --assume-role-policy-document '{
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
            "Service": "rds.amazonaws.com"
          },
         "Action": "sts:AssumeRole",
         "Condition": {
             "StringEquals": {
                 "aws:SourceAccount": my_account_ID,
                 "aws:SourceArn": "arn:aws:rds:Region:my_account_ID:db:dbname"
             }
         }
       }
     ]
   }'
```
对于：Windows  

```
aws iam create-role ^
   --role-name rds-efs-integration-role ^
   --assume-role-policy-document '{
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
            "Service": "rds.amazonaws.com"
          },
         "Action": "sts:AssumeRole",
         "Condition": {
             "StringEquals": {
                 "aws:SourceAccount": my_account_ID,
                 "aws:SourceArn": "arn:aws:rds:Region:my_account_ID:db:dbname"
             }
         }
       }
     ]
   }'
```

有关更多信息，请参阅《IAM 用户指南》**中的[创建向 IAM 用户委派权限的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)。

## 步骤 2：为您的 Amazon EFS 文件系统创建文件系统策略
<a name="oracle-efs-integration.iam.policy"></a>

在此步骤中，您将为 EFS 文件系统创建文件系统策略。

**创建或编辑 EFS 文件系统策略**

1. 打开 [EFS 管理控制台](https://console.aws.amazon.com/efs/home?#home)。

1. 选择 **File Systems (文件系统)**。

1. 在 **File systems**（文件系统）页面上，选择要为其编辑或创建文件系统策略的文件系统。将显示该文件系统的详细信息页面。

1. 选择 **File system policy**（文件系统策略）选项卡。

   如果策略为空，则使用默认 EFS 文件系统策略。有关更多信息，请参阅《Amazon Elastic File System 用户指南》**中的[默认 EFS 文件系统策略](https://docs.aws.amazon.com/efs/latest/ug/iam-access-control-nfs-efs.html#default-filesystempolicy )。

1. 选择**编辑**。此时将显示 **File system policy (文件系统策略)** 页面。

1. 在 **Policy editor**（策略编辑器）中，输入如下所示的策略，然后选择 **Save**（保存）。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Id": "ExamplePolicy01",
       "Statement": [
           {
               "Sid": "ExampleStatement01",
               "Effect": "Allow",
               "Principal": {
                   "AWS": "arn:aws:iam::123456789012:role/rds-efs-integration-role"
               },
               "Action": [
                   "elasticfilesystem:ClientMount",
                   "elasticfilesystem:ClientWrite",
                   "elasticfilesystem:ClientRootAccess"
               ],
               "Resource": "arn:aws:elasticfilesystem:us-east-1:123456789012:file-system/fs-1234567890abcdef0"
           }
       ]
   }
   ```

------

## 步骤 3：将您的 IAM 角色与 RDS for Oracle 数据库实例关联
<a name="oracle-efs-integration.iam.instance"></a>

在此步骤中，您将您的 IAM 角色与数据库实例关联。请注意以下要求：
+ 您必须具有访问 IAM 角色的权限，并向此角色附加所需的 Amazon EFS 权限策略。
+ 您一次只能将一个 IAM 角色与 RDS for Oracle 数据库实例关联。
+ 实例的状态必须为 **Available**（可用）。

有关更多信息，请参阅《Amazon Elastic File System 用户指南》**中的 [Amazon EFS 的身份和访问权限管理](https://docs.aws.amazon.com/efs/latest/ug/auth-and-access-control.html)。

### 控制台
<a name="oracle-efs-integration.iam.instance.console"></a>

**将您的 IAM 角色与 RDS for Oracle 数据库实例关联**

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

1. 选择**数据库**。

1. 如果数据库实例不可用，请选择 **Actions (操作)**，然后选择 **Start (启动)**。当实例状态显示 **Started (已启动)** 时，请转至下一步。

1. 选择 Oracle 数据库实例名称以显示其详细信息。

1. 在 **Connectivity & security**（连接性和安全性）选项卡上，向下滚动到页面底部的 **Manage IAM roles**（管理 IAM 角色）部分。

1. 选择要添加到 **Add IAM roles to this instance**（将 IAM 角色添加到此实例）部分的角色。

1. 对于 **Feature**（特征），选择 **EFS\$1INTEGRATION**。

1. 选择**添加角色**。

### AWS CLI
<a name="oracle-efs-integration.iam.instance.CLI"></a>

以下 AWS CLI 命令将角色添加到名为 `mydbinstance` 的 Oracle 数据库实例。

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

```
aws rds add-role-to-db-instance \
   --db-instance-identifier mydbinstance \
   --feature-name EFS_INTEGRATION \
   --role-arn your-role-arn
```
对于：Windows  

```
aws rds add-role-to-db-instance ^
   --db-instance-identifier mydbinstance ^
   --feature-name EFS_INTEGRATION ^
   --role-arn your-role-arn
```

将 `your-role-arn` 替换为您在上一步中记下的角色 ARN。必须为 `EFS_INTEGRATION` 选项指定 `--feature-name`。

# 添加 EFS\$1INTEGRATION 选项
<a name="oracle-efs-integration.adding"></a>

要将 Amazon RDS for Oracle 与 Amazon EFS 集成，您的数据库实例必须与包括 `EFS_INTEGRATION` 选项的选项组关联。

属于同一选项组的多个 Oracle 数据库实例共享相同的 EFS 文件系统。不同的数据库实例可以访问相同的数据，但可以通过使用不同的 Oracle 目录来划分访问权限。有关更多信息，请参阅[在 RDS for Oracle 和 Amazon EFS 文件系统之间传输文件](oracle-efs-integration.transferring.md)。

## 控制台
<a name="oracle-efs-integration.adding.console"></a>

**为 Amazon EFS 集成配置选项组**

1. 创建新选项组或识别现有选项组，然后您可以将 `EFS_INTEGRATION` 选项添加到其中。

   有关创建选项组的信息，请参阅 [创建选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)。

1. 将 `EFS_INTEGRATION` 选项添加到该选项组。您需要指定 `EFS_ID` 文件系统 ID 并设置 `USE_IAM_ROLE` 标志。

   有关更多信息，请参阅 [将选项添加到选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption)。

1. 通过以下任一方式将选项组与数据库实例关联：
   + 创建新的 Oracle 数据库实例并将选项组与其关联。有关创建数据库实例的信息，请参阅[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)。
   + 修改 Oracle 数据库实例以将选项组与其关联。有关修改 Oracle 数据库实例的信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

## AWS CLI
<a name="oracle-efs-integration.adding.cli"></a>

**为 EFS 集成配置选项组**

1. 创建新选项组或识别现有选项组，然后您可以将 `EFS_INTEGRATION` 选项添加到其中。

   有关创建选项组的信息，请参阅 [创建选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)。

1. 将 `EFS_INTEGRATION` 选项添加到该选项组。

   例如，以下 AWS CLI 命令将 `EFS_INTEGRATION` 选项添加到名为 **myoptiongroup** 的选项组。  
**Example**  

   对于 Linux、macOS 或 Unix：

   ```
   aws rds add-option-to-option-group \
      --option-group-name myoptiongroup \
      --options "OptionName=EFS_INTEGRATION,OptionSettings=\ 
      [{Name=EFS_ID,Value=fs-1234567890abcdef0},{Name=USE_IAM_ROLE,Value=TRUE}]"
   ```

   对于 Windows：

   ```
   aws rds add-option-to-option-group ^
      --option-group-name myoptiongroup ^
      --options "OptionName=EFS_INTEGRATION,OptionSettings=^
      [{Name=EFS_ID,Value=fs-1234567890abcdef0},{Name=USE_IAM_ROLE,Value=TRUE}]"
   ```

1. 通过以下任一方式将选项组与数据库实例关联：
   + 创建新的 Oracle 数据库实例并将选项组与其关联。有关创建数据库实例的信息，请参阅[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)。
   + 修改 Oracle 数据库实例以将选项组与其关联。有关修改 Oracle 数据库实例的信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

# 配置 Amazon EFS 文件系统权限
<a name="oracle-efs-integration.file-system"></a>

默认情况下，对于新创建的 EFS 文件系统，只有根用户（UID `0`）具有读取、写入和执行权限。为了让其他用户也能修改文件系统，根用户必须明确授予他们访问权限。RDS for Oracle 数据库实例的用户属于 `others` 类别。有关更多信息，请参阅《Amazon Elastic File System 用户指南》**中的[在网络文件系统（NFS）级别处理用户、组和权限](https://docs.aws.amazon.com/efs/latest/ug/accessing-fs-nfs-permissions.html)。

要允许您的 RDS for Oracle 数据库实例在 EFS 文件系统上读取和写入文件，请执行以下操作：
+ 在您的 Amazon EC2 或本地实例上本地挂载 EFS 文件系统。
+ 配置精细权限。

例如，要授予 `other` 用户写入 EFS 文件系统根目录的权限，请在此目录上运行 `chmod 777`。有关更多信息，请参阅《Amazon Elastic File System 用户指南》**中的[示例 Amazon EFS 文件系统使用案例和权限](https://docs.aws.amazon.com/efs/latest/ug/accessing-fs-nfs-permissions.html#accessing-fs-nfs-permissions-ex-scenarios)。

# 在 RDS for Oracle 和 Amazon EFS 文件系统之间传输文件
<a name="oracle-efs-integration.transferring"></a>

要在 RDS for Oracle 实例和 Amazon EFS 文件系统之间传输文件，请至少创建一个 Oracle 目录并配置 EFS 文件系统权限以控制数据库实例访问权限。

**Topics**
+ [创建 Oracle 目录](#oracle-efs-integration.transferring.od)
+ [向 EFS 文件系统传输数据和从其中传输数据：示例](#oracle-efs-integration.transferring.upload)

## 创建 Oracle 目录
<a name="oracle-efs-integration.transferring.od"></a>

要创建 Oracle 目录，请使用过程 `rdsadmin.rdsadmin_util.create_directory_efs`。 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_directory_name`  |  VARCHAR2  |  –  |  是  |  Oracle 目录的名称。  | 
|  `p_path_on_efs`  |  VARCHAR2  |  –  |  是  |  EFS 文件系统上的路径。路径名的前缀使用模式 `/rdsefs-fsid/`，其中 *fsid* 是 EFS 文件系统 ID 的占位符。 例如，如果您的 EFS 文件系统名为 `fs-1234567890abcdef0`，并且您在此文件系统上创建了一个名为 `mydir` 的子目录，则可以指定以下值： <pre>/rdsefs-fs-1234567890abcdef0/mydir</pre>  | 

假设您在 EFS 文件系统 `fs-1234567890abcdef0` 上创建了一个名为 `/datapump1` 的子目录。以下示例创建一个 Oracle 目录 `DATA_PUMP_DIR_EFS`，该目录指向 EFS 文件系统上的 `/datapump1` 目录。`p_path_on_efs` 参数的文件系统路径值以字符串 `/rdsefs-` 为前缀。

```
BEGIN
  rdsadmin.rdsadmin_util.create_directory_efs(
    p_directory_name => 'DATA_PUMP_DIR_EFS', 
    p_path_on_efs    => '/rdsefs-fs-1234567890abcdef0/datapump1');
END;
/
```

## 向 EFS 文件系统传输数据和从其中传输数据：示例
<a name="oracle-efs-integration.transferring.upload"></a>

以下示例使用 Oracle Data Pump 将名为 `MY_TABLE` 的表导出到文件 `datapump.dmp`。此文件位于 EFS 文件系统上。

```
DECLARE
  v_hdnl NUMBER;
BEGIN
  v_hdnl := DBMS_DATAPUMP.OPEN(operation => 'EXPORT', job_mode => 'TABLE', job_name=>null);
  DBMS_DATAPUMP.ADD_FILE(
    handle    => v_hdnl,
    filename  => 'datapump.dmp',
    directory => 'DATA_PUMP_DIR_EFS',
    filetype  => dbms_datapump.ku$_file_type_dump_file);
  DBMS_DATAPUMP.ADD_FILE(
    handle    => v_hdnl,
    filename  => 'datapump-exp.log',
    directory => 'DATA_PUMP_DIR_EFS',
    filetype  => dbms_datapump.ku$_file_type_log_file);
  DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'NAME_EXPR','IN (''MY_TABLE'')');
  DBMS_DATAPUMP.START_JOB(v_hdnl);
END;
/
```

以下示例使用 Oracle Data Pump 从文件 `datapump.dmp` 中导出名为 `MY_TABLE` 的表。此文件位于 EFS 文件系统上。

```
DECLARE
  v_hdnl NUMBER;
BEGIN
  v_hdnl := DBMS_DATAPUMP.OPEN(
    operation => 'IMPORT',
    job_mode  => 'TABLE',
    job_name  => null);
  DBMS_DATAPUMP.ADD_FILE(
    handle    => v_hdnl,
    filename  => 'datapump.dmp',
    directory => 'DATA_PUMP_DIR_EFS',
    filetype  => dbms_datapump.ku$_file_type_dump_file );
  DBMS_DATAPUMP.ADD_FILE(
    handle    => v_hdnl,
    filename  => 'datapump-imp.log',
    directory => 'DATA_PUMP_DIR_EFS',
    filetype  => dbms_datapump.ku$_file_type_log_file);
  DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'NAME_EXPR','IN (''MY_TABLE'')');
  DBMS_DATAPUMP.START_JOB(v_hdnl);
END;
/
```

有关更多信息，请参阅 [将数据导入到 Amazon RDS 上的 Oracle](Oracle.Procedural.Importing.md)。

# 删除 EFS\$1INTEGRATION 选项
<a name="oracle-efs-integration.removing"></a>

删除 `EFS_INTEGRATION` 选项的步骤取决于您是从多个数据库实例还是单个实例中删除该选项。


| 数据库实例数 | 操作 | 相关信息 | 
| --- | --- | --- | 
| 多个 | 从数据库实例所属的选项组中删除 EFS\$1INTEGRATION 选项。此更改会影响使用该选项组的所有实例。 | [从选项组中删除选项](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.RemoveOption) | 
| 单列排序 | 修改数据库实例并指定不包含 EFS\$1INTEGRATION 选项的另一个选项组。您可以指定默认（空）选项组，或指定其他自定义选项组。 | [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md) | 

删除 `EFS_INTEGRATION` 选项后，您可以选择删除已连接到数据库实例的 EFS 文件系统。

# Amazon EFS 集成问题排查
<a name="oracle-efs-integration.troubleshooting"></a>

您的 RDS for Oracle 数据库实例监控与 Amazon EFS 文件系统的连接。当监控检测到问题时，它可能会尝试更正问题并在 RDS 控制台中发布事件。有关更多信息，请参阅[查看 Amazon RDS 事件](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ListEvents.html)。

使用本部分中的信息帮助您诊断和修复在使用 Amazon EFS 集成时的常见问题。


| 通知 | 说明 | Action | 
| --- | --- | --- | 
|  `The EFS for RDS Oracle instance instance_name isn't available on the primary host. NFS port 2049 of your EFS isn't reachable.`  |  数据库实例无法与 EFS 文件系统通信。  |  请确保满足以下条件： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/oracle-efs-integration.troubleshooting.html)  | 
|  `The EFS isn't reachable.`  |  安装 `EFS_INTEGRATION` 选项时出错。  |  请确保满足以下条件： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/oracle-efs-integration.troubleshooting.html)  | 
|  `The associated role with your DB instance wasn't found.`  |  安装 `EFS_INTEGRATION` 选项时出错。  |  确保您已将 IAM 角色与 RDS for Oracle 数据库实例关联。  | 
|  `The associated role with your DB instance wasn't found.`  |  安装 `EFS_INTEGRATION` 选项时出错。RDS for Oracle 已从数据库快照中还原，`USE_IAM_ROLE` 选项设置为 `TRUE`。  |  确保您已将 IAM 角色与 RDS for Oracle 数据库实例关联。  | 
|  `The associated role with your DB instance wasn't found.`  |  安装 `EFS_INTEGRATION` 选项时出错。RDS for Oracle 是根据一个多合一的 CloudFormation 模板创建的，其 `USE_IAM_ROLE` 选项设置为 `TRUE`。  |  作为解决方法，请完成以下步骤： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/oracle-efs-integration.troubleshooting.html)  | 
|  `PLS-00302: component 'CREATE_DIRECTORY_EFS' must be declared`  |  当您使用不支持 Amazon EFS 的 RDS for Oracle 版本时，可能会发生此错误。  |  确保您使用的是 RDS for Oracle 数据库实例版本 19.0.0.0.ru-2022-07.rur-2022-07.r1 或更高版本。  | 
|  `Read access of your EFS is denied. Check your file system policy.`  |  您的数据库实例无法读取 EFS 文件系统。  |  确保您的 EFS 文件系统允许通过 IAM 角色或在 EFS 文件系统级别进行读取访问。  | 
|  不适用  |  您的数据库实例无法写入 EFS 文件系统。  |  执行以下步骤： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/oracle-efs-integration.troubleshooting.html)  | 

# Oracle Java 虚拟机
<a name="oracle-options-java"></a>

Amazon RDS 通过使用 `JVM` 选项来支持 Oracle Java 虚拟机 (JVM)。Oracle Java 提供了 SQL 架构和函数以在 Oracle 数据库中利用 Oracle Java 功能。有关更多信息，请参阅 Oracle 文档中的 [Oracle Database 中的 Java 简介](https://docs.oracle.com/database/121/JJDEV/chone.htm)。您可以将 Oracle JVM 与所有版本的 Oracle Database 21c（21.0.0）和 Oracle Database 19c（19.0.0）结合使用。

## Oracle JVM 的注意事项
<a name="oracle-options-java.considerations"></a>

Amazon RDS 中的 Java 实施拥有一组有限的权限。主用户被授予 `RDS_JAVA_ADMIN` 角色，进而授予 `JAVA_ADMIN` 角色所获权限的一个子集。若要列出授予 `RDS_JAVA_ADMIN` 角色的权限，请在您的数据库实例上运行以下查询：

```
SELECT * FROM dba_java_policy 
   WHERE grantee IN ('RDS_JAVA_ADMIN', 'PUBLIC') 
   AND enabled = 'ENABLED' 
   ORDER BY type_name, name, grantee;
```

## Oracle JVM 的先决条件
<a name="oracle-options-java.prerequisites"></a>

以下是使用 Oracle Java 的先决条件：
+ 您的数据库实例必须属于足够大的类。db.t3.small 数据库实例类不支持 Oracle Java。有关更多信息，请参阅 [数据库实例类](Concepts.DBInstanceClass.md)。
+ 数据库实例必须已启用**自动次要版本升级**。此选项使您的数据库实例在次要数据库引擎版本升级可用时自动接收该升级。Amazon RDS 使用该选项将数据库实例更新为最新的 Oracle 补丁集更新（PSU）或版本更新（RU）。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

## Oracle JVM 的最佳实践
<a name="oracle-options-java.best-practices"></a>

以下是使用 Oracle Java 的最佳实践：
+ 为了实现最高安全性，可将 `JVM` 选项与安全套接字层 (SSL) 结合使用。有关更多信息，请参阅“[Oracle 安全套接字层](Appendix.Oracle.Options.SSL.md)”。
+ 配置您的数据库实例以限制网络访问。有关更多信息，请参阅“[在 VPC 中访问数据库实例的场景](USER_VPC.Scenarios.md)”和“[在 VPC 中使用数据库实例](USER_VPC.WorkingWithRDSInstanceinaVPC.md)”。
+ 如果您满足以下条件，请更新 HTTPS 终端节点的配置以支持 TLSv1.2：
  + 您可以使用 Oracle Java 虚拟机 (JVM) 通过 TLSv1 或 TLSv1.1 协议连接 HTTPS 终端节点。
  + 您的终端节点不支持 TLSv1.2 协议。
  + 您尚未将 2021 年 4 月版本更新应用于 Oracle 数据库。

  通过更新终端节点配置，您可以确保 JVM 与 HTTPS 终端节点的连接将继续有效。有关 Oracle JRE 和 JDK 中 TLS 更改的更多信息，请参阅 [Oracle JRE 和 JDK 加密路线图](https://java.com/en/jre-jdk-cryptoroadmap.html)。

## 添加 Oracle JVM 选项
<a name="oracle-options-java.add"></a>

下面是将 `JVM` 选项添加到数据库实例的一般过程：

1. 创建新的选项组，或者复制或修改现有选项组。

1. 将 选项添加到该选项组。

1. 将选项组与数据库实例相关联。

添加 `JVM` 选项后，将出现短暂中断。在添加 选项后，您无需重新启动数据库实例。在选项组处于活动状态后，Oracle Java 将立即可用。

**注意**  
在该中断期间，将短暂禁用密码验证功能。您还可能会在中断期间看到与密码验证功能相关的事件。在 Oracle 数据库实例变得可用之前，将再次启用密码验证功能。

**将 JVM 选项添加到数据库实例**

1. 确定您要使用的选项组。您可以创建新的选项组，或使用现有选项组。如果您想使用现有选项组，请跳到下一步。或者，通过以下设置创建自定义数据库选项组：
   + 对于**引擎**，选择数据库实例使用的数据库引擎（**oracle-ee**、**oracle-se**、**oracle-se1** 或 **oracle-se2**）。
   + 对于**主引擎版本**，选择数据库实例的版本。

   有关更多信息，请参阅“[创建选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)”。

1. 将 **JVM** 选项添加到该选项组。有关添加选项的更多信息，请参阅 [将选项添加到选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption)。

1. 将选项组应用到新的或现有的数据库实例：
   + 对于新数据库实例，请在启动实例时应用选项组。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。
   + 对于现有数据库实例，请修改实例并附加新的选项组以应用选项组。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

1. 为用户授予所需的权限。

   默认情况下，Amazon RDS 主用户具有使用 `JVM` 选项的权限。如果其他用户需要具有这些权限，请在 SQL 客户端中以主用户身份连接到数据库实例，并为用户授予这些权限。

   以下示例为 `JVM` 用户授予使用 `test_proc` 选项的权限。

   ```
   create user test_proc identified by password;
   CALL dbms_java.grant_permission('TEST_PROC', 'oracle.aurora.security.JServerPermission', 'LoadClassInPackage.*', '');
   ```
**注意**  
作为安全最佳实践，请指定除此处所示提示以外的密码。

   在为用户授予这些权限后，以下查询将返回输出。

   ```
   select * from dba_java_policy where grantee='TEST_PROC';
   ```
**注意**  
Oracle 用户名区分大小写，通常全部为大写字符。

## 删除 Oracle JVM 选项
<a name="oracle-options-java.remove"></a>

您可以从数据库实例中删除 `JVM` 选项。删除该选项后，将出现短暂中断。删除 `JVM` 选项后，您无需重新启动数据库实例。

**警告**  
 如果数据库实例使用的是在选项中启用的数据类型，则删除 `JVM` 选项会导致数据丢失。请先备份数据，然后再继续。有关更多信息，请参阅“[备份、还原和导出数据](CHAP_CommonTasks.BackupRestore.md)”。

要从数据库实例中删除 `JVM` 选项，请执行下列操作之一：
+ 从 `JVM` 选项所属的选项组中删除该选项。此更改会影响使用该选项组的所有数据库实例。有关更多信息，请参阅“[从选项组中删除选项](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.RemoveOption)”。
+ 修改数据库实例并指定不包含 `JVM` 选项的另一个选项组。此更改会影响单个数据库实例。您可以指定默认 (空) 选项组，或指定其他自定义选项组。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

# Oracle Enterprise Manager
<a name="Oracle.Options.OEM"></a>

Amazon RDS 支持 Oracle Enterprise Manager (OEM)。OEM 是 Oracle 的企业信息技术集成管理产品线。

Amazon RDS 在 Oracle Database 19c 非 CDB 或 CDB 上支持 OEM。下表描述了支持的 OEM 选项。


****  

| 选项 | 选项 ID | 支持的 OEM 版本 | 
| --- | --- | --- | 
|  [OEM Database Express](Appendix.Oracle.Options.OEM_DBControl.md)  |  `OEM`  |  OEM Database Express 19c  | 
|  [OEM Management Agent](Oracle.Options.OEMAgent.md)  |  `OEM_AGENT`  |  OEM Cloud Control for 13c  | 

**注意**  
您可以使用 OEM Database 或 OEM Management Agent，但不能同时使用二者。

# Oracle Enterprise Manager Database Express
<a name="Appendix.Oracle.Options.OEM_DBControl"></a>

Amazon RDS 可通过使用 OEM 选项支持 Oracle Enterprise Manager Database Express（EM Express）。Amazon RDS 支持使用 CDB 或非 CDB 架构的 EM Express for Oracle Database 19c。

EM Express 是数据库中包含的基于 Web 的数据库管理工具，仅在打开时才可用。该工具支持关键性能管理和基本数据库管理功能。有关更多信息，请参阅 Oracle 数据库文档中的 [Introduction to Oracle Enterprise Manager Database Express](https://docs.oracle.com/en/database/oracle/oracle-database/19/admqs/getting-started-with-database-administration.html#GUID-BA75AD46-D22E-4914-A31E-C395CD6A2BBA)。

**注意**  
db.t3.small 数据库实例类不支持 EM Express。有关数据库实例类的更多信息，请参阅[RDS for Oracle 数据库实例类](Oracle.Concepts.InstanceClasses.md)。

## OEM 选项设置
<a name="Appendix.Oracle.Options.OEM_DBControl.Options"></a>

Amazon RDS 支持 OEM 选项的以下设置。


****  

| 选项设置 | 有效值 | 描述 | 
| --- | --- | --- | 
| **端口** | 一个整数值 |  RDS for Oracle 数据库实例上负责侦听 EM Express 的端口。默认端口为 5500。  | 
| **安全组** | — |  对 **Port** 具有访问权限的安全组。  | 

## 步骤 1：添加 OEM 选项
<a name="Appendix.Oracle.Options.OEM_DBControl.Add"></a>

将 OEM 选项添加到数据库实例的一般过程如下所示：

1. 创建新的选项组，或者复制或修改现有选项组。

1. 将 选项添加到该选项组。

1. 将选项组与数据库实例相关联。

如果添加 OEM 选项，则在数据库实例自动重新启动时会出现短暂中断。

**将 OEM 选项添加到数据库实例**

1. 确定您想要使用的选项组。您可以创建新的选项组，或使用现有选项组。如果您想使用现有选项组，请跳到下一步。或者，通过以下设置创建自定义数据库选项组：

   1. 对于**引擎**，请选择适用于您的数据库实例的 Oracle 版本。

   1. 对于**主引擎版本**，请选择数据库实例的版本。

   有关更多信息，请参阅“[创建选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)”。

1. 将 OEM 选项添加到选项组中，然后配置选项设置。有关添加选项的更多信息，请参阅 [将选项添加到选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption)。有关各项设置的更多信息，请参阅[OEM 选项设置](#Appendix.Oracle.Options.OEM_DBControl.Options)。
**注意**  
如果在已附加到一个或多个数据库实例的现有选项组中添加 OEM 选项，所有数据库实例自动重新启动时都会发生短暂中断。

1. 将选项组应用到新的或现有的数据库实例：
   + 对于新数据库实例，请在启动实例时应用选项组。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。
   + 对于现有数据库实例，请修改实例并附加新的选项组以应用选项组。如果添加 OEM 选项，则在数据库实例自动重新启动时会出现短暂中断。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

**注意**  
您还可以使用 AWS CLI 添加 OEM 选项。有关示例，请参阅 [将选项添加到选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption)。

## 步骤 2：（仅限 CDB）解锁 DBSNMP 用户账户
<a name="Appendix.Oracle.Options.OEM_DBControl.DBSNMP"></a>

如果数据库实例使用 CDB 架构，您必须以 `DBSNMP` 身份登录 EM Express。在 CDB 中，`DBSNMP` 是普通用户。默认情况下，此账户处于锁定状态。如果数据库实例不使用 CDB 架构，请跳过此步骤。

**解锁 CDB 实例中的 DBSNMP 用户账户**

1. 在 SQL\$1Plus 或其他 Oracle SQL 应用程序中，以主用户身份登录到数据库实例。

1. 运行以下存储过程来解锁 `DBSNMP` 账户：

   ```
   1. EXEC rdsadmin.rdsadmin_util.reset_oem_agent_password('new_password');
   ```

   如果您收到错误消息，指出该过程不存在，请重启 CDB 实例来自动安装它。有关更多信息，请参阅 [重启数据库实例](USER_RebootInstance.md)。

## 步骤 3：通过浏览器访问 EM Express
<a name="Appendix.Oracle.Options.OEM_DBControl.Using"></a>

当您从 Web 浏览器访问 EM Express 时，将显示一个登录窗口，提示您输入用户名和密码。

**通过浏览器访问 EM Express**

1. 确定 Amazon RDS 数据库实例的端点和 EM Express 端口。有关查找 Amazon RDS 数据库实例的端点的信息，请参阅 [查找 RDS for Oracle 数据库实例的端点](USER_Endpoint.md)。

1. 使用以下格式在浏览器定位器栏中输入 URL。

   ```
   https://endpoint.rds.amazonaws.com:port/em
   ```

   例如，如果 Amazon RDS 数据库实例的端点为 `mydb.a1bcde234fgh.us-east-1.rds.amazonaws.com`，而 EM Express 端口为 `1158`，则使用以下 URL 访问 EM Express。

   ```
   1. https://mydb.f9rbfa893tft.us-east-1.rds.amazonaws.com:1158/em
   ```

1. 当系统提示您输入登录详细信息时，根据数据库架构，执行以下操作之一：  
**数据库为非 CDB。**  
键入数据库实例的主用户名和主密码。  
**数据库为 CDB。**  
对于用户输入 `DBSNMP`，并输入 `DBSNMP` 密码。将 `Container` 字段留空。

## 修改 OEM Database 设置
<a name="Appendix.Oracle.Options.OEM_DBControl.ModifySettings"></a>

启用 OEM Database 后，可以修改该选项的安全组设置。

将选项组与数据库实例相关联后，将无法修改 OEM 端口号。要更改数据库实例的 OEM 端口号，可执行以下操作：

1. 创建新的选项组。

1. 将具有新端口号的 OEM 选项添加到新选项组。

1. 删除数据库实例的现有选项组。

1. 将新选项组添加到数据库实例。

有关如何修改选项设置的更多信息，请参阅 [修改选项设置](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.ModifyOption)。有关各项设置的更多信息，请参阅[OEM 选项设置](#Appendix.Oracle.Options.OEM_DBControl.Options)。

## 运行 OEM Database Express 任务
<a name="Appendix.Oracle.Options.OEM_DBControl.DBTasks"></a>

您可以使用 Amazon RDS 过程运行某些 OEM Database Express 任务。通过运行这些过程，您可以执行下面列出的任务。

**注意**  
OEM Database Express 任务异步运行。

**Topics**
+ [将 OEM Database Express 的网站前端切换到 Adobe Flash](#Appendix.Oracle.Options.OEM_DBControl.DBTasks.FrontEndToFlash)
+ [将 OEM Database Express 的网站前端切换到 Oracle JET](#Appendix.Oracle.Options.OEM_DBControl.DBTasks.FrontEndToOracleJET)

### 将 OEM Database Express 的网站前端切换到 Adobe Flash
<a name="Appendix.Oracle.Options.OEM_DBControl.DBTasks.FrontEndToFlash"></a>

**注意**  
此任务仅适用于 Oracle Database 19c 非 CDB。

从 Oracle Database 19c 开始，Oracle 已弃用以前的 OEM Database Express 用户界面，该界面是基于 Adobe Flash 的。相反，OEM Database Express 现在使用通过 Oracle JET 构建的界面。如果您在使用新界面时遇到困难，可以切换回已弃用的基于 Flash 的界面。可能遇到的困难包括登录 OEM Database Express 后卡在 `Loading` 屏幕上。您可能还会失去基于 Flash 的 OEM Database Express 版本中存在的某些功能。

要将 OEM Database Express 网站前端切换到 Adobe Flash，请运行 Amazon RDS 过程 `rdsadmin.rdsadmin_oem_tasks.em_express_frontend_to_flash`。该过程相当于 `execemx emx` SQL 命令。

安全最佳实践不鼓励使用 Adobe Flash。虽然您可以恢复到基于 Flash 的 OEM Database Express，但我们建议您尽可能使用基于 JET 的 OEM Database Express 网站。如果您恢复使用 Adobe Flash 并希望切换回使用 Oracle JET，请使用 `rdsadmin.rdsadmin_oem_tasks.em_express_frontend_to_jet` 过程。Oracle 数据库升级后，较新版本的 Oracle JET 可能会解决 OEM Database Express 中与 JET 相关的问题。有关切换到 Oracle JET 的更多信息，请参阅[将 OEM Database Express 的网站前端切换到 Oracle JET](#Appendix.Oracle.Options.OEM_DBControl.DBTasks.FrontEndToOracleJET)。

**注意**  
从只读副本的源数据库实例运行此任务也会导致只读副本将其 OEM Database Express 网站前端切换到 Adobe Flash。

以下过程调用将创建一个任务，以将 OEM Database Express 网站切换到 Adobe Flash，并返回任务的 ID。

```
SELECT rdsadmin.rdsadmin_oem_tasks.em_express_frontend_to_flash() as TASK_ID from DUAL;
```

您可以通过显示任务的输出文件来查看结果。

```
SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-task-id.log'));
```

将 *`task-id`* 替换为由此过程返回的任务 ID。有关 Amazon RDS 过程 `rdsadmin.rds_file_util.read_text_file` 的更多信息，请参阅[读取数据库实例目录中的文件](Appendix.Oracle.CommonDBATasks.Misc.md#Appendix.Oracle.CommonDBATasks.ReadingFiles)。

您还可以通过在 **Logs & events (日志和事件)** 部分中搜索 AWS 管理控制台 的相关日志条目，查看 `task-id` 中的任务输出文件的内容。

### 将 OEM Database Express 的网站前端切换到 Oracle JET
<a name="Appendix.Oracle.Options.OEM_DBControl.DBTasks.FrontEndToOracleJET"></a>

**注意**  
此任务仅适用于 Oracle Database 19c 非 CDB。

要将 OEM Database Express 网站前端切换到 Oracle JET，请运行 Amazon RDS 过程 `rdsadmin.rdsadmin_oem_tasks.em_express_frontend_to_jet`。该过程相当于 `execemx omx` SQL 命令。

默认情况下，运行 19c 或更高版本的 Oracle 数据库实例的 OEM Database Express 网站使用 Oracle JET。如果您使用了 `rdsadmin.rdsadmin_oem_tasks.em_express_frontend_to_flash` 过程将 OEM Database Express 网站前端切换到 Adobe Flash，则可以切换回 Oracle JET。要执行此操作，请使用 `rdsadmin.rdsadmin_oem_tasks.em_express_frontend_to_jet` 过程。有关切换到 Adobe Flash 的更多信息，请参阅[将 OEM Database Express 的网站前端切换到 Adobe Flash](#Appendix.Oracle.Options.OEM_DBControl.DBTasks.FrontEndToFlash)。

**注意**  
从只读副本的源数据库实例运行此任务也会导致只读副本将其 OEM Database Express 网站前端切换到 Oracle JET。

以下过程调用将创建一个任务以将 OEM Database Express 网站切换到 Oracle JET，并返回任务的 ID。

```
SELECT rdsadmin.rdsadmin_oem_tasks.em_express_frontend_to_jet() as TASK_ID from DUAL;
```

您可以通过显示任务的输出文件来查看结果。

```
SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-task-id.log'));
```

将 *`task-id`* 替换为由此过程返回的任务 ID。有关 Amazon RDS 过程 `rdsadmin.rds_file_util.read_text_file` 的更多信息，请参阅[读取数据库实例目录中的文件](Appendix.Oracle.CommonDBATasks.Misc.md#Appendix.Oracle.CommonDBATasks.ReadingFiles)。

您还可以通过在 **Logs & events (日志和事件)** 部分中搜索 AWS 管理控制台 的相关日志条目，查看 `task-id` 中的任务输出文件的内容。

## 删除 OEM Database 选项
<a name="Appendix.Oracle.Options.OEM_DBControl.Remove"></a>

可以从数据库实例中删除 OEM 选项。如果删除 OEM 选项，实例在自动重新启动时会出现短暂中断。因此，在删除 OEM 选项后，不需要重新启动数据库实例。

要从数据库实例中删除 OEM 选项，请执行下列操作之一：
+ 从“OEM ”选项所属的选项组中删除该选项。此更改会影响使用该选项组的所有数据库实例。有关更多信息，请参阅“[从选项组中删除选项](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.RemoveOption)”。
+ 修改数据库实例，并指定不包含“OEM ”选项的另一个选项组。此更改会影响单个数据库实例。您可以指定默认 (空) 选项组，或指定其他自定义选项组。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

# 适用于 Enterprise Manager Cloud Control 的 Oracle Management Agent
<a name="Oracle.Options.OEMAgent"></a>

Oracle Enterprise Manager (OEM) Management Agent 是一种软件组件，可监控在主机上运行的目标并将该信息传达到中间层 Oracle Management Service (OMS)。Amazon RDS 通过使用 `OEM_AGENT` 选项支持 Management Agent。

有关更多信息，请参阅 Oracle 文档中的 [Oracle Enterprise Manager Cloud Control 12c 概述](http://docs.oracle.com/cd/E24628_01/doc.121/e25353/overview.htm)和 [Oracle Enterprise Manager Cloud Control 13c 概述](http://docs.oracle.com/cd/E63000_01/EMCON/overview.htm#EMCON109)。

**Topics**
+ [Management Agent 的要求](#Oracle.Options.OEMAgent.PreReqs)
+ [OMS 主机通信先决条件](#Oracle.Options.OEMAgent.PreReqs.host)
+ [Management Agent 的限制](#Oracle.Options.OEMAgent.limitations)
+ [Management Agent 的选项设置](#Oracle.Options.OEMAgent.Options)
+ [为数据库实例启用 Management Agent 选项](#Oracle.Options.OEMAgent.Enable)
+ [删除 Management Agent 选项](#Oracle.Options.OEMAgent.Remove)
+ [使用 Management Agent 执行数据库任务](#Oracle.Options.OEMAgent.DBTasks)

## Management Agent 的要求
<a name="Oracle.Options.OEMAgent.PreReqs"></a>

以下是使用 Management Agent 的一般要求：
+ 数据库实例必须运行 Oracle Database 19c（19.0.0.0）。可以使用 CDB 或非 CDB 架构。
+ 您必须使用配置为连接到您的数据库实例的 Oracle Management Service（OMS）。请注意以下 OMS 要求：
  + Management Agent 版本 13.5.0.0.v2 和 13.5.0.0.v3 需要 OMS 版本 13.5.0.23 或 24.1。
  + Management Agent 版本 13.5.0.0.v1 需要 OMS 版本 13.5.0.0 或 24.1。
  + Management Agent 版本 13.4.0.9.v1 和 13.4.0.9.v2 需要 OMS 版本 13.4.0.9 或更高版本及补丁 32198287。
+ 在大多数情况下，您必须配置 VPC 以允许 OMS 与数据库实例之间的连接。如果您不熟悉 Amazon Virtual Private Cloud (Amazon VPC)，建议您在继续之前先完成 [教程：创建 VPC 以用于数据库实例（仅限 IPv4）](CHAP_Tutorials.WebServerDB.CreateVPC.md) 中的步骤。
+ 您可以将 Management Agent 与适用于 12c 和 13c 的 Oracle Enterprise Manager Cloud Control 结合使用。确保您的 OEM 版本有足够的存储空间：
  + OEM 13c 版本 5 至少 8.5GiB
  + OEM 13c 版本 4 至少 8.5 GiB
  + OEM 13c 版本 3 至少 8.5 GiB
  + OEM 13c 版本 2 至少 5.5 GiB
  + OEM 13c 版本 1 至少 4.5 GiB
  + OEM 12c 至少 2.5 GiB
+ 如果您使用的是 Management Agent 版本 `OEM_AGENT 13.2.0.0.v3` 和 `13.3.0.0.v2`，并且想要使用 TCPS 连接，请按照 Oracle 文档中的[配置第三方 CA 证书以便与目标数据库通信](https://docs.oracle.com/cd/E73210_01/EMSEC/GUID-8337AD48-1A32-4CD5-84F3-256FAE93D043.htm#EMSEC15996)中的说明进行操作。另外，按照 Oracle 文档 ID 为 2241358.1 的 Oracle 文档中的说明更新 OMS 上的 JDK。此步骤可确保 OMS 支持数据库支持的所有密码套件。
**注意**  
Management Agent `OEM_AGENT 13.2.0.0.v3`、`13.3.0.0.v2`、`13.4.0.9.v1` 和更高版本支持 Management Agent 和数据库实例之间的 TCPS 连接。

## OMS 主机通信先决条件
<a name="Oracle.Options.OEMAgent.PreReqs.host"></a>

确保您的 OMS 主机和您的 Amazon RDS 数据库实例可以通信。执行以下操作：
+ 当 OMS 主机位于防火墙后时，要从 Management Agent 连接到 OMS 主机，请将数据库实例的 IP 地址添加到防火墙中。确保 OMS 防火墙允许以下网络流量：  
从 OMS 主机到数据库实例  
配置单向防火墙规则，以便支持从 OMS 主机到数据库侦听器端口（默认为 1521）和 OEM Agent 端口（默认为 3872）的流量。  
从数据库实例到 OMS 主机  
配置单向防火墙规则，以便支持从数据库实例到 OMS HTTP 端口（默认为 4903）的流量。
+ 要从 OMS 连接到 Management Agent（如果 OMS 具有一个可公开解析的主机名），需将该 OMS 地址添加到安全组。您的安全组必须拥有允许访问数据库侦听器端口和 Management Agent 端口的入站规则。有关创建安全组并添加入站规则的示例，请参阅[教程：创建 VPC 以用于数据库实例（仅限 IPv4）](CHAP_Tutorials.WebServerDB.CreateVPC.md)。
+ 要从 OMS 连接到 Management Agent (如果 OMS 没有可公开解析的主机名)，请使用下列项目之一：
  + 如果 OMS 已在私有 VPC 中的 Amazon Elastic Compute Cloud (Amazon EC2) 实例上托管，则可设置 VPC 对等连接以从 OMS 连接到 Management Agent。有关更多信息，请参阅“[VPC 中的数据库实例由另一 VPC 中的 EC2 实例访问](USER_VPC.Scenarios.md#USER_VPC.Scenario3)”。
  + 如果您的 OMS 已在本地托管，则可设置 VPN 连接以允许从 OMS 访问 Management Agent。有关更多信息，请参阅 [VPC 中的数据库实例由客户端应用程序通过互联网访问](USER_VPC.Scenarios.md#USER_VPC.Scenario4)或 [VPN 连接](https://docs.aws.amazon.com/vpc/latest/userguide/vpn-connections.html)。
+ 要将 OEM Management Agent 版本 13.5.0.0（v1-v3）连接到 24.1 OMS 主机，请在配置选项中将 `MINIMUM_TLS_VERSION` 设置为使用 TLS 1.2 协议 `TLSv1.2`。

## Management Agent 的限制
<a name="Oracle.Options.OEMAgent.limitations"></a>

以下是使用 Management Agent 的一些限制：
+ 您无法提供自定义 Oracle 管理代理映像。
+ 不支持需要主机凭证的管理任务（例如作业执行和数据库修补）。
+ 不保证主机指标和进程列表反映实际的系统状态。因此，您不应使用 OEM 来监视根文件系统或挂载点文件系统。有关监控操作系统的更多信息，请参阅 [使用增强监控来监控操作系统指标](USER_Monitoring.OS.md)。
+ 不支持自动发现。您必须手动添加数据库目标。
+ OMS 模块可用性取决于数据库版本。例如，数据库性能诊断和优化模块仅适用于 Oracle Database 企业版。
+ Management Agent 会占用额外的内存和计算资源。如果您在启用 `OEM_AGENT` 选项后遇到了性能问题，建议您向上扩展至更大的数据库实例类。有关更多信息，请参阅“[数据库实例类](Concepts.DBInstanceClass.md)”和“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。
+ 在 Amazon RDS 主机上运行 `OEM_AGENT` 的用户没有对警报日志的操作系统访问权限。因此，您无法收集 OEM 中 `DB Alert Log` 和 `DB Alert Log Error Status` 的指标。

## Management Agent 的选项设置
<a name="Oracle.Options.OEMAgent.Options"></a>

Amazon RDS 支持 Management Agent 选项的以下设置。


| 选项设置 | 必需 | 有效值 | 描述 | 
| --- | --- | --- | --- | 
|  **版本** (`AGENT_VERSION`)  |  是  |  `13.5.0.0.v3` `13.5.0.0.v2` `13.5.0.0.v1` `13.4.0.9.v2` `13.4.0.9.v1` `13.3.0.0.v2` `13.3.0.0.v1` `13.2.0.0.v3` `13.2.0.0.v2` `13.2.0.0.v1` `13.1.0.0.v1`  |  Management Agent 软件的版本。支持的最低版本为 `13.1.0.0.v1`。 AWS CLI 选项名称为 `OptionVersion`。  在 AWS GovCloud (US)区域中，13.1 版本不可用。   | 
|  **端口** (`AGENT_PORT`)  |  是  |  一个整数值  |  侦听 OMS 主机的数据库实例上的端口。默认值为 3872。您的 OMS 主机必须属于对此端口具有访问权限的安全组。 AWS CLI 选项名称为 `Port`。  | 
|  ** 安全组**  |  是  |  现有安全组  |  对 **Port** 具有访问权限的安全组。您的 OMS 主机必须属于此安全组。 AWS CLI 选项名称为 `VpcSecurityGroupMemberships` 或 `DBSecurityGroupMemberships`。  | 
|  **OMS\$1HOST**  |  是  |  一个字符串值，例如 *my.example.oms*   |  OMS 的可公开访问的主机名或 IP 地址。 AWS CLI 选项名称为 `OMS_HOST`。  | 
|  **OMS\$1PORT**  |  是  |  一个整数值  |  OMS 主机上侦听 Management Agent 的 HTTPS 上传端口。 要确定 HTTPS 上传端口，请连接到 OMS 主机，然后运行以下命令 (此操作需要 `SYSMAN` 密码)： emctl status oms -details  AWS CLI 选项名称为 `OMS_PORT`。  | 
|  **AGENT\$1REGISTRATION\$1PASSWORD**  |  是  |  一个字符串值  |  Management Agent 用于通过 OMS 自行进行身份验证的密码。建议您在启用 `OEM_AGENT` 选项之前先在 OMS 中创建一个永久性密码。使用永久性密码，您可以在多个 Amazon RDS 数据库之中共享一个 Management Agent 选项组。 AWS CLI 选项名称为 `AGENT_REGISTRATION_PASSWORD`。  | 
|  **ALLOW\$1TLS\$1ONLY**  |  否  |  `true`、`false`（默认值）  |  一个值，该值将 OEM 代理配置为仅在代理作为服务器侦听时支持 `TLSv1` 协议。不再支持此设置。默认情况下，Management Agent 版本 13.1.0.0.v1 及更高版本支持传输层安全性协议（TLS）。  | 
|  **MINIMUM\$1TLS\$1VERSION**  |  否  |  `TLSv1` (默认值)`TLSv1.2`  |  一个值，该值指定 OEM 代理在代理作为服务器侦听时支持的最低 TLS 版本。失去支持的代理版本仅支持 `TLSv1` 设置。 要将 13.5.0.0（v1-v3）连接到 24.1 OMS 主机，请将其设置为 `TLSv1.2`。  | 
|  **TLS\$1CIPHER\$1SUITE**  |  否  |  请参阅[Management Agent 的选项设置](#Oracle.Options.OEMAgent.Options)。  |  一个值，该值指定 OEM 代理在代理作为服务器侦听时使用的 TLS 密码套件。  | 

下表列出了 Management Agent 选项支持的 TLS 密码套件。


| 密码套件 | 支持的引擎版本 | 符合 FedRAMP 要求 | 
| --- | --- | --- | 
| TLS\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA | 全部 | 否 | 
| TLS\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA256 | 13.1.0.0.v1 及更高版本 | 否 | 
| TLS\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA | 13.2.0.0.v3 及更高版本 | 否 | 
| TLS\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA256 | 13.2.0.0.v3 及更高版本 | 否 | 
| TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA | 13.2.0.0.v3 及更高版本 | 是 | 
| TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA | 13.2.0.0.v3 及更高版本 | 是 | 
| TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA256 | 13.2.0.0.v3 及更高版本 | 是 | 
| TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA384 | 13.2.0.0.v3 及更高版本 | 是 | 
| TLS\$1ECDHE\$1ECDSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 | 13.4.0.9.v1 及更高版本 | 是 | 
| TLS\$1ECDHE\$1ECDSA\$1WITH\$1AES\$1256\$1CBC\$1SHA384 | 13.4.0.9.v1 及更高版本 | 是 | 

### 证书与密码套件的兼容性
<a name="Oracle.Options.OEMAgent.CertificateCompatibility"></a>

RDS for Oracle 同时支持 RSA 和椭圆曲线数字签名算法（ECDSA）证书。在为数据库实例配置 OEM Agent 选项时，必须确保在 `TLS_CIPHER_SUITE` 选项设置中指定的密码套件与数据库实例使用的证书类型兼容。

下表展示了证书类型和密码套件之间的兼容性：


| 证书类型 | 兼容的密码套件 | 不兼容的密码套件 | 
| --- | --- | --- | 
| RSA 证书（rds-ca-2019、rds-ca-rsa2048-g1、rds-ca-rsa4096-g1） |  TLS\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA TLS\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA256 TLS\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA TLS\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA256 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA256 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA384  |  TLS\$1ECDHE\$1ECDSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 TLS\$1ECDHE\$1ECDSA\$1WITH\$1AES\$1256\$1CBC\$1SHA384  | 
| ECDSA 证书（rds-ca-ecc384-g1） |  TLS\$1ECDHE\$1ECDSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 TLS\$1ECDHE\$1ECDSA\$1WITH\$1AES\$1256\$1CBC\$1SHA384  |  TLS\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA TLS\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA256 TLS\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA TLS\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA256 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA256 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA384  | 

在 `TLS_CIPHER_SUITE` 选项设置中指定密码套件时，请确保其与数据库实例所用的证书类型兼容。如果您尝试将选项组与包含和数据库实例的证书类型不兼容的密码套件的 OEM Agent 选项相关联，操作将失败，并显示一条错误消息，指出不兼容。

## 为数据库实例启用 Management Agent 选项
<a name="Oracle.Options.OEMAgent.Enable"></a>

要启用 Management Agent 选项，请使用以下步骤：

**Topics**
+ [步骤 1：将 Management Agent 选项添加到数据库实例](#Oracle.Options.OEMAgent.Add)
+ [步骤 2：解锁 DBSNMP 用户账户](#Oracle.Options.OEMAgent.DBSNMP)
+ [步骤 3：将目标添加到 Management Agent 控制台](#Oracle.Options.OEMAgent.Using)

### 步骤 1：将 Management Agent 选项添加到数据库实例
<a name="Oracle.Options.OEMAgent.Add"></a>

要将 Management Agent 选项添加到数据库实例，请执行以下操作：

1. 创建新的选项组，或者复制或修改现有选项组。

1. 将 选项添加到该选项组。

1. 将选项组与数据库实例相关联。

如果遇到错误，请查看[我的 Oracle 支持](https://support.oracle.com/)文档以了解有关解决特定问题的信息。

在添加“Management Agent”选项后，您无需重新启动数据库实例。只要选项组处于活动状态，OEM Agent 就处于活动状态。

如果 OMS 主机使用的是不受信任的第三方证书，则 Amazon RDS 将返回以下错误。

```
You successfully installed the OEM_AGENT option. Your OMS host is using an untrusted third party certificate. 
Configure your OMS host with the trusted certificates from your third party.
```

如果返回此错误，则在更正问题之前，不会启用 Management Agent 选项。有关更正问题的信息，请参阅“我的 Oracle 支持”文档 [2202569.1](https://support.oracle.com/epmos/faces/DocContentDisplay?id=2202569.1)。

#### 控制台
<a name="Oracle.Options.OEMAgent.Add.Console"></a>

**将 Management Agent 选项添加到数据库实例**

1. 确定您想要使用的选项组。您可以创建新的选项组，或使用现有选项组。如果您想使用现有选项组，请跳到下一步。或者，通过以下设置创建自定义数据库选项组：

   1. 对于**引擎**，请选择适用于您的数据库实例的 Oracle 版本。

   1. 对于**主引擎版本**，请选择数据库实例的版本。

   有关更多信息，请参阅“[创建选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)”。

1. 将 **OEM\$1AGENT** 选项添加到选项组，然后配置选项设置。有关添加选项的更多信息，请参阅 [将选项添加到选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption)。有关各项设置的更多信息，请参阅[Management Agent 的选项设置](#Oracle.Options.OEMAgent.Options)。

1. 将选项组应用到新的或现有的数据库实例：
   + 对于新数据库实例，您可以在启动实例时应用选项组。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。
   + 对于现有数据库实例，您可以通过修改实例并附加新的选项组来应用选项组。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

#### AWS CLI
<a name="Oracle.Options.OEMAgent.Add.CLI"></a>

以下示例使用 AWS CLI [add-option-to-option-group](https://docs.aws.amazon.com/cli/latest/reference/rds/add-option-to-option-group.html) 命令将 `OEM_AGENT` 选项添加到名为 `myoptiongroup` 的选项组。

对于 Linux、macOS 或 Unix：

```
aws rds add-option-to-option-group \
    --option-group-name "myoptiongroup" \
    --options OptionName=OEM_AGENT,OptionVersion=13.1.0.0.v1,Port=3872,VpcSecurityGroupMemberships=sg-1234567890,OptionSettings=[{Name=OMS_HOST,Value=my.example.oms},{Name=OMS_PORT,Value=4903},{Name=AGENT_REGISTRATION_PASSWORD,Value=password}] \
    --apply-immediately
```

对于：Windows

```
aws rds add-option-to-option-group ^
    --option-group-name "myoptiongroup" ^
    --options OptionName=OEM_AGENT,OptionVersion=13.1.0.0.v1,Port=3872,VpcSecurityGroupMemberships=sg-1234567890,OptionSettings=[{Name=OMS_HOST,Value=my.example.oms},{Name=OMS_PORT,Value=4903},{Name=AGENT_REGISTRATION_PASSWORD,Value=password}] ^
    --apply-immediately
```

### 步骤 2：解锁 DBSNMP 用户账户
<a name="Oracle.Options.OEMAgent.DBSNMP"></a>

Management Agent 使用 `DBSNMP` 用户账户连接到数据库，并向 Oracle Enterprise Manager 报告问题。在 CDB 中，`DBSNMP` 是普通用户。Management Agent 和 OEM Database Express 都需要此用户账户。默认情况下，此账户处于锁定状态。解锁此账户的过程会有所不同，具体取决于数据库使用的是非 CDB 还是 CDB 架构。

**解锁 DBSNMP 用户账户**

1. 在 SQL\$1Plus 或其他 Oracle SQL 应用程序中，以主用户身份登录到数据库实例。

1. 根据数据库架构，执行以下操作之一：  
**数据库为非 CDB。**  
运行以下 SQL 语句：  

   ```
   1. ALTER USER dbsnmp IDENTIFIED BY new_password ACCOUNT UNLOCK;
   ```  
**数据库为 CDB。**  
运行以下存储过程来解锁 `DBSNMP` 账户：  

   ```
   1. EXEC rdsadmin.rdsadmin_util.reset_oem_agent_password('new_password');
   ```
如果您收到错误消息，指出该过程不存在，请重启 CDB 实例来自动安装它。有关更多信息，请参阅 [重启数据库实例](USER_RebootInstance.md)。

### 步骤 3：将目标添加到 Management Agent 控制台
<a name="Oracle.Options.OEMAgent.Using"></a>

要将数据库实例添加为目标，请确保您知道端点和端口。有关查找 Amazon RDS 数据库实例的端点的信息，请参阅 [查找 RDS for Oracle 数据库实例的端点](USER_Endpoint.md)。如果数据库使用 CDB 架构，则将 `CDB$ROOT` 容器单独添加为目标。

**将目标添加到 Management Agent 控制台**

1. 在 OMS 控制台中，选择 **Setup**、**Add Target**、**Add Targets Manually**。

1. 选择 **Add Targets Declaratively by Specifying Target Monitoring Properties**。

1. 对于 **Target Type**，选择 **Database Instance**。

1. 对于 **Monitoring Agent (监控代理)**，请选择标识符与 RDS 数据库实例标识符相同的代理。

1. 选择 **Add Manually**。

1. 输入 Amazon RDS 数据库实例的端点，或者从主机名列表中选择该端点。确保指定的主机名与 Amazon RDS 数据库实例的端点匹配。

1. 指定以下数据库属性：
   + 对于 **Target name (目标名称)**，输入一个名称。
   + 对于 **Database system name (数据库系统名称)**，输入一个名称。
   + 对于 **Monitor username (监控用户名)**，输入 **dbsnmp**。
   + 对于**监控密码**，输入[步骤 2：解锁 DBSNMP 用户账户](#Oracle.Options.OEMAgent.DBSNMP)中的密码。
   + 对于 **Role (角色)**，输入 **normal (正常)**。
   + 对于 **Oracle home path (Oracle 主路径)**，输入 **/oracle**。
   + 对于 **Listener Machine name**，已显示该代理标识符。
   + 对于 **Port (端口)**，输入数据库端口。RDS 默认端口为 1521。
   + 对于 **Database name (数据库名称)**，输入数据库的名称。如果数据库为 CDB，则此名称为 `RDSCDB`。

1. 选择 **Test Connection**。

1. 选择 **Next (下一步)**。目标数据库将显示在所监控资源的列表中。

## 删除 Management Agent 选项
<a name="Oracle.Options.OEMAgent.Remove"></a>

可以从数据库实例中删除 OEM Agent。删除 OEM Agent 后，您无需重新启动数据库实例。

要从数据库实例中删除 OEM Agent，请执行下列操作之一：
+ 从“OEM Agent”选项所属的选项组中删除该选项。此更改会影响使用该选项组的所有数据库实例。有关更多信息，请参阅“[从选项组中删除选项](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.RemoveOption)”。
+ 修改数据库实例，并指定不包含“OEM Agent”选项的另一个选项组。此更改会影响单个数据库实例。您可以指定默认 (空) 选项组，或指定其他自定义选项组。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

## 使用 Management Agent 执行数据库任务
<a name="Oracle.Options.OEMAgent.DBTasks"></a>

您可以使用 Amazon RDS 过程在 Management Agent 上运行某些 EMCTL 命令。通过运行这些过程，您可以执行下面列出的任务。

**注意**  
任务以异步方式执行。

**Topics**
+ [保护 Management Agent](#Oracle.Options.OEMAgent.DBTasks.SecureAgent)
+ [获取 Management Agent 的状态](#Oracle.Options.OEMAgent.DBTasks.GetAgentStatus)
+ [重新启动 Management Agent](#Oracle.Options.OEMAgent.DBTasks.RestartAgent)
+ [列出 Management Agent 监控的目标](#Oracle.Options.OEMAgent.DBTasks.ListTargets)
+ [列出 Management Agent 监控的收集线程](#Oracle.Options.OEMAgent.DBTasks.ListCollectionThreads)
+ [清除 Management Agent 的状态](#Oracle.Options.OEMAgent.DBTasks.ClearState)
+ [让 Management Agent 上载其 OMS](#Oracle.Options.OEMAgent.DBTasks.ForceUploadOMS)
+ [为 OMS 执行 ping 操作](#Oracle.Options.OEMAgent.DBTasks.PingOMS)
+ [查看正在执行的任务的状态](#Oracle.Options.OEMAgent.DBTasks.ViewTaskStatus)

### 保护 Management Agent
<a name="Oracle.Options.OEMAgent.DBTasks.SecureAgent"></a>

要保护 Management Agent，请运行 Amazon RDS 过程 `rdsadmin.rdsadmin_oem_agent_tasks.secure_oem_agent`。该过程相当于运行 `emctl secure agent` 命令。

以下过程创建一个任务来保护 Management Agent 并返回任务的 ID：

```
SELECT rdsadmin.rdsadmin_oem_agent_tasks.secure_oem_agent as TASK_ID from DUAL;
```

要显示任务的输出文件并查看结果，请参阅[查看正在执行的任务的状态](#Oracle.Options.OEMAgent.DBTasks.ViewTaskStatus)。

### 获取 Management Agent 的状态
<a name="Oracle.Options.OEMAgent.DBTasks.GetAgentStatus"></a>

要获取 Management Agent 的状态，请运行 Amazon RDS 过程 `rdsadmin.rdsadmin_oem_agent_tasks.get_status_oem_agent`。该过程相当于 `emctl status agent` 命令。

以下过程创建一个任务来获取管理代理的状态，并返回任务的 ID。

```
SELECT rdsadmin.rdsadmin_oem_agent_tasks.get_status_oem_agent() as TASK_ID from DUAL;
```

要显示任务的输出文件并查看结果，请参阅[查看正在执行的任务的状态](#Oracle.Options.OEMAgent.DBTasks.ViewTaskStatus)。

### 重新启动 Management Agent
<a name="Oracle.Options.OEMAgent.DBTasks.RestartAgent"></a>

要重新启动 Management Agent，请运行 Amazon RDS 过程 `rdsadmin.rdsadmin_oem_agent_tasks.restart_oem_agent`。该过程相当于运行 `emctl stop agent` 和 `emctl start agent` 命令。

以下过程创建一个任务来重新启动管理代理并返回任务的 ID。

```
SELECT rdsadmin.rdsadmin_oem_agent_tasks.restart_oem_agent as TASK_ID from DUAL;    
```

要显示任务的输出文件并查看结果，请参阅[查看正在执行的任务的状态](#Oracle.Options.OEMAgent.DBTasks.ViewTaskStatus)。

### 列出 Management Agent 监控的目标
<a name="Oracle.Options.OEMAgent.DBTasks.ListTargets"></a>

要列出 Management Agent 监控的目标，请运行 Amazon RDS 过程 `rdsadmin.rdsadmin_oem_agent_tasks.list_targets_oem_agent`。该过程相当于运行 `emctl config agent listtargets` 命令。

以下过程创建一个任务来列出管理代理监控的目标并返回任务的 ID。

```
SELECT rdsadmin.rdsadmin_oem_agent_tasks.list_targets_oem_agent as TASK_ID from DUAL;
```

要显示任务的输出文件并查看结果，请参阅[查看正在执行的任务的状态](#Oracle.Options.OEMAgent.DBTasks.ViewTaskStatus)。

### 列出 Management Agent 监控的收集线程
<a name="Oracle.Options.OEMAgent.DBTasks.ListCollectionThreads"></a>

要列出管理代理监控的所有正在运行、就绪和计划的收集线程，请运行 Amazon RDS 过程 `rdsadmin.rdsadmin_oem_agent_tasks.list_clxn_threads_oem_agent`。该过程相当于 `emctl status agent scheduler` 命令。

以下过程创建一个任务来列出收集线程并返回任务的 ID。

```
SELECT rdsadmin.rdsadmin_oem_agent_tasks.list_clxn_threads_oem_agent() as TASK_ID from DUAL;          
```

要显示任务的输出文件并查看结果，请参阅[查看正在执行的任务的状态](#Oracle.Options.OEMAgent.DBTasks.ViewTaskStatus)。

### 清除 Management Agent 的状态
<a name="Oracle.Options.OEMAgent.DBTasks.ClearState"></a>

要清除 Management Agent 的状态，请运行 Amazon RDS 过程 `rdsadmin.rdsadmin_oem_agent_tasks.clearstate_oem_agent`。该过程相当于运行 `emctl clearstate agent` 命令。

以下过程创建一个任务来清除管理代理的状态并返回任务的 ID。

```
SELECT rdsadmin.rdsadmin_oem_agent_tasks.clearstate_oem_agent() as TASK_ID from DUAL;
```

要显示任务的输出文件并查看结果，请参阅[查看正在执行的任务的状态](#Oracle.Options.OEMAgent.DBTasks.ViewTaskStatus)。

### 让 Management Agent 上载其 OMS
<a name="Oracle.Options.OEMAgent.DBTasks.ForceUploadOMS"></a>

要让 Management Agent 上载与其关联的 Oracle Management Server (OMS)，请运行 Amazon RDS 过程 `rdsadmin.rdsadmin_oem_agent_tasks.upload_oem_agent`。该过程相当于运行 `emclt upload agent` 命令。

以下过程创建一个任务，使 Management Agent 上传其关联的 OMS 并返回任务的 ID。

```
SELECT rdsadmin.rdsadmin_oem_agent_tasks.upload_oem_agent() as TASK_ID from DUAL;
```

要显示任务的输出文件并查看结果，请参阅[查看正在执行的任务的状态](#Oracle.Options.OEMAgent.DBTasks.ViewTaskStatus)。

### 为 OMS 执行 ping 操作
<a name="Oracle.Options.OEMAgent.DBTasks.PingOMS"></a>

要为 Management Agent 的 OMS 执行 ping 操作，请运行 Amazon RDS 过程 `rdsadmin.rdsadmin_oem_agent_tasks.ping_oms_oem_agent`。该过程相当于运行 `emctl pingOMS` 命令。

以下过程创建一个任务来 Ping 管理代理的 OMS 并返回任务的 ID。

```
SELECT rdsadmin.rdsadmin_oem_agent_tasks.ping_oms_oem_agent() as TASK_ID from DUAL;
```

要显示任务的输出文件并查看结果，请参阅[查看正在执行的任务的状态](#Oracle.Options.OEMAgent.DBTasks.ViewTaskStatus)。

### 查看正在执行的任务的状态
<a name="Oracle.Options.OEMAgent.DBTasks.ViewTaskStatus"></a>

您可以查看 bdump 文件中的持续任务的状态。bdump 文件位于 `/rdsdbdata/log/trace` 目录下。每个 bdump 文件名称格式如下。

```
dbtask-task-id.log 
```

如果要监控任务，请将 `task-id` 替换为要监控的任务的 ID。

要查看 bdump 文件的内容，请运行 Amazon RDS 过程 `rdsadmin.rds_file_util.read_text_file`。以下查询返回 `dbtask-1546988886389-2444.log` bdump 文件的内容。

```
SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-1546988886389-2444.log'));
```

有关 Amazon RDS 过程 `rdsadmin.rds_file_util.read_text_file` 的更多信息，请参阅[读取数据库实例目录中的文件](Appendix.Oracle.CommonDBATasks.Misc.md#Appendix.Oracle.CommonDBATasks.ReadingFiles)。

# Oracle Label Security
<a name="Oracle.Options.OLS"></a>

Amazon RDS 通过使用 OLS 选项支持 Oracle Database 企业版的 Oracle Label Security。

大多数数据库安全性控制对象级别的访问。Oracle Label Security 提供对针对各个表格行的访问的精细控制。例如，您可以使用 Label Security 通过基于策略的管理模型实施法规合规性。您可以使用 Label Security 策略控制对敏感数据的访问，并限制对具有相应清除级别的用户的访问。有关更多信息，请参阅 Oracle 文档中的 [Oracle Label Security 简介](https://docs.oracle.com/database/121/OLSAG/intro.htm#OLSAG001)。

**Topics**
+ [Oracle Label Security 的要求](#Oracle.Options.OLS.PreReqs)
+ [使用 Oracle Label Security 时的注意事项](#Oracle.Options.OLS.Using)
+ [添加“Oracle Label Security”选项](#Oracle.Options.OLS.Add)
+ [问题排查](#Oracle.Options.OLS.Troubleshooting)

## Oracle Label Security 的要求
<a name="Oracle.Options.OLS.PreReqs"></a>

熟悉 Oracle Label Security 的以下要求：
+ 数据库实例必须使用自带许可模式。有关更多信息，请参阅“[RDS for Oracle 许可选项](Oracle.Concepts.Licensing.md)”。
+ 您必须拥有 Oracle 企业版的有效许可证以及软件更新许可证和支持。
+ 您的 Oracle 许可证必须包含 Label Security 选项。

## 使用 Oracle Label Security 时的注意事项
<a name="Oracle.Options.OLS.Using"></a>

要使用 Oracle Label Security，请创建可控制对您表格中特定行的访问的策略。有关更多信息，请参阅 Oracle 文档中的[创建 Oracle Label Security 策略](https://docs.oracle.com/database/121/OLSAG/getstrtd.htm#OLSAG3096)。

请考虑以下事项：
+ Oracle Label Security 是永久性的持续选项。因为该选项是永久性的，所以不能将其从选项组中删除。如果您将 Oracle Label Security 添加到选项组并将其与您的数据库实例关联，则可以稍后将其他选项组与您的数据库实例关联，但该组还必须包含 Oracle Label Security 选项。
+ 使用 Label Security 时，您以 `LBAC_DBA` 角色执行所有操作。数据库实例的主用户将被授予 `LBAC_DBA` 角色。您可以向其他用户授予 `LBAC_DBA` 角色，以便他们可以管理 Label Security 策略。
+ 请确保将对 `OLS_ENFORCEMENT` 程序包的访问权限授予需要访问 Oracle Label Security 的任何新用户。要授予对 `OLS_ENFORCEMENT` 包的访问权限，请以主用户身份连接到数据库实例，然后运行以下 SQL 语句：

  ```
  GRANT ALL ON LBACSYS.OLS_ENFORCEMENT TO username;
  ```
+ 可以通过 Oracle Enterprise Manager（OEM）Cloud Control 配置 Label Security。Amazon RDS 通过 Management Agent 选项支持 OEM Cloud Control。有关更多信息，请参阅 [适用于 Enterprise Manager Cloud Control 的 Oracle Management Agent](Oracle.Options.OEMAgent.md)。

## 添加“Oracle Label Security”选项
<a name="Oracle.Options.OLS.Add"></a>

将“Oracle Label Security”选项添加到数据库实例的一般过程如下所示：

1. 创建新的选项组，或者复制或修改现有选项组。

1. 将 选项添加到该选项组。
**重要**  
Oracle Label Security 是永久性的持续选项。

1. 将选项组与数据库实例相关联。

在添加“Label Security”选项后，一旦激活该选项组，就会激活 Label Security。

**将“Label Security”选项添加到数据库实例**

1. 确定您想要使用的选项组。您可以创建新的选项组，或使用现有选项组。如果您想使用现有选项组，请跳到下一步。或者，通过以下设置创建自定义数据库选项组：

   1. 对于 **引擎**，请选择 **oracle-ee**。

   1. 对于**主引擎版本**，选择数据库实例的版本。

   有关更多信息，请参阅“[创建选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)”。

1. 将 **OLS** 选项添加到该选项组。有关添加选项的更多信息，请参阅 [将选项添加到选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption)。
**重要**  
如果您向已附加到一个或多个数据库实例的现有选项组添加“Label Security”，则将重新启动所有数据库实例。

1. 将选项组应用到新的或现有的数据库实例：
   + 对于新数据库实例，您可以在启动实例时应用选项组。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。

      
   + 对于现有数据库实例，您可以通过修改实例并附加新的选项组来应用选项组。如果您将“Label Security”选项添加到现有数据库实例，则在数据库实例自动重新启动时会出现短暂中断。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

## 问题排查
<a name="Oracle.Options.OLS.Troubleshooting"></a>

以下是您在使用 Oracle Label Security 时可能遇到的问题。


****  

| 问题 | 故障排除建议 | 
| --- | --- | 
|  当尝试创建策略时，您会看到一条与以下内容类似的错误消息：`insufficient authorization for the SYSDBA package`。  |  有关 Oracle 的 Label Security 功能的已知问题阻止了用户名为 16 或 24 个字符的用户运行 Label Security 命令。您可以使用其他数量的字符创建新用户，向该新用户授予 LBAC\$1DBA 角色，以该新用户的身份登录，并以该新用户的身份运行 OLS 命令。有关更多信息，请联系 Oracle Support。  | 

# Oracle Locator
<a name="Oracle.Options.Locator"></a>

Amazon RDS 通过使用 `LOCATOR` 选项支持 Oracle Locator。Oracle Locator 提供支持基于 Internet 和无线服务的应用程序与基于合作伙伴的 GIS 解决方案通常所需的功能。Oracle Locator 是 Oracle Spatial 的有限子集。有关更多信息，请参阅 Oracle 文档中的 [Oracle Locator](https://docs.oracle.com/database/121/SPATL/sdo_locator.htm#SPATL340)。

**重要**  
如果您使用 Oracle Locator，则当存在通用漏洞评分系统 (CVSS) 评分为 9\$1 的安全漏洞或其他公布的安全漏洞时，Amazon RDS 会自动将数据库实例更新为最新的 Oracle PSU。

## Oracle Locator 支持的数据库版本
<a name="Oracle.Options.Locator.Releases"></a>

RDS for Oracle 支持 Oracle Locator for Oracle Database 19c。Oracle Database 21c 不支持 Oracle Locator，但 Oracle Spatial 选项中提供了其功能。以前，Spatial 选项需要额外的许可证。Oracle Locator 是 Oracle Spatial 功能的子集，不需要额外的许可证。2019 年，Oracle 宣布，所有 Oracle Spatial 功能都包含在企业版和标准版 2 许可证中，无需额外费用。因此，Oracle Spatial 选项不再需要额外的许可。有关更多信息，请参阅 Oracle Database Insider 博客中的[Machine Learning、Spatial 和 Graph - 无需许可证！](https://blogs.oracle.com/database/post/machine-learning-spatial-and-graph-no-license-required)。

## Oracle Locator 的先决条件
<a name="Oracle.Options.Locator.PreReqs"></a>

以下是使用 Oracle Locator 的先决条件：
+ 数据库实例必须属于足够的类。db.t3.small 数据库实例类不支持 Oracle Locator。有关更多信息，请参阅 [RDS for Oracle 数据库实例类](Oracle.Concepts.InstanceClasses.md)。
+ 数据库实例必须已启用**自动次要版本升级**。该选项允许数据库实例在次要数据库引擎版本升级可用时自动接收这些升级，这对于安装 Oracle Java 虚拟机（JVM）的任意选项是必需的。Amazon RDS 使用该选项将数据库实例更新为最新的 Oracle 补丁集更新（PSU）或版本更新（RU）。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

## Oracle Locator 的最佳实践
<a name="Oracle.Options.Locator.BestPractces"></a>

以下是使用 Oracle Locator 的最佳实践：
+ 为了实现最高安全性，可将 `LOCATOR` 选项与安全套接字层 (SSL) 结合使用。有关更多信息，请参阅“[Oracle 安全套接字层](Appendix.Oracle.Options.SSL.md)”。
+ 配置数据库实例以限制对它的访问。有关更多信息，请参阅“[在 VPC 中访问数据库实例的场景](USER_VPC.Scenarios.md)”和“[在 VPC 中使用数据库实例](USER_VPC.WorkingWithRDSInstanceinaVPC.md)”。

## 添加 Oracle Locator 选项
<a name="Oracle.Options.Locator.Add"></a>

下面是将 `LOCATOR` 选项添加到数据库实例的一般过程：

1. 创建新的选项组，或者复制或修改现有选项组。

1. 将 选项添加到该选项组。

1. 将选项组与数据库实例相关联。

如果数据库实例上*未* 安装 Oracle Java 虚拟机 (JVM)，则添加 `LOCATOR` 选项时会出现短暂中断。如果数据库实例上已安装 Oracle Java 虚拟机 (JVM)，则不会出现中断。在添加 选项后，您无需重新启动数据库实例。只要选项组处于活动状态，Oracle Locator 就可用。

**注意**  
在该中断期间，将短暂禁用密码验证功能。您还可能会在中断期间看到与密码验证功能相关的事件。在 Oracle 数据库实例变得可用之前，将再次启用密码验证功能。

**将 `LOCATOR` 选项添加到数据库实例**

1. 确定您要使用的选项组。您可以创建新的选项组，或使用现有选项组。如果您想使用现有选项组，请跳到下一步。或者，通过以下设置创建自定义数据库选项组：

   1. 对于**引擎**，请选择适用于数据库实例的 Oracle 版本。

   1. 对于**主引擎版本**，选择数据库实例的版本。

   有关更多信息，请参阅“[创建选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)”。

1. 将 **LOCATOR** 选项添加到该选项组。有关添加选项的更多信息，请参阅 [将选项添加到选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption)。

1. 将选项组应用到新的或现有的数据库实例：
   + 对于新数据库实例，您可以在启动实例时应用选项组。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。
   + 对于现有数据库实例，您可以通过修改实例并附加新的选项组来应用选项组。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

## 使用 Oracle Locator
<a name="Oracle.Options.Locator.Using"></a>

在启用 Oracle Locator 选项后，可以开始使用它。您应仅使用 Oracle Locator 功能。请勿使用任何 Oracle Spatial 功能，除非您有 Oracle Spatial 的许可证。

有关 Oracle Locator 支持的功能的列表，请参阅 Oracle 文档中的 [Locator 附带的功能](https://docs.oracle.com/database/121/SPATL/sdo_locator.htm#GUID-EC6DEA23-8FD7-4109-A0C1-93C0CE3D6FF2__CFACCEEG)。

有关 Oracle Locator 不支持的功能的列表，请参阅 Oracle 文档中的 [Locator 未附带的功能](https://docs.oracle.com/database/121/SPATL/sdo_locator.htm#GUID-EC6DEA23-8FD7-4109-A0C1-93C0CE3D6FF2__CFABACEA)。

## 删除 Oracle Locator 选项
<a name="Oracle.Options.Locator.Remove"></a>

删除使用 `LOCATOR` 选项提供的数据类型的所有对象后，您可以从数据库实例中删除该选项。如果数据库实例上*未* 安装 Oracle Java 虚拟机 (JVM)，则删除 `LOCATOR` 选项时会出现短暂中断。如果数据库实例上已安装 Oracle Java 虚拟机 (JVM)，则不会出现中断。删除 `LOCATOR` 选项后，您无需重新启动数据库实例。

**删除 `LOCATOR` 选项**

1. 备份您的数据。
**警告**  
如果实例使用作为选项一部分启用的数据类型，并且您删除了 `LOCATOR` 选项，则可能会丢失数据。有关更多信息，请参阅“[备份、还原和导出数据](CHAP_CommonTasks.BackupRestore.md)”。

1. 检查是否有任何现有对象引用了 `LOCATOR` 选项的数据类型或功能。

   如果存在 `LOCATOR` 选项，则在应用无 `LOCATOR` 选项的新选项组时，实例可能会卡住。您可以使用以下查询标识对象：

   ```
   SELECT OWNER, SEGMENT_NAME, TABLESPACE_NAME, BYTES/1024/1024 mbytes
   FROM   DBA_SEGMENTS
   WHERE  SEGMENT_TYPE LIKE '%TABLE%'
   AND    (OWNER, SEGMENT_NAME) IN
          (SELECT DISTINCT OWNER, TABLE_NAME 
           FROM   DBA_TAB_COLUMNS
           WHERE  DATA_TYPE='SDO_GEOMETRY'
           AND    OWNER <> 'MDSYS')
   ORDER BY 1,2,3,4;
   
   SELECT OWNER, TABLE_NAME, COLUMN_NAME
   FROM   DBA_TAB_COLUMNS 
   WHERE  DATA_TYPE = 'SDO_GEOMETRY' 
   AND    OWNER <> 'MDSYS' 
   ORDER BY 1,2,3;
   ```

1. 删除引用了 `LOCATOR` 选项的数据类型或功能的任何对象。

1. 请执行下列操作之一：
   + 从 `LOCATOR` 选项所属的选项组中删除该选项。此更改会影响使用该选项组的所有数据库实例。有关更多信息，请参阅“[从选项组中删除选项](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.RemoveOption)”。
   + 修改数据库实例并指定不包含 `LOCATOR` 选项的另一个选项组。此更改会影响单个数据库实例。您可以指定默认 (空) 选项组，或指定其他自定义选项组。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

# Oracle 本机网络加密
<a name="Appendix.Oracle.Options.NetworkEncryption"></a>

Amazon RDS 支持 Oracle 本机网络加密 (NNE)。利用 `NATIVE_NETWORK_ENCRYPTION` 选项，您可以在数据进出数据库实例时对数据进行加密。Amazon RDS 支持所有版本的 Oracle Database 的 NNE。

详细讨论 Oracle Native Network Encryption 超出了本指南的范围，但在您确定部署解决方案前，应该了解每个算法和密钥的优缺点。有关通过 Oracle 本机网络加密提供的算法和密钥的信息，请参阅 Oracle 文档中的[配置网络数据加密](http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/11g/r2/prod/security/network_encrypt/ntwrkencrypt.htm)。有关AWS安全性的更多信息，请参阅[AWS安全中心](https://aws.amazon.com/security)。

**注意**  
您可以使用本机网络加密或安全套接字层，但不能同时使用二者。有关更多信息，请参阅 [Oracle 安全套接字层](Appendix.Oracle.Options.SSL.md)。

**Topics**
+ [NATIVE\$1NETWORK\$1ENCRYPTION 选项设置](Oracle.Options.NNE.Options.md)
+ [添加 NATIVE\$1NETWORK\$1ENCRYPTION 选项](Oracle.Options.NNE.Add.md)
+ [在 sqlnet.ora 中设置 NNE 值](Oracle.Options.NNE.Using.md)
+ [修改 NATIVE\$1NETWORK\$1ENCRYPTION 选项设置](Oracle.Options.NNE.ModifySettings.md)
+ [删除 NATIVE\$1NETWORK\$1ENCRYPTION 选项](Oracle.Options.NNE.Remove.md)

# NATIVE\$1NETWORK\$1ENCRYPTION 选项设置
<a name="Oracle.Options.NNE.Options"></a>

您可以在服务器和客户端上指定加密要求。例如，当数据库实例使用数据库链接连接到另一个数据库时，它可以充当客户端。您可能希望避免在服务器端强制加密。例如，您可能不希望强制所有客户端通信使用加密，因为服务器需要加密。在这种情况下，您可以使用 `SQLNET.*CLIENT` 选项强制在客户端加密。

Amazon RDS 支持 `NATIVE_NETWORK_ENCRYPTION` 选项的以下设置。

**注意**  
当您使用逗号分隔选项设置的值时，不要在逗号后面放置空格。


****  

| 选项设置 | 有效值 | 默认值 | 说明 | 
| --- | --- | --- | --- | 
|  `SQLNET.ALLOW_WEAK_CRYPTO_CLIENTS`  |  `TRUE`, `FALSE`  |  `TRUE`  |  使用非安全密码的客户端尝试连接到数据库时服务器的行为。如果为 `TRUE`，即使客户没有使用 2021 年 7 月 PSU 修补也可以连接。 如果设置为 `FALSE`，客户端只有在使用 2021 年 7 月 PSU 修补后才能连接到数据库。将 `SQLNET.ALLOW_WEAK_CRYPTO_CLIENTS` 设置为 `FALSE` 之前，确保满足以下条件： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/Oracle.Options.NNE.Options.html)  | 
|  `SQLNET.ALLOW_WEAK_CRYPTO`  |  `TRUE`, `FALSE`  |  `TRUE`  |  使用非安全密码的客户端尝试连接到数据库时服务器的行为。以下密码被视为不安全： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/Oracle.Options.NNE.Options.html) 如果设置为 `TRUE`，则客户端可以在使用上述非安全密码时进行连接。 如果设置为 `FALSE`，则数据库会在客户端可以在使用上述非安全密码时阻止客户端进行连接。将 `SQLNET.ALLOW_WEAK_CRYPTO` 设置为 `FALSE` 之前，确保满足以下条件： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/Oracle.Options.NNE.Options.html)  | 
|  `SQLNET.CRYPTO_CHECKSUM_CLIENT`  |  `Accepted`, `Rejected`, `Requested`, `Required`   |  `Requested`  |  当客户端或充当客户端的服务器连接到数据库实例时的数据集成行为。当数据库实例使用数据库链接时，它充当客户端。 `Requested` 表示数据库实例不需要数据库实例执行校验和。  | 
|  `SQLNET.CRYPTO_CHECKSUM_SERVER`  |  `Accepted`, `Rejected`, `Requested`, `Required`   |  `Requested`  |  客户端或充当客户端的服务器连接到数据库实例时的数据集成行为。当数据库实例使用数据库链接时，它充当客户端。 `Requested` 表示数据库实例不需要客户端执行校验和。  | 
|  `SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT`  |  `SHA256`, `SHA384`, `SHA512`, `SHA1`, `MD5`  |  `SHA256`, `SHA384`, `SHA512`  |  校验和算法的列表。 您可以指定一个值，也可以指定逗号分隔的值列表。如果您使用逗号，请不要在逗号后插入空格；否则，您会收到 `InvalidParameterValue` 错误。 此参数和 `SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER ` 必须有一个通用的密码。  | 
|  `SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER`  |  `SHA256`, `SHA384`, `SHA512`, `SHA1`, `MD5`  |  `SHA256`, `SHA384`, `SHA512`, `SHA1`, `MD5`  |  校验和算法的列表。 您可以指定一个值，也可以指定逗号分隔的值列表。如果您使用逗号，请不要在逗号后插入空格；否则，您会收到 `InvalidParameterValue` 错误。 此参数和 `SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT` 必须有一个通用的密码。  | 
|  `SQLNET.ENCRYPTION_CLIENT`  |  `Accepted`, `Rejected`, `Requested`, `Required`   |  `Requested`  |  客户端或充当客户端的服务器连接到数据库实例时的客户端加密行为。当数据库实例使用数据库链接时，它充当客户端。 `Requested` 表示数据库实例不需要给来自服务器的流量加密。  | 
|  `SQLNET.ENCRYPTION_SERVER`  |  `Accepted`, `Rejected`, `Requested`, `Required`   |  `Requested`  |  客户端或充当客户端的服务器连接到数据库实例时的服务器加密行为。当数据库实例使用数据库链接时，它充当客户端。 `Requested` 表示数据库实例不需要给来自客户端的流量加密。  | 
|  `SQLNET.ENCRYPTION_TYPES_CLIENT`  |  `RC4_256`, `AES256`, `AES192`, `3DES168`, `RC4_128`, `AES128`, `3DES112`, `RC4_56`, `DES`, `RC4_40`, `DES40`  |  `RC4_256`, `AES256`, `AES192`, `3DES168`, `RC4_128`, `AES128`, `3DES112`, `RC4_56`, `DES`, `RC4_40`, `DES40`  |  客户端使用的加密算法的列表。客户端尝试通过按顺序尝试每种算法来对服务器输入进行解密，直到某种算法成功或到达列表末尾。 Amazon RDS 使用 Oracle 中的下列默认列表。RDS 从 `RC4_256` 开始，然后沿列表按顺序下移。您可以更改顺序或限制数据库实例将接受的算法。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/Oracle.Options.NNE.Options.html) 您可以指定一个值，也可以指定逗号分隔的值列表。如果使用逗号，请不要在逗号后插入空格；否则，您会收到 `InvalidParameterValue` 错误。 此参数和 `SQLNET.SQLNET.ENCRYPTION_TYPES_SERVER` 必须有一个通用的密码。  | 
|  `SQLNET.ENCRYPTION_TYPES_SERVER`  |  `RC4_256`, `AES256`, `AES192`, `3DES168`, `RC4_128`, `AES128`, `3DES112`, `RC4_56`, `DES`, `RC4_40`, `DES40`  |  `RC4_256`, `AES256`, `AES192`, `3DES168`, `RC4_128`, `AES128`, `3DES112`, `RC4_56`, `DES`, `RC4_40`, `DES40`  |  数据库实例使用的加密算法的列表。数据库实例使用每种算法，以便尝试对客户端输入解密，直到某种算法成功或到达列表末尾。 Amazon RDS 使用 Oracle 中的下列默认列表。您可以更改顺序或限制客户端将接受的算法。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/Oracle.Options.NNE.Options.html) 您可以指定一个值，也可以指定逗号分隔的值列表。如果使用逗号，请不要在逗号后插入空格；否则，您会收到 `InvalidParameterValue` 错误。 此参数和 `SQLNET.SQLNET.ENCRYPTION_TYPES_SERVER` 必须有一个通用的密码。  | 

# 添加 NATIVE\$1NETWORK\$1ENCRYPTION 选项
<a name="Oracle.Options.NNE.Add"></a>

将 `NATIVE_NETWORK_ENCRYPTION` 选项添加到数据库实例的一般过程如下：

1. 创建新的选项组，或者复制或修改现有选项组。

1. 将 选项添加到该选项组。

1. 将选项组与数据库实例相关联。

当选项组处于活动状态时，NNE 就处于活动状态。

**使用 AWS 管理控制台将 NATIVE\$1NETWORK\$1ENCRYPTION 选项添加到数据库实例**

1. 对于 **Engine**，请选择要使用的 Oracle 版本。NNE 在所有版本中都受支持。

1. 对于**主引擎版本**，选择数据库实例的版本。

   有关更多信息，请参阅 [创建选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)。

1. 将 **NATIVE\$1NETWORK\$1ENCRYPTION** 选项添加到该选项组。有关添加选项的更多信息，请参阅 [将选项添加到选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption)。
**注意**  
添加 **NATIVE\$1NETWORK\$1ENCRYPTION** 选项后，您无需重新启动数据库实例。只要选项组处于活动状态，NNE 就处于活动状态。

1. 将选项组应用到新的或现有的数据库实例：
   + 对于新数据库实例，您可以在启动实例时应用选项组。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。
   + 对于现有数据库实例，您可以通过修改实例并附加新的选项组来应用选项组。添加 **NATIVE\$1NETWORK\$1ENCRYPTION** 选项后，您无需重新启动数据库实例。只要选项组处于活动状态，NNE 就处于活动状态。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

# 在 sqlnet.ora 中设置 NNE 值
<a name="Oracle.Options.NNE.Using"></a>

借助于 Oracle Native Network Encryption，您还可以在服务器端和客户端设置网络加密。客户端是用来连接到数据库实例的计算机。您可以在 slqnet.ora 中指定以下客户端设置：
+ `SQLNET.ALLOW_WEAK_CRYPTO`
+ `SQLNET.ALLOW_WEAK_CRYPTO_CLIENTS`
+ `SQLNET.CRYPTO_CHECKSUM_CLIENT`
+ `SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT`
+ `SQLNET.ENCRYPTION_CLIENT`
+ `SQLNET.ENCRYPTION_TYPES_CLIENT`

有关信息，请参阅 Oracle 文档中的[配置 Oracle 服务器和客户端的网络数据加密和完整性](http://docs.oracle.com/cd/E11882_01/network.112/e40393/asoconfg.htm)。

有时，数据库实例会拒绝来自应用程序的连接请求。例如，当客户端和服务器上的加密算法不匹配时，可能会发生拒绝。要测试 Oracle Native Network Encryption，请给客户端上的 sqlnet.ora 文件添加下列行：

```
DIAG_ADR_ENABLED=off
TRACE_DIRECTORY_CLIENT=/tmp
TRACE_FILE_CLIENT=nettrace
TRACE_LEVEL_CLIENT=16
```

当尝试连接时，先前的行会在称为 `/tmp/nettrace*` 的客户端上生成跟踪文件。该跟踪文件中包含关于连接的信息。有关使用 Oracle 本机网络加密时的相关连接问题的详细信息，请参阅 Oracle Database 文档中的[关于协商加密和完整性](http://docs.oracle.com/cd/E11882_01/network.112/e40393/asoconfg.htm#autoId12)。

# 修改 NATIVE\$1NETWORK\$1ENCRYPTION 选项设置
<a name="Oracle.Options.NNE.ModifySettings"></a>

启用 `NATIVE_NETWORK_ENCRYPTION` 选项后，您可以修改其设置。目前，您只能使用 AWS CLI 或 RDS API 修改 `NATIVE_NETWORK_ENCRYPTION` 选项设置。您无法使用控制台。以下示例修改该选项中的两个设置。

```
aws rds add-option-to-option-group \
    --option-group-name my-option-group \
    --options "OptionName=NATIVE_NETWORK_ENCRYPTION,OptionSettings=[{Name=SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER,Value=SHA256},{Name=SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER,Value=SHA256}]" \
    --apply-immediately
```

要了解如何使用 CLI 修改选项设置，请参阅[AWS CLI](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.ModifyOption.CLI)。有关各项设置的更多信息，请参阅[NATIVE\$1NETWORK\$1ENCRYPTION 选项设置](Oracle.Options.NNE.Options.md)。

**Topics**
+ [修改 CRYPTO\$1CHECKSUM\$1\$1 值](#Oracle.Options.NNE.ModifySettings.checksum)
+ [修改 ALLOW\$1WEAK\$1CRYPTO\$1 设置](#Oracle.Options.NNE.ModifySettings.encryption)

## 修改 CRYPTO\$1CHECKSUM\$1\$1 值
<a name="Oracle.Options.NNE.ModifySettings.checksum"></a>

如果修改 **NATIVE\$1NETWORK\$1ENCRYPTION** 选项设置，请确保以下选项设置具有至少一个通用密码：
+ `SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER`
+ `SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT`

以下示例显示修改 `SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER` 的方案。该配置有效，因为 `CRYPTO_CHECKSUM_TYPES_CLIENT` 和 `CRYPTO_CHECKSUM_TYPES_SERVER` 都使用 `SHA256`。


| 选项设置 | 修改前的值 | 修改后的值 | 
| --- | --- | --- | 
|  `SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT`  |  `SHA256`, `SHA384`, `SHA512`  |  无更改  | 
|  `SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER`  |  `SHA256`, `SHA384`, `SHA512`, `SHA1`, `MD5`  | SHA1,MD5,SHA256 | 

例如，假设需要将 `SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER` 从默认设置改为 `SHA1,MD5`。在这种情况下，请确保将 `SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT` 设置为 `SHA1` 或者 `MD5`。这些算法不包含 `SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT` 的默认值中。

## 修改 ALLOW\$1WEAK\$1CRYPTO\$1 设置
<a name="Oracle.Options.NNE.ModifySettings.encryption"></a>

要将 `SQLNET.ALLOW_WEAK_CRYPTO*` 选项从默认值设置为 `FALSE`，请确保满足以下条件：
+ `SQLNET.ENCRYPTION_TYPES_SERVER` 和 `SQLNET.ENCRYPTION_TYPES_CLIENT` 有一种匹配的安全加密方法。如果方法并非 `DES`、`3DES` 或 `RC4`（所有密钥长度），则该方法被视为安全。
+ `SQLNET.CHECKSUM_TYPES_SERVER` 和 `SQLNET.CHECKSUM_TYPES_CLIENT` 有一种匹配的安全校验和方法。如果方法并非 `MD5`，则该方法被视为安全。
+ 该客户端使用 2021 年 7 月的 PSU 进行了修补。如果客户端没有进行修补，则客户端将失去连接并收到 `ORA-12269` 错误。

下面的示例显示了示例 NNE 设置。假设您想要将 `SQLNET.ENCRYPTION_TYPES_SERVER` 和 `SQLNET.ENCRYPTION_TYPES_CLIENT` 设置为 FALSE，从而阻止不安全的连接。校验和选项设置满足先决条件，因为它们都具有 `SHA256`。但是，`SQLNET.ENCRYPTION_TYPES_CLIENT` 和 `SQLNET.ENCRYPTION_TYPES_SERVER` 使用 `DES`、`3DES` 和 `RC4` 加密方法，这些方法不安全。因此，要将 `SQLNET.ALLOW_WEAK_CRYPTO*` 选项设置为 `FALSE`，请首先将 `SQLNET.ENCRYPTION_TYPES_SERVER` 和 `SQLNET.ENCRYPTION_TYPES_CLIENT` 设置为安全加密方法，例如 `AES256`。


| 选项设置 | 值 | 
| --- | --- | 
|  `SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT`  |  `SHA256`, `SHA384`, `SHA512`  | 
|  `SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER`  | SHA1,MD5,SHA256 | 
|  `SQLNET.ENCRYPTION_TYPES_CLIENT`  |  `RC4_256`, `3DES168`, `DES40`  | 
|  `SQLNET.ENCRYPTION_TYPES_SERVER`  |  `RC4_256`, `3DES168`, `DES40`  | 

# 删除 NATIVE\$1NETWORK\$1ENCRYPTION 选项
<a name="Oracle.Options.NNE.Remove"></a>

您可以从数据库实例中删除 NNE。

要从数据库实例中删除 `NATIVE_NETWORK_ENCRYPTION` 选项，请执行下列操作之一：
+ 要从多个数据库实例中删除该选项，请从其所属的选项组中删除 `NATIVE_NETWORK_ENCRYPTION` 选项。此更改会影响使用该选项组的所有数据库实例。删除 `NATIVE_NETWORK_ENCRYPTION` 选项后，您无需重新启动数据库实例。有关更多信息，请参阅 [从选项组中删除选项](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.RemoveOption)。
+ 要从单个数据库实例中删除此选项，请修改该数据库实例，并指定另一个不包含 `NATIVE_NETWORK_ENCRYPTION` 选项的选项组。您可以指定默认 (空) 选项组，或指定其他自定义选项组。删除 `NATIVE_NETWORK_ENCRYPTION` 选项后，您无需重新启动数据库实例。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

# Oracle OLAP
<a name="Oracle.Options.OLAP"></a>

Amazon RDS 通过使用 `OLAP` 选项支持 Oracle OLAP。此选项为 Oracle 数据库实例提供在线分析处理 (OLAP)。您可以使用 Oracle OLAP，根据 OLAP 标准创建维度对象和多维数据集来分析大量数据。有关更多信息，请参阅 [Oracle 文档](https://docs.oracle.com/en/database/oracle/oracle-database/19/olaug/index.html)。

**重要**  
如果您使用 Oracle OLAP，则当存在通用漏洞评分系统 (CVSS) 评分为 9\$1 的安全漏洞或其他公布的安全漏洞时，Amazon RDS 会自动将数据库实例更新为最新的 Oracle PSU。

Amazon RDS 支持 Enterprise Edition 的 Oracle Database 19c 及更高版本的 Oracle LAP。

## Oracle OLAP 的先决条件
<a name="Oracle.Options.OLAP.PreReqs"></a>

以下是使用 Oracle OLAP 的先决条件：
+ 您必须拥有 Oracle 提供的 Oracle OLAP 许可证。有关更多信息，请参阅 Oracle 文档中的[许可信息](https://docs.oracle.com/en/database/oracle/oracle-database/19/dblic/Licensing-Information.html#GUID-B6113390-9586-46D7-9008-DCC9EDA45AB4)。
+ 您的数据库实例必须具有足够的实例类。db.t3.small 数据库实例类不支持 Oracle OLAP。有关更多信息，请参阅 [RDS for Oracle 数据库实例类](Oracle.Concepts.InstanceClasses.md)。
+ 数据库实例必须已启用**自动次要版本升级**。该选项允许数据库实例在次要数据库引擎版本升级可用时自动接收这些升级，这对于安装 Oracle Java 虚拟机（JVM）的任意选项是必需的。Amazon RDS 使用该选项将数据库实例更新为最新的 Oracle 补丁集更新（PSU）或版本更新（RU）。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。
+ 您的数据库实例不能有名为 `OLAPSYS` 的用户。如果是这样，OLAP 选项安装将失败。

## Oracle OLAP 的最佳实践
<a name="Oracle.Options.OLAP.BestPractces"></a>

以下是使用 Oracle OLAP 的最佳实践：
+ 为了实现最高安全性，可将 `OLAP` 选项与安全套接字层 (SSL) 结合使用。有关更多信息，请参阅“[Oracle 安全套接字层](Appendix.Oracle.Options.SSL.md)”。
+ 配置数据库实例以限制对它的访问。有关更多信息，请参阅“[在 VPC 中访问数据库实例的场景](USER_VPC.Scenarios.md)”和“[在 VPC 中使用数据库实例](USER_VPC.WorkingWithRDSInstanceinaVPC.md)”。

## 添加 Oracle OLAP 选项
<a name="Oracle.Options.OLAP.Add"></a>

下面是将 `OLAP` 选项添加到数据库实例的一般过程：

1. 创建新的选项组，或者复制或修改现有选项组。

1. 将 选项添加到该选项组。

1. 将选项组与数据库实例相关联。

如果数据库实例上*未* 安装 Oracle Java 虚拟机 (JVM)，则添加 `OLAP` 选项时会出现短暂中断。如果数据库实例上已安装 Oracle Java 虚拟机 (JVM)，则不会出现中断。在添加 选项后，您无需重新启动数据库实例。在选项组处于活动状态后，Oracle OLAP 将立即可用。

**将 OLAP 选项添加到数据库实例**

1. 确定您要使用的选项组。您可以创建新的选项组，或使用现有选项组。如果您想使用现有选项组，请跳到下一步。或者，通过以下设置创建自定义数据库选项组：
   + 对于**引擎**，请选择适用于您的数据库实例的 Oracle 版本。
   + 对于**主引擎版本**，选择数据库实例的版本。

   有关更多信息，请参阅“[创建选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)”。

1. 将 **OLAP** 选项添加到该选项组。有关添加选项的更多信息，请参阅 [将选项添加到选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption)。

1. 将选项组应用到新的或现有的数据库实例：
   + 对于新数据库实例，请在启动实例时应用选项组。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。
   + 对于现有数据库实例，请修改实例并附加新的选项组以应用选项组。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

## 使用 Oracle OLAP
<a name="Oracle.Options.OLAP.Using"></a>

在启用 Oracle OLAP 选项后，可以开始使用它。有关 Oracle OLAP 支持的功能的列表，请参阅 [Oracle 文档](https://docs.oracle.com/en/database/oracle/oracle-database/19/olaug/overview.html#GUID-E2056FE4-C623-4D29-B7D8-C4762F941966)。

## 删除 Oracle OLAP 选项
<a name="Oracle.Options.OLAP.Remove"></a>

删除使用 `OLAP` 选项提供的数据类型的所有对象后，您可以从数据库实例中删除该选项。如果数据库实例上*未* 安装 Oracle Java 虚拟机 (JVM)，则删除 `OLAP` 选项时会出现短暂中断。如果数据库实例上已安装 Oracle Java 虚拟机 (JVM)，则不会出现中断。删除 `OLAP` 选项后，您无需重新启动数据库实例。

**删除 `OLAP` 选项**

1. 备份您的数据。
**警告**  
如果实例使用作为选项一部分启用的数据类型，并且您删除了 `OLAP` 选项，则可能会丢失数据。有关更多信息，请参阅“[备份、还原和导出数据](CHAP_CommonTasks.BackupRestore.md)”。

1. 检查是否有任何现有对象引用了 `OLAP` 选项的数据类型或功能。

1. 删除引用了 `OLAP` 选项的数据类型或功能的任何对象。

1. 请执行下列操作之一：
   + 从 `OLAP` 选项所属的选项组中删除该选项。此更改会影响使用该选项组的所有数据库实例。有关更多信息，请参阅“[从选项组中删除选项](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.RemoveOption)”。
   + 修改数据库实例并指定不包含 `OLAP` 选项的另一个选项组。此更改会影响单个数据库实例。您可以指定默认 (空) 选项组，或指定其他自定义选项组。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

# Oracle 安全套接字层
<a name="Appendix.Oracle.Options.SSL"></a>

要为 RDS for Oracle 数据库实例启用 SSL 加密，请向与数据库实例关联的选项组添加 Oracle SSL 选项。根据 Oracle 的要求，Amazon RDS 使用另一个端口连接 SSL。此方法允许数据库实例与 SQL\$1Plus 之间能够同时进行明文通信和 SSL 加密通信。例如，您可以使用用于明文通信的端口与 VPC 内的其他资源通信，同时使用用于 SSL 加密通信的端口与 VPC 外部的资源通信。

**注意**  
您可以在同一 RDS for Oracle 数据库实例上使用 SSL 或原生网络加密（NNE），但不能同时使用两者。如果您使用 SSL 加密，则必须禁用任何其他连接加密。有关更多信息，请参阅 [Oracle 本机网络加密](Appendix.Oracle.Options.NetworkEncryption.md)。

SSL/TLS 和 NNE 不再是 Oracle 高级安全的一部分。在 RDS for Oracle 中，您可以对以下数据库版本的所有许可版本使用 SSL 加密：
+ Oracle Database 21c (21.0.0)
+ Oracle Database 19c（19.0.0）

**Topics**
+ [Oracle SSL 选项的 TLS 版本](#Appendix.Oracle.Options.SSL.TLS)
+ [Oracle SSL 选项的密码套件](#Appendix.Oracle.Options.SSL.CipherSuites)
+ [FIPS 支持](#Appendix.Oracle.Options.SSL.FIPS)
+ [证书与密码套件的兼容性](#Appendix.Oracle.Options.SSL.CertificateCompatibility)
+ [添加 SSL 选项](Appendix.Oracle.Options.SSL.OptionGroup.md)
+ [配置 SQL\$1Plus 以将 SSL 用于 RDS for Oracle 数据库实例](Appendix.Oracle.Options.SSL.ClientConfiguration.md)
+ [使用 SSL 连接到 RDS for Oracle 数据库实例](Appendix.Oracle.Options.SSL.Connecting.md)
+ [设置通过 JDBC 的 SSL 连接](Appendix.Oracle.Options.SSL.JDBC.md)
+ [使用 SSL 连接强制执行 DN 匹配](Appendix.Oracle.Options.SSL.DNMatch.md)
+ [排查 SSL 连接问题](Appendix.Oracle.Options.SSL.troubleshooting.md)

## Oracle SSL 选项的 TLS 版本
<a name="Appendix.Oracle.Options.SSL.TLS"></a>

Amazon RDS for Oracle 支持传输层安全性 (TLS) 版本 1.0 和 1.2。在添加新的 Oracle SSL 选项时，请显式将 `SQLNET.SSL_VERSION` 设置为有效值。下面是该选项设置允许的值：
+ `"1.0"` – 客户端只能使用 TLS 版本 1.0 连接到数据库实例。对于现有 Oracle SSL 选项，`SQLNET.SSL_VERSION` 自动设置为 `"1.0"`。您可以根据需要更改设置。
+ `"1.2"` – 客户端只能使用 TLS 1.2 连接到数据库实例。
+ `"1.2 or 1.0"` – 客户端只能使用 TLS 1.2 或 1.0 连接到数据库实例。

## Oracle SSL 选项的密码套件
<a name="Appendix.Oracle.Options.SSL.CipherSuites"></a>

Amazon RDS for Oracle 支持多个 SSL 密码套件。默认情况下，Oracle SSL 选项配置为使用 `SSL_RSA_WITH_AES_256_CBC_SHA` 密码套件。要指定不同的密码套件以在 SSL 连接中使用，请使用 `SQLNET.CIPHER_SUITE` 选项设置。

可以为 `SQLNET.CIPHER_SUITE` 指定多个值。如果数据库实例之间具有数据库链接并且您决定更新密码套件，则此技术很有用。

下表总结了所有版本的 Oracle Database 19c 和 21c 中对 RDS for Oracle 的 SSL 支持。


| 密码套件（SQLNET.CIPHER\$1SUITE） | TLS 版本支持（SQLNET.SSL\$1VERSION） | FIPS 支持 | 符合 FedRAMP 要求 | 
| --- | --- | --- | --- | 
| SSL\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA（原定设置） | 1.0 和 1.2 | 是 | 否 | 
| SSL\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA256 | 1.2 | 是 | 否 | 
| SSL\$1RSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 | 1.2 | 是 | 否 | 
| TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 | 1.2 | 支持 | 是 | 
| TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1GCM\$1SHA256 | 1.2 | 支持 | 是 | 
| TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA384 | 1.2 | 支持 | 是 | 
| TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA256 | 1.2 | 支持 | 是 | 
| TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA | 1.2 | 支持 | 是 | 
| TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA | 1.2 | 支持 | 是 | 
| TLS\$1ECDHE\$1ECDSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 | 1.2 | 支持 | 是 | 
| TLS\$1ECDHE\$1ECDSA\$1WITH\$1AES\$1256\$1CBC\$1SHA384 | 1.2 | 支持 | 是 | 

## FIPS 支持
<a name="Appendix.Oracle.Options.SSL.FIPS"></a>

RDS for Oracle 使您能够使用 140-2 联邦信息处理标准（FIPS）。FIPS 140-2 是一项美国政府标准，它定义了密码模块的安全要求。您可以通过针对 Oracle SSL 选项将 `FIPS.SSLFIPS_140` 设置为 `TRUE` 来开启 FIPS 标准。为 SSL 配置 FIPS 140-2 时，加密库会加密客户端与 RDS for Oracle 数据库实例之间的数据。

客户端必须使用符合 FIPS 条件的密码套件。建立连接时，客户端和 RDS for Oracle 数据库实例协商为来回传输消息使用的密码套件。[Oracle SSL 选项的密码套件](#Appendix.Oracle.Options.SSL.CipherSuites)中的表显示了适用于各个 TLS 版本的符合 FIPS 条件的 SSL 密码套件。有关更多信息，请参阅 Oracle 数据库文档中的 [Oracle 数据库 FIPS 140-2 设置](https://docs.oracle.com/en/database/oracle/oracle-database/12.2/dbseg/oracle-database-fips-140-settings.html#GUID-DDBEB3F9-B216-44BB-8C18-43B5E468CBBB)。

## 证书与密码套件的兼容性
<a name="Appendix.Oracle.Options.SSL.CertificateCompatibility"></a>

RDS for Oracle 同时支持 RSA 和椭圆曲线数字签名算法（ECDSA）证书。在为数据库实例配置 SSL 时，必须确保在 `SQLNET.CIPHER_SUITE` 选项设置中指定的密码套件与数据库实例使用的证书类型兼容。

下表展示了证书类型和密码套件之间的兼容性：


| 证书类型 | 兼容的密码套件 | 不兼容的密码套件 | 
| --- | --- | --- | 
| RSA 证书（rds-ca-2019、rds-ca-rsa2048-g1、rds-ca-rsa4096-g1） |  SSL\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA SSL\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA256 SSL\$1RSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1GCM\$1SHA256 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA384 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA256 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA  |  TLS\$1ECDHE\$1ECDSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 TLS\$1ECDHE\$1ECDSA\$1WITH\$1AES\$1256\$1CBC\$1SHA384  | 
| ECDSA 证书（rds-ca-ecc384-g1） |  TLS\$1ECDHE\$1ECDSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 TLS\$1ECDHE\$1ECDSA\$1WITH\$1AES\$1256\$1CBC\$1SHA384  |  SSL\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA SSL\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA256 SSL\$1RSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1GCM\$1SHA256 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA384 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA256 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA  | 

在 `SQLNET.CIPHER_SUITE` 选项设置中指定多个密码套件时，请确保至少包含一个与数据库实例使用的证书类型兼容的密码套件。如果您使用的选项组包含多个具有不同证书类型的数据库实例，请为每种证书类型至少包含一个密码套件。

如果您尝试将选项组与仅包含和数据库实例的证书类型不兼容的密码套件的 SSL 选项相关联，操作将失败，并显示一条错误消息，指出不兼容。

# 添加 SSL 选项
<a name="Appendix.Oracle.Options.SSL.OptionGroup"></a>

要使用 SSL，您的 RDS for Oracle 数据库实例必须与包括 `SSL` 选项的选项组关联。

## 控制台
<a name="Appendix.Oracle.Options.SSL.OptionGroup.Console"></a>

**将 SSL 选项添加到选项组**

1. 创建新选项组或识别现有选项组，然后您可以将 `SSL` 选项添加到其中。

   有关创建选项组的信息，请参阅 [创建选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)。

1. 将 `SSL` 选项添加到该选项组。

   如果要为 SSL 连接仅使用 FIPS 验证的密码套件，请将选项 `FIPS.SSLFIPS_140` 设置为 `TRUE`。有关 FIPS 标准的信息，请参阅 [FIPS 支持](Appendix.Oracle.Options.SSL.md#Appendix.Oracle.Options.SSL.FIPS)。

   有关向选项组添加选项的信息，请参阅 [将选项添加到选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption)。

1. 创建新的 RDS for Oracle 数据库实例并将选项组与其关联，或者修改要将选项组与其关联的 RDS for Oracle 数据库实例。

   有关创建数据库实例的信息，请参阅 [创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)。

   有关修改数据库实例的信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

## AWS CLI
<a name="Appendix.Oracle.Options.SSL.OptionGroup.CLI"></a>

**将 SSL 选项添加到选项组**

1. 创建新选项组或识别现有选项组，然后您可以将 `SSL` 选项添加到其中。

   有关创建选项组的信息，请参阅 [创建选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)。

1. 将 `SSL` 选项添加到该选项组。

   指定以下选项设置：
   + `Port` – SSL 端口号
   + `VpcSecurityGroupMemberships` – 为其启用此选项的 VPC 安全组
   + `SQLNET.SSL_VERSION` – 客户端可用来连接到数据库实例的 TLS 版本

   例如，以下 AWS CLI 命令将 `SSL` 选项添加到名为 `ora-option-group` 的选项组。  
**Example**  

   对于 Linux、macOS 或 Unix：

   ```
   aws rds add-option-to-option-group --option-group-name ora-option-group \
     --options 'OptionName=SSL,Port=2484,VpcSecurityGroupMemberships="sg-68184619",OptionSettings=[{Name=SQLNET.SSL_VERSION,Value=1.0}]'
   ```

   对于 Windows：

   ```
   aws rds add-option-to-option-group --option-group-name ora-option-group ^
     --options 'OptionName=SSL,Port=2484,VpcSecurityGroupMemberships="sg-68184619",OptionSettings=[{Name=SQLNET.SSL_VERSION,Value=1.0}]'
   ```

1. 创建新的 RDS for Oracle 数据库实例并将选项组与其关联，或者修改要将选项组与其关联的 RDS for Oracle 数据库实例。

   有关创建数据库实例的信息，请参阅 [创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)。

   有关修改数据库实例的信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

# 配置 SQL\$1Plus 以将 SSL 用于 RDS for Oracle 数据库实例
<a name="Appendix.Oracle.Options.SSL.ClientConfiguration"></a>

在连接到使用 Oracle SSL 选项的 RDS for Oracle 数据库实例之前，您必须先配置 SQL\$1Plus。

**注意**  
若要允许从适当的客户端访问数据库实例，请确保已正确配置安全组。有关更多信息，请参阅“[使用安全组控制访问权限](Overview.RDSSecurityGroups.md)”。另外，这些说明适用于 SQL\$1Plus 和其他直接使用 Oracle 主目录的客户端。有关 JDBC 连接，请参阅[设置通过 JDBC 的 SSL 连接](Appendix.Oracle.Options.SSL.JDBC.md)。

**将 SQL\$1Plus 配置为使用 SSL 连接到 RDS for Oracle 数据库实例**

1. 将 `ORACLE_HOME` 环境变量设置为 Oracle 主目录的位置。

   Oracle 主目录的路径取决于您的安装。以下示例设置 `ORACLE_HOME` 环境变量。

   ```
   prompt>export ORACLE_HOME=/home/user/app/user/product/19.0.0/dbhome_1
   ```

   有关设置 Oracle 环境变量的信息，请参阅 Oracle 文档中的 [SQL\$1Plus 环境变量](http://docs.oracle.com/database/121/SQPUG/ch_two.htm#SQPUG331)，另请参阅适用于您的操作系统的 Oracle 安装指南。

1. 将 `$ORACLE_HOME/lib` 追加到 `LD_LIBRARY_PATH` 环境变量。

   下面是一个设置 LD\$1LIBRARY\$1PATH 环境变量的示例。

   ```
   prompt>export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib 
   ```

1. 为 `$ORACLE_HOME/ssl_wallet` 处的 Oracle wallet 创建一个目录。

   下面是一个创建 Oracle wallet 目录的示例。

   ```
   prompt>mkdir $ORACLE_HOME/ssl_wallet
   ```

1. 下载适用于所有 AWS 区域的证书捆绑 .pem 文件并将此文件放在 ssl\$1wallet 目录中。有关信息，请参阅[使用 SSL/TLS 加密与数据库实例或集群的连接](UsingWithRDS.SSL.md)。

1. 在 `$ORACLE_HOME/network/admin` 目录中，修改或创建 `tnsnames.ora` 文件并包含下列条目。

   ```
   net_service_name = 
     (DESCRIPTION = 
       (ADDRESS_LIST = 
         (ADDRESS = 
           (PROTOCOL = TCPS) 
           (HOST = endpoint) 
           (PORT = ssl_port_number)
         )
       )
       (CONNECT_DATA = 
         (SID = database_name)
       )
       (SECURITY = 
         (SSL_SERVER_CERT_DN = "C=US,ST=Washington,L=Seattle,O=Amazon.com,OU=RDS,CN=endpoint")
       )
     )
   ```

1. 在同一目录中，修改或创建 sqlnet.ora 文件并包含下列参数。
**注意**  
要通过 TLS 安全连接与实体进行通信，Oracle 需要包含身份验证所需证书的钱夹。您可以使用 Oracle 的 ORAPKI 实用工具来创建和维护 Oracle 钱夹，如步骤 7 中所示。有关更多信息，请参阅 Oracle 文档中的[使用 ORAPKI 设置 Oracle 钱夹](https://docs.oracle.com/cd/E92519_02/pt856pbr3/eng/pt/tsvt/task_SettingUpOracleWalletUsingORAPKI.html)。

   ```
   WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = $ORACLE_HOME/ssl_wallet))) 
   SSL_CLIENT_AUTHENTICATION = FALSE 
   SSL_VERSION = 1.0 
   SSL_CIPHER_SUITES = (SSL_RSA_WITH_AES_256_CBC_SHA) 
   SSL_SERVER_DN_MATCH = ON
   ```
**注意**  
您可以将 `SSL_VERSION` 设置为较高值（如果您的数据库实例支持它）。

1. 运行下列命令以创建 Oracle Wallet。

   ```
   prompt>orapki wallet create -wallet $ORACLE_HOME/ssl_wallet -auto_login_only
   ```

1. 使用操作系统实用程序将 .pem 捆绑文件中的每个证书解压缩到单独的 .pem 文件中。

1. 使用单独的 `orapki` 命令将每个证书添加到 Wallet 中，将 `certificate-pem-file` 替换为 .pem 文件的绝对文件名。

   ```
   prompt>orapki wallet add -wallet $ORACLE_HOME/ssl_wallet -trusted_cert -cert
         certificate-pem-file -auto_login_only
   ```

   有关更多信息，请参阅 [轮换 SSL/TLS 证书](UsingWithRDS.SSL-certificate-rotation.md)。

# 使用 SSL 连接到 RDS for Oracle 数据库实例
<a name="Appendix.Oracle.Options.SSL.Connecting"></a>

在如前所述将 SQL\$1Plus 配置为使用 SSL 之后，您可以使用 SSL 选项连接到 RDS for Oracle 数据库实例。您也可以选择首先导出指向包含 tnsnames.ora 和 sqlnet.ora 文件的目录的 `TNS_ADMIN` 值。这样做可确保 SQL\$1Plus 可始终找到这些文件。以下示例导出 `TNS_ADMIN` 值。

```
export TNS_ADMIN = ${ORACLE_HOME}/network/admin          
```

连接到数据库实例。例如，您可以使用 SQL\$1Plus，通过 tnsnames.ora 文件中的 *<net\$1service\$1name>* 进行连接。

```
sqlplus mydbuser@net_service_name          
```

您还可以通过以下命令，使用 SQL\$1Plus 连接到数据库实例，而无需使用 tnsnames.ora 文件。

```
sqlplus 'mydbuser@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCPS)(HOST = endpoint) (PORT = ssl_port_number))(CONNECT_DATA = (SID = database_name)))'          
```

您还可在不使用 SSL 的情况下连接到 RDS for Oracle 数据库实例。例如，以下命令通过不带 SSL 加密的明文端口连接到数据库实例。

```
sqlplus 'mydbuser@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = endpoint) (PORT = port_number))(CONNECT_DATA = (SID = database_name)))'          
```

如果要关闭传输控制协议 (TCP) 端口访问，请创建一个没有 IP 地址入口的安全组并将此组添加到实例。添加此组将会关闭通过 TCP 端口的连接，同时仍然允许从 SSL 选项安全组允许的范围内的 IP 地址通过 SSL 端口进行指定的连接。

# 设置通过 JDBC 的 SSL 连接
<a name="Appendix.Oracle.Options.SSL.JDBC"></a>

要使用通过 JDBC 的 SSL 连接，您必须创建密钥存储，信任 Amazon RDS 根 CA 证书并使用下面指定的代码段。

要创建 JKS 格式的 keystore，可以使用以下命令。有关创建 keystore 的更多信息，请参阅 Oracle 文档中的[创建 keystore](https://docs.oracle.com/cd/E35822_01/server.740/es_admin/src/tadm_ssl_jetty_keystore.html)。有关参考信息，请参阅《Java Platform, Standard Edition Tools Reference》**中的 [keytool](https://docs.oracle.com/javase/8/docs/technotes/tools/windows/keytool.html)。

```
keytool -genkey -alias client -validity 365 -keyalg RSA -keystore clientkeystore         
```

按照下列步骤信任 Amazon RDS 根 CA 证书。

**信任 Amazon RDS 根 CA 证书**

1. 下载适用于所有 AWS 区域的证书捆绑 .pem 文件并将此文件放在 ssl\$1wallet 目录中。

   有关下载证书的信息，请参阅 [使用 SSL/TLS 加密与数据库实例或集群的连接](UsingWithRDS.SSL.md)。

1. 使用操作系统实用程序将 .pem 文件中的每个证书解压缩到单独的文件中。

1. 使用单独的 `openssl` 命令将每个证书转换为 .der 格式，同时将证书 *certificate-pem-file* 替换为证书 .pem 文件的名称（不带 .pem 扩展名）。

   ```
   openssl x509 -outform der -in certificate-pem-file.pem -out certificate-pem-file.der                
   ```

1. 使用以下命令将每个证书导入 keystore。

   ```
   keytool -import -alias rds-root -keystore clientkeystore.jks -file certificate-pem-file.der                
   ```

   有关更多信息，请参阅 [轮换 SSL/TLS 证书](UsingWithRDS.SSL-certificate-rotation.md)。

1. 确认成功创建了密钥存储。

   ```
   keytool -list -v -keystore clientkeystore.jks                                            
   ```

   在出现提示时，输入密钥存储密码。

以下代码说明如何设置使用 JDBC 的 SSL 连接。

```
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
 
public class OracleSslConnectionTest {
    private static final String DB_SERVER_NAME = "dns-name-provided-by-amazon-rds";
    private static final Integer SSL_PORT = "ssl-option-port-configured-in-option-group";
    private static final String DB_SID = "oracle-sid";
    private static final String DB_USER = "user-name";
    private static final String DB_PASSWORD = "password";
    // This key store has only the prod root ca.
    private static final String KEY_STORE_FILE_PATH = "file-path-to-keystore";
    private static final String KEY_STORE_PASS = "keystore-password";
 
    public static void main(String[] args) throws SQLException {
        final Properties properties = new Properties();
        final String connectionString = String.format(
                "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=%s)(PORT=%d))(CONNECT_DATA=(SID=%s)))",
                DB_SERVER_NAME, SSL_PORT, DB_SID);
        properties.put("user", DB_USER);
        properties.put("password", DB_PASSWORD);
        properties.put("oracle.jdbc.J2EE13Compliant", "true");
        properties.put("javax.net.ssl.trustStore", KEY_STORE_FILE_PATH);
        properties.put("javax.net.ssl.trustStoreType", "JKS");
        properties.put("javax.net.ssl.trustStorePassword", KEY_STORE_PASS);
        final Connection connection = DriverManager.getConnection(connectionString, properties);
        // If no exception, that means handshake has passed, and an SSL connection can be opened
    }
}
```

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

# 使用 SSL 连接强制执行 DN 匹配
<a name="Appendix.Oracle.Options.SSL.DNMatch"></a>

您可以使用 Oracle 参数 `SSL_SERVER_DN_MATCH` 强制数据库服务器的可分辨名称 (DN) 与其服务名称匹配。如果您强制执行匹配验证，则 SSL 将确保证书来自服务器。如果您未强制执行匹配验证，则 SSL 将执行检查，但允许连接，而不管是否存在匹配项。如果您未强制执行匹配，则会允许服务器潜在的伪造身份行为。

要强制执行 DN 匹配，请添加 DN 匹配属性并使用下面指定的连接字符串。

将属性添加到客户端连接以强制执行 DN 匹配。

```
properties.put("oracle.net.ssl_server_dn_match", "TRUE");            
```

使用 SSL 时使用以下连接字符串强制执行 DN 匹配。

```
final String connectionString = String.format(
    "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=%s)(PORT=%d))" +
    "(CONNECT_DATA=(SID=%s))" +
    "(SECURITY = (SSL_SERVER_CERT_DN = 
\"C=US,ST=Washington,L=Seattle,O=Amazon.com,OU=RDS,CN=%s\")))",
    DB_SERVER_NAME, SSL_PORT, DB_SID, DB_SERVER_NAME);
```

# 排查 SSL 连接问题
<a name="Appendix.Oracle.Options.SSL.troubleshooting"></a>

您可能会查询数据库并收到 `ORA-28860` 错误。

```
ORA-28860: Fatal SSL error
28860. 00000 - "Fatal SSL error"
*Cause: An error occurred during the SSL connection to the peer. It is likely that this side sent data which the peer rejected.
*Action: Enable tracing to determine the exact cause of this error.
```

当客户端尝试使用服务器不支持的 TLS 版本进行连接时，就会发生此错误。要避免此错误，请编辑 sqlnet.ora 并将 `SSL_VERSION` 设置为正确的 TLS 版本。有关更多信息，请参阅 My Oracle Support 中的 [Oracle 支持文档 2748438.1](https://support.oracle.com/epmos/faces/DocumentDisplay?id=2748438.1)。

# Oracle Spatial
<a name="Oracle.Options.Spatial"></a>

Amazon RDS 通过使用 `SPATIAL` 选项支持 Oracle Spatial。Oracle Spatial 提供了一个 SQL 架构和一些功能，可帮助在 Oracle 数据库中存储、检索、更新和查询空间数据集合。有关更多信息，请参阅 Oracle 文档中的 [Spatial 概念](http://docs.oracle.com/database/121/SPATL/spatial-concepts.htm#SPATL010)。Amazon RDS 在所有受支持发行版的所有版本中均支持 Oracle Spatial。

## Spatial 补丁包（SPB）的工作原理
<a name="Oracle.Options.Spatial.SPBs"></a>

每个季度，RDS for Oracle 都会为每个受支持的主要引擎发布新的次要引擎版本。版本更新（RU）引擎版本通过包含指定季度的 RU 补丁，纳入了 Oracle 提供的错误修复。Spatial 补丁包（SPB）引擎版本包含 RU 补丁以及特定于 Oracle Spatial 的补丁。例如，19.0.0.0.ru-2025-01.spb-1.r1 是一个次要引擎版本，其中包含引擎版本 19.0.0.0.ru-2025-01.rur-2025-01.r1 中的 RU 补丁以及 Spatial 补丁。只有 Oracle Database 19c 才支持 SPB。

尽管 SPB 与 RU 的命名方式不同，但它们的功能相同。RU 使用命名格式 19.0.0.0.ru-2025-01.rur-2025-01.r1。SPB 名称包括文本“spb”，如 19.0.0.0.ru-2025-01.spb-1.r1。通常，SPB 在其相应的季度 RU 发布后的 2-3 周内发布。例如，19.0.0.0.ru-2025-01.spb-1.r1 在 19.0.0.0.ru-2025-01.rur-2025-01.r1 之后发布。

RDS for Oracle 具有单独的途径来自动升级 RU 和 SPB 的次要版本。如果数据库实例使用 RU，则 RDS 会自动将实例升级到 RU。如果数据库实例使用 SPB，则 RDS 会将实例升级到 SPB。

有关 RU 和 SPB 的更多信息，请参阅 [Oracle 次要版本升级](USER_UpgradeDBInstance.Oracle.Minor.md)。有关 Oracle Database 19c 支持的 RU 和 SPB 的列表，请参阅《Amazon RDS for Oracle Release Notes》**中的 [Amazon RDS for Oracle Database 19c (19.0.0.0)](https://docs.aws.amazon.com/AmazonRDS/latest/OracleReleaseNotes/oracle-version-19-0.html)。

## 使用 Oracle Spatial 的先决条件
<a name="Oracle.Options.Spatial.PreReqs"></a>

以下是使用 Oracle Spatial 的先决条件：
+ 确保您的数据库实例具有足够的实例类。db.t3.small 数据库实例类不支持 Oracle Spatial。有关更多信息，请参阅 [RDS for Oracle 数据库实例类](Oracle.Concepts.InstanceClasses.md)。
+ 确保您的数据库实例已启用**自动次要版本升级**。该选项允许数据库实例在次要数据库引擎版本升级可用时自动接收这些升级，这对于安装 Oracle Java 虚拟机（JVM）的任意选项是必需的。Amazon RDS 使用该选项将数据库实例更新为最新的 Oracle 补丁集更新（PSU）或版本更新（RU）。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

## Oracle Spatial 的最佳实践
<a name="Oracle.Options.Spatial.BestPractces"></a>

以下是使用 Oracle Spatial 的最佳实践：
+ 为了实现最高安全性，可将 `SPATIAL` 选项与安全套接字层 (SSL) 结合使用。有关更多信息，请参阅“[Oracle 安全套接字层](Appendix.Oracle.Options.SSL.md)”。
+ 配置数据库实例以限制对它的访问。有关更多信息，请参阅“[在 VPC 中访问数据库实例的场景](USER_VPC.Scenarios.md)”和“[在 VPC 中使用数据库实例](USER_VPC.WorkingWithRDSInstanceinaVPC.md)”。

## 添加 Oracle Spatial 选项
<a name="Oracle.Options.Spatial.Add"></a>

下面是将 `SPATIAL` 选项添加到数据库实例的一般过程：

1. 创建新的选项组，或者复制或修改现有选项组。

1. 将 选项添加到该选项组。

1. 将选项组与数据库实例相关联。

如果数据库实例上*未* 安装 Oracle Java 虚拟机 (JVM)，则添加 `SPATIAL` 选项时会出现短暂中断。如果数据库实例上已安装 Oracle Java 虚拟机 (JVM)，则不会出现中断。在添加 选项后，您无需重新启动数据库实例。只要选项组处于活动状态，Oracle Spatial 就可用。

**注意**  
在该中断期间，将短暂禁用密码验证功能。您还可能会在中断期间看到与密码验证功能相关的事件。在 Oracle 数据库实例变得可用之前，将再次启用密码验证功能。

**将 `SPATIAL` 选项添加到数据库实例**

1. 确定您要使用的选项组。您可以创建新的选项组，或使用现有选项组。如果您想使用现有选项组，请跳到下一步。或者，通过以下设置创建自定义数据库选项组：

   1. 对于**引擎**，请选择适用于您的数据库实例的 Oracle 版本。

   1. 对于**主引擎版本**，选择数据库实例的版本。

   有关更多信息，请参阅“[创建选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)”。

1. 将 **SPATIAL** 选项添加到该选项组。有关添加选项的更多信息，请参阅 [将选项添加到选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption)。

1. 将选项组应用到新的或现有的数据库实例：
   + 对于新数据库实例，您可以在启动实例时应用选项组。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。
   + 对于现有数据库实例，您可以通过修改实例并附加新的选项组来应用选项组。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

## 删除 Oracle Spatial 选项
<a name="Oracle.Options.Spatial.Remove"></a>

删除使用 `SPATIAL` 选项提供的数据类型的所有对象后，可以从数据库实例中删除该选项。如果数据库实例上*未* 安装 Oracle Java 虚拟机 (JVM)，则删除 `SPATIAL` 选项时会出现短暂中断。如果数据库实例上已安装 Oracle Java 虚拟机 (JVM)，则不会出现中断。删除 `SPATIAL` 选项后，您无需重新启动数据库实例。

**删除 `SPATIAL` 选项**

1. 备份您的数据。
**警告**  
如果实例使用作为选项一部分启用的数据类型，并且您删除了 `SPATIAL` 选项，则可能会丢失数据。有关更多信息，请参阅“[备份、还原和导出数据](CHAP_CommonTasks.BackupRestore.md)”。

1. 检查是否有任何现有对象引用了 `SPATIAL` 选项的数据类型或功能。

   如果存在 `SPATIAL` 选项，则在应用无 `SPATIAL` 选项的新选项组时，实例可能会卡住。您可以使用以下查询标识对象：

   ```
   SELECT OWNER, SEGMENT_NAME, TABLESPACE_NAME, BYTES/1024/1024 mbytes
   FROM   DBA_SEGMENTS
   WHERE  SEGMENT_TYPE LIKE '%TABLE%'
   AND    (OWNER, SEGMENT_NAME) IN
          (SELECT DISTINCT OWNER, TABLE_NAME 
           FROM   DBA_TAB_COLUMNS
           WHERE  DATA_TYPE='SDO_GEOMETRY'
           AND    OWNER <> 'MDSYS')
   ORDER BY 1,2,3,4;
   
   SELECT OWNER, TABLE_NAME, COLUMN_NAME
   FROM   DBA_TAB_COLUMNS 
   WHERE  DATA_TYPE = 'SDO_GEOMETRY' 
   AND    OWNER <> 'MDSYS' 
   ORDER BY 1,2,3;
   ```

1. 删除引用了 `SPATIAL` 选项的数据类型或功能的任何对象。

1. 请执行下列操作之一：
   + 从 `SPATIAL` 选项所属的选项组中删除该选项。此更改会影响使用该选项组的所有数据库实例。有关更多信息，请参阅“[从选项组中删除选项](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.RemoveOption)”。
   + 修改数据库实例并指定不包含 `SPATIAL` 选项的另一个选项组。此更改会影响单个数据库实例。您可以指定默认 (空) 选项组，或指定其他自定义选项组。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

# Oracle SQLT
<a name="Oracle.Options.SQLT"></a>

Amazon RDS 通过使用 SQLT 选项来支持 Oracle SQLTXPLAIN (SQLT)。您可对任一版本的 Oracle Database 19c 及更高版本使用 SQLT。

Oracle `EXPLAIN PLAN` 语句可以确定 SQL 语句的执行计划。它可以验证 Oracle 优化程序是否选择某个执行计划，例如嵌套循环联接。它还可以帮助您了解优化程序的决定，例如为什么选择嵌套循环联接而不是哈希联接。所以 `EXPLAIN PLAN` 可帮助您了解该语句的效果。

SQLT 是一个生成报告的 Oracle 实用程序。报告包括对象统计信息、对象元数据、与优化程序相关的初始化参数，以及数据库管理员可用于调整 SQL 语句以获得最佳性能的其他信息。SQLT 会生成一个 HTML 报告，其中包含报表中所有部分的超链接。

与 Automatic Workload Repository 或 Statspack 报告不同，SQLT 适用于单个 SQL 语句。SQLT 是收集、存储和显示性能数据的 SQL、PL/SQL 和 SQL\$1Plus 文件的集合。

下面是每个 SQLT 版本支持的 Oracle 版本。


****  

| SQLT 版本 | Oracle Database 21c | Oracle Database 19c | 
| --- | --- | --- | 
|  2018-07-25.v1  |  支持  |  支持  | 
|  2018-03-31.v1  |  不支持  |  不支持  | 
|  2016-04-29.v1  |  不支持  |  不支持  | 

下载 SQLT 并了解它的使用说明：
+ 登录到 My Oracle Support 账户，然后打开以下文档：
+ 下载 SQLT：[文档 215187.1](https://support.oracle.com/epmos/faces/DocumentDisplay?id=215187.1)
+ SQLT 使用说明：[文档 1614107.1](https://support.oracle.com/epmos/faces/DocumentDisplay?id=1614107.1)
+ 有关 SQLT 的常见问题：[文档 1454160.1](https://support.oracle.com/epmos/faces/DocumentDisplay?id=1454160.1)
+ 有关读取 SQLT 输出的信息：[文档 1456176.1](https://support.oracle.com/epmos/main/downloadattachmentprocessor?parent=DOCUMENT&sourceId=1456176.1&attachid=1456176.1:58&clickstream=yes)
+ 主报告解释：[文档 1922234.1](https://support.oracle.com/epmos/faces/DocumentDisplay?parent=DOCUMENT&sourceId=215187.1&id=1922234.1)

Amazon RDS 不支持以下 SQLT 方法：
+ `XPLORE` 
+ `XHUME` 

## SQLT 的先决条件
<a name="Oracle.Options.SQLT.PreReqs"></a>

以下是使用 SQLT 的先决条件：
+ 您必须删除 SQLT 所需的用户和角色 (如果存在)。

  SQLT 选项将在数据库实例上创建以下用户和角色：
  + `SQLTXPLAIN` 用户
  + `SQLTXADMIN` 用户
  + `SQLT_USER_ROLE` 角色

  如果数据库实例具有这些用户或角色中的任意一个，请使用 SQL 客户端登录到数据库实例，并使用以下语句将其删除：

  ```
  DROP USER SQLTXPLAIN CASCADE;
  DROP USER SQLTXADMIN CASCADE;   
  DROP ROLE SQLT_USER_ROLE CASCADE;
  ```
+ 您必须删除 SQLT 所需的表空间 (如果存在)。

  SQLT 选项将在数据库实例上创建以下表空间：
  + `RDS_SQLT_TS`
  + `RDS_TEMP_SQLT_TS`

  如果数据库实例有这些表空间，请使用 SQL 客户端登录数据库实例，并将其删除。

## SQLT 选项设置
<a name="Oracle.Options.SQLT.Options"></a>

 SQLT 可以使用由 Oracle Tuning Pack 和 Oracle Diagnostics Pack 提供的许可功能。Oracle Tuning Pack 包括 SQL Tuning Advisor，Oracle Diagnostics Pack 包括 Automatic Workload Repository。SQLT 设置可允许或禁止从 SQLT 访问这些功能。

Amazon RDS 支持 SQLT 选项的以下设置。


****  

| 选项设置 | 有效值 | 默认值 | 描述 | 
| --- | --- | --- | --- | 
|  `LICENSE_PACK`  |  `T`, `D`, `N`  |  `N`   |  要使用 SQLT 访问的 Oracle 管理包。输入以下值之一： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/Oracle.Options.SQLT.html)  Amazon RDS 不提供这些 Oracle 管理包的许可。如果您指示要使用未包含在数据库实例中的包，则可以对数据库实例使用 SQLT。不过，SQLT 无法访问该包，并且 SQLT 报告不包括该包的数据。例如，如果您指定 `T`，但数据库实例不包括 Oracle Tuning Pack，则 SQLT 可用于数据库实例，但其生成的报告不包含与 Oracle Tuning Pack 相关的数据。   | 
|  `VERSION`  |  `2016-04-29.v1` `2018-03-31.v1` `2018-07-25.v1`  |  `2016-04-29.v1`   |  要安装的 SQLT 版本。  对于 Oracle Database 19c 和 21c，唯一受支持的版本是 `2018-07-25.v1`。此版本是这些发布的默认版本。   | 

## 添加 SQLT 选项
<a name="Oracle.Options.SQLT.Add"></a>

下面是将 SQLT 选项添加到数据库实例的一般过程：

1. 创建新的选项组，或者复制或修改现有选项组。

1. 向选项组添加 SQLT 选项。

1. 将选项组与数据库实例相关联。

在添加 SQLT 选项后，一旦激活该选项组，就会激活 SQLT。

**将 SQLT 选项添加到数据库实例**

1. 确定您要使用的选项组。您可以创建新的选项组，或使用现有选项组。如果您想使用现有选项组，请跳到下一步。或者，通过以下设置创建自定义数据库选项组：

   1. 对于 **Engine**，请选择要使用的 Oracle 版本。所有版本均支持 SQLT 选项。

   1. 对于**主引擎版本**，选择数据库实例的版本。

   有关更多信息，请参阅“[创建选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)”。

1. 将 **SQLT** 选项添加到该选项组。有关添加选项的更多信息，请参阅 [将选项添加到选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption)。

1. 将选项组应用到新的或现有的数据库实例：
   + 对于新数据库实例，您可以在启动实例时应用选项组。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。

      
   + 对于现有数据库实例，您可以通过修改实例并附加新的选项组来应用选项组。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

1. (可选) 使用 SQLT 选项验证每个数据库实例上的 SQLT 安装。

   1. 使用 SQL 客户端以主用户身份连接到数据库实例。

      有关使用 SQL 客户端连接到 Oracle 数据库实例的信息，请参阅[连接到 Oracle 数据库实例](USER_ConnectToOracleInstance.md)。

   1. 运行以下查询：

      ```
      SELECT sqltxplain.sqlt$a.get_param('tool_version') sqlt_version FROM DUAL;                        
      ```

      查询返回 Amazon RDS 上的 SQLT 选项的当前版本。`12.1.160429` 是 Amazon RDS 上可用的 SQLT 版本的一个例子。

1. 更改由 SQLT 选项创建的用户的密码。

   1. 使用 SQL 客户端以主用户身份连接到数据库实例。

   1. 运行以下 SQL 语句更改 `SQLTXADMIN` 用户的密码：

      ```
      ALTER USER SQLTXADMIN IDENTIFIED BY new_password ACCOUNT UNLOCK;                         
      ```
**注意**  
作为安全最佳实践，请指定除此处所示提示以外的密码。

   1. 运行以下 SQL 语句更改 `SQLTXPLAIN` 用户的密码：

      ```
      ALTER USER SQLTXPLAIN IDENTIFIED BY new_password ACCOUNT UNLOCK;                         
      ```
**注意**  
作为安全最佳实践，请指定除此处所示提示以外的密码。

**注意**  
升级 SQLT 需要卸载 SQLT 的旧版本然后安装新版本。因此，在升级 SQLT 时，所有 SQLT 元数据都可能会丢失。数据库的主要版本升级也会卸载并重新安装 SQLT。主版本升级的示例是从 Oracle Database 19c 升级到 Oracle Database 21c。

## 使用 SQLT
<a name="Oracle.Options.SQLT.Using"></a>

SQLT 可与 Oracle SQL\$1Plus 实用程序一起使用。

**使用 SQLT**

1.  从 My Oracle Support 网站上的[文档 215187.1](https://support.oracle.com/epmos/faces/DocumentDisplay?id=215187.1) 下载 SQLT .zip 文件。
**注意**  
您无法从 My Oracle Support 网站中下载 SQLT 12.1.160429。Oracle 已弃用该旧版本。

1.  解压缩 SQLT .zip 文件。

1.  从命令提示符处，转到文件系统上的 `sqlt/run` 目录。

1.  从命令提示符处，打开 SQL\$1Plus，并以主用户身份连接到数据库实例。

   有关使用 SQL\$1Plus 连接到数据库实例的信息，请参阅 [连接到 Oracle 数据库实例](USER_ConnectToOracleInstance.md)。

1.  获取 SQL 语句的 SQL ID：

   ```
   SELECT SQL_ID FROM V$SQL WHERE SQL_TEXT='sql_statement';                               
   ```

   输出类似于以下内容：

   ```
   SQL_ID
   -------------
   chvsmttqjzjkn
   ```

1. 使用 SQLT 分析 SQL 语句：

   ```
   START sqltxtract.sql sql_id sqltxplain_user_password                    
   ```

   例如，对于 SQL ID `chvsmttqjzjkn`，输入以下内容：

   ```
   START sqltxtract.sql chvsmttqjzjkn sqltxplain_user_password                    
   ```

   SQLT 在运行 SQLT 命令的目录中生成 HTML 报告和相关资源作为 .zip 文件。

1.  (可选) 要允许应用程序用户使用 SQLT 诊断 SQL 语句，请使用以下语句向每个应用程序用户授予 `SQLT_USER_ROLE`：

   ```
   GRANT SQLT_USER_ROLE TO application_user_name;                
   ```
**注意**  
Oracle 不建议对 `SYS` 用户或具有 `DBA` 角色的用户运行 SQLT。最佳实践是通过向应用程序用户授予 `SQLT_USER_ROLE`，使用应用程序用户账户运行 SQLT 诊断。

## 升级 SQLT 选项
<a name="Oracle.Options.SQLT.Upgrading"></a>

对于 Amazon RDS for Oracle，您可以将 SQLT 选项从现有版本升级到更高版本。要升级 SQLT 选项，请完成[使用 SQLT](#Oracle.Options.SQLT.Using)中的步骤 1–3 以升级到新的 SQLT 版本。此外，如果您在本节的步骤 7 中为以前版本的 SQLT 授予了权限，请再次为新的 SQLT 版本授予权限。

升级 SQLT 选项将导致旧 SQLT 版本的元数据丢失。删除旧 SQLT 版本的架构和相关对象，并安装新版本的 SQLT。有关 SQLT 最新版本中的更改的更多信息，请参阅 My Oracle Support 网站上的[文档 1614201.1](https://support.oracle.com/epmos/faces/DocumentDisplay?parent=DOCUMENT&sourceId=215187.1&id=1614201.1)。

**注意**  
不支持版本降级。

## 修改 SQLT 设置
<a name="Oracle.Options.SQLT.ModifySettings"></a>

在启用 SQLT 后，您可以修改该选项的 `LICENSE_PACK` 和 `VERSION` 设置。

有关如何修改选项设置的更多信息，请参阅 [修改选项设置](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.ModifyOption)。有关各项设置的更多信息，请参阅[SQLT 选项设置](#Oracle.Options.SQLT.Options)。

## 删除 SQLT 选项
<a name="Oracle.Options.SQLT.Remove"></a>

您可以从数据库实例中删除 SQLT。

要从数据库实例中删除 SQLT，请执行下列操作之一：
+ 要从多个数据库实例中删除 SQLT，请从数据库实例所属的选项组中删除 SQLT 选项。此更改会影响使用该选项组的所有数据库实例。有关更多信息，请参阅“[从选项组中删除选项](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.RemoveOption)”。

   
+ 要从单个数据库实例中删除 SQLT，请修改该数据库实例，并指定另一个不包含 SQLT 选项的选项组。您可以指定默认（空）选项组，或指定其他自定义选项组。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

# Oracle Statspack
<a name="Appendix.Oracle.Options.Statspack"></a>

Oracle Statspack 选项安装并启用 Oracle Statspack 性能统计数据功能。Oracle Statspack 是收集、存储和显示性能数据的 SQL、PL/SQL 和 SQL\$1Plus 脚本的集合。有关使用 Oracle Statspack 信息，请参阅 Oracle 文档中的 [Oracle Statspack](http://docs.oracle.com/cd/E13160_01/wli/docs10gr3/dbtuning/statsApdx.html)。

**注意**  
Oracle 不再支持 Oracle Statspack，并用更高级的 Automatic Workload Repository (AWR) 取而代之。只有已购买 Diagnostics Pack 的 Oracle 企业版客户才能使用 AWR。您可以在 Amazon RDS 上将 Oracle Statspack 与任何 Oracle 数据库引擎一起使用。您无法在 Amazon RDS 只读副本上运行 Oracle Statspack。

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

要运行 Statspack 脚本，必须添加 Statspack 选项。

**设置 Oracle Statspack**

1. 在 SQL 客户端中，使用管理账户登录到 Oracle 数据库。

1. 根据是否安装了 Statspack，执行以下操作之一：
   + 如果已安装 Statspack ，并且 `PERFSTAT` 账户与 Statspack 关联，请跳到步骤 4。
   + 如果尚未安装 Statspack，并且 `PERFSTAT` 账户存在，请按如下方式删除账户：

     ```
     DROP USER PERFSTAT CASCADE;
     ```

     否则，尝试添加 Statspack 选项会生成错误和 `RDS-Event-0058`。

1. 将 Statspack 选项添加到选项组。请参阅[将选项添加到选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption)。

   Amazon RDS 会自动在数据库实例上安装 Statspack 脚本，然后设置 `PERFSTAT` 账户。

1. 使用以下 SQL 语句重置密码，并将 *pwd* 替换为新密码：

   ```
   ALTER USER PERFSTAT IDENTIFIED BY pwd ACCOUNT UNLOCK;
   ```

   您可以使用 `PERFSTAT` 用户账户登录并运行 Statspack 脚本。

1. 使用以下语句向 `PERFSTAT` 账户授予 `CREATE JOB` 权限：

   ```
   GRANT CREATE JOB TO PERFSTAT;
   ```

1. 确保填充 `PERFSTAT.STATS$IDLE_EVENT` 表中的空闲等待事件。

   由于 Oracle 错误 28523746，可能无法填充 `PERFSTAT.STATS$IDLE_EVENT` 中的空闲等待事件。要确保所有空闲事件都可用，请运行以下语句：

   ```
   INSERT INTO PERFSTAT.STATS$IDLE_EVENT (EVENT)
   SELECT NAME FROM V$EVENT_NAME WHERE WAIT_CLASS='Idle'
   MINUS
   SELECT EVENT FROM PERFSTAT.STATS$IDLE_EVENT;
   COMMIT;
   ```

## 生成 Statspack 报告
<a name="Appendix.Oracle.Options.Statspack.generating-reports"></a>

Statspack 报告比较两个快照。

**生成 Statspack 报告**

1. 在 SQL 客户端中，使用 `PERFSTAT` 账户登录到 Oracle 数据库。

1. 使用以下任一方法创建快照：
   + 手动创建 Statspack 快照。
   + 创建一个在给定时间间隔后拍摄 Statspack 快照的作业。例如，以下作业每小时创建一个 Statspack 快照：

     ```
     VARIABLE jn NUMBER;
     exec dbms_job.submit(:jn, 'statspack.snap;',SYSDATE,'TRUNC(SYSDATE+1/24,''HH24'')');
     COMMIT;
     ```

1. 使用以下查询查看快照：

   ```
   SELECT SNAP_ID, SNAP_TIME FROM STATS$SNAPSHOT ORDER BY 1;
   ```

1. 运行 Amazon RDS 过程 `rdsadmin.rds_run_spreport`，用快照 ID 替换 *begin\$1snap* 和 *end\$1snap*。

   ```
   exec rdsadmin.rds_run_spreport(begin_snap,end_snap);
   ```

   例如，以下命令基于 Statspack 快照 1 和 2 之间的间隔创建报告：

   ```
   exec rdsadmin.rds_run_spreport(1,2);
   ```

   Statspack 报告的文件名包括两个快照的编号。例如，使用 Statspack 快照 1 和 2 创建的报告文件将命名为 `ORCL_spreport_1_2.lst`。

1. 监视输出是否存在错误。

   Oracle Statspack 会在运行报表之前执行检查。因此，您还可以在命令输出中看到错误消息。例如，您可能会尝试基于无效范围生成报告，其中起始 Statspack 快照值大于结束值。在这种情况下，输出显示错误消息，但数据库引擎不会生成错误文件。

   ```
   exec rdsadmin.rds_run_spreport(2,1);
   *
   ERROR at line 1:
   ORA-20000: Invalid snapshot IDs. Find valid ones in perfstat.stats$snapshot.
   ```

   如果您使用的 Statspack 快照编号无效，则输出将显示错误。例如，如果您尝试为快照 1 和 50 生成报告，但快照 50 不存在，则输出将显示错误。

   ```
   exec rdsadmin.rds_run_spreport(1,50);
   *
   ERROR at line 1:
   ORA-20000: Could not find both snapshot IDs
   ```

1. (可选) 

   要检索报告，请调用跟踪文件过程，如 [使用 Oracle 跟踪文件](USER_LogAccess.Concepts.Oracle.md#USER_LogAccess.Concepts.Oracle.WorkingWithTracefiles) 中所述。

   或者，从 RDS 控制台下载 Statspack 报告。转到数据库实例详细信息的**日志**部分，然后选择**下载**。下面的示例显示了 `trace/ORCL_spreport_1_2.lst`  
![\[在 RDS 控制台中显示 Oracle 日志文件的列表。圈出以下跟踪文件：trace/ORCL_spreport_1_2.lst。\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/statspack1.png)

   如果在生成报告时发生错误，则数据库引擎使用与报告相同的命名约定，但扩展名为 `.err`。例如，如果在使用 Statspack 快照 1 和 7 创建报告时出错，报告文件将命名为 `ORCL_spreport_1_7.err`。您可以使用与标准快照报告相同的方法下载错误报告。

## 删除 Statspack 快照
<a name="Appendix.Oracle.Options.Statspack.removing-files"></a>

要删除一系列 Oracle Statspack 快照，请使用以下命令：

```
exec statspack.purge(begin snap, end snap); 
```

# Oracle 时区
<a name="Appendix.Oracle.Options.Timezone"></a>

要更改您的 Oracle 数据库实例使用的系统时区，请使用时区选项。例如，您可能需要更改数据库实例的时区，从而与本地环境或旧版应用程序兼容。时区选项在主机级别更改时区。更改时区会影响所有日期列和值 (包括 `SYSDATE` 和 `SYSTIMESTAMP`)。

时区选项与 `rdsadmin_util.alter_db_time_zone` 命令不同。`alter_db_time_zone` 命令只能更改某些数据类型的时区。时区选项会更改所有日期列和值的时区。有关 `alter_db_time_zone` 的更多信息，请参阅[设置数据库时区](Appendix.Oracle.CommonDBATasks.TimeZoneSupport.md)。有关升级注意事项的更多信息，请参阅 [时区注意事项](USER_UpgradeDBInstance.Oracle.OGPG.md#USER_UpgradeDBInstance.Oracle.OGPG.DST)。

## 有关设置时区的限制
<a name="Appendix.Oracle.Options.Timezone.Restrictions"></a>

时区选项是永久、持续的选项。因此，您无法执行以下操作：
+ 添加时区选项后，将从选项组中删除该选项。
+ 添加选项后，将其从数据库实例中删除。
+ 将此选项的时区设置修改为其他时区。

## 有关设置时区的建议
<a name="Appendix.Oracle.Options.Timezone.PreReqs"></a>

将时区选项添加到生产数据库之前，我们强烈建议您执行以下操作：
+ 为您的数据库实例拍摄快照。如果不小心错误地设置了时区，则必须将数据库实例恢复到其以前的时区设置。有关更多信息，请参阅 [为 Amazon RDS 的单可用区数据库实例创建数据库快照](USER_CreateSnapshot.md)。
+ 为测试数据库实例添加时区选项。对于使用系统日期添加日期或时间的表，添加时区选项可能引起问题。建议您对测试实例上的数据和应用程序进行分析。这样一来，您便能评测更改生产实例上的时区所产生的影响。

如果数据库实例使用默认选项组，请执行以下步骤：

1. 为您的数据库实例拍摄快照。

1. 向数据库实例添加时区选项。

如果您的数据库实例当前使用非默认选项组，请执行以下步骤：

1. 为您的数据库实例拍摄快照。

1. 创建新的选项组。

1. 向其中添加时区选项，以及当前与现有选项组关联的所有其他选项。

   这样可以防止在启用时区选项时卸载现有选项。

1. 将选项添加到您的数据库实例。

## 时区选项设置
<a name="Appendix.Oracle.Options.Timezone.Options"></a>

Amazon RDS 支持时区选项的以下设置。


****  

| 选项设置 | 有效值 | 描述 | 
| --- | --- | --- | 
| `TIME_ZONE` |  可用时区之一。完整列表请参阅 [可用时区](#Appendix.Oracle.Options.Timezone.Zones)。  |  数据库实例的新时区。  | 

## 添加时区选项
<a name="Appendix.Oracle.Options.Timezone.Add"></a>

完成以下步骤以将时区选项添加到数据库实例：

1. （推荐）为您的数据库实例拍摄快照。

1. 请执行以下任务之一：
   + 从头开始创建一个新选项组。有关更多信息，请参阅 [创建选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)。
   + 使用 AWS CLI 或 API 复制现有选项组。有关更多信息，请参阅 [复制选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Copy)。
   + 重复使用现有的非默认选项组。最佳实践是使用当前未与任何数据库实例或快照关联的选项组。

1. 将新选项添加到您在前面的步骤中创建的选项组。

1. 如果当前与您的数据库实例关联的选项组已启用一些选项，请将这些选项添加到您的新选项组。此策略可以防止在启用新选项时卸载现有选项。

1. 将新选项添加到您的数据库实例。

添加时区选项时，数据库实例在自动重新启动时会出现短暂中断。

### 控制台
<a name="Appendix.Oracle.Options.Timezone.Console"></a>

**将时区选项添加到一个选项组并将该选项组与数据库实例关联**

1. 在 RDS 控制台中，选择**选项组**。

1. 选择要将选项添加到的选项组的名称。

1. 选择**添加选项**。

1. 对于**选项名称**，选择**时区**，然后配置选项设置。

1. 将该选项组与新的或现有的数据库实例关联：
   + 对于新数据库实例，请在启动实例时应用选项组。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。
   + 对于现有数据库实例，请修改实例并附加新的选项组以应用选项组。如果您将新选项添加到现有数据库实例，则在数据库实例自动重新启动时会出现短暂中断。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

### AWS CLI
<a name="Appendix.Oracle.Options.Timezone.CLI"></a>

以下示例使用 AWS CLI [add-option-to-option-group](https://docs.aws.amazon.com/cli/latest/reference/rds/add-option-to-option-group.html) 命令将 `Timezone` 选项和 `TIME_ZONE` 选项设置添加到名为 `myoptiongroup` 的选项组。时区设置为 `Africa/Cairo`。

对于 Linux、macOS 或 Unix：

```
aws rds add-option-to-option-group \
    --option-group-name "myoptiongroup" \
    --options "OptionName=Timezone,OptionSettings=[{Name=TIME_ZONE,Value=Africa/Cairo}]" \
    --apply-immediately
```

对于：Windows

```
aws rds add-option-to-option-group ^
    --option-group-name "myoptiongroup" ^
    --options "OptionName=Timezone,OptionSettings=[{Name=TIME_ZONE,Value=Africa/Cairo}]" ^
    --apply-immediately
```

## 修改时区设置
<a name="Appendix.Oracle.Options.Timezone.ModifySettings"></a>

时区选项是永久、持续的选项。将此选项添加到选项组后不能将其删除。将选项组添加到数据库实例后不能将其删除。您不能将此选项的时区设置修改为其他时区。在未能正确设置时区的情况下，可以使用添加时区选项之前的数据库实例快照进行恢复。

## 删除时区选项
<a name="Appendix.Oracle.Options.Timezone.Remove"></a>

时区选项是永久、持续的选项。将此选项添加到选项组后不能将其删除。将选项组添加到数据库实例后不能将其删除。要删除时区选项，可以使用添加时区选项之前的数据库实例快照进行恢复。

## 可用时区
<a name="Appendix.Oracle.Options.Timezone.Zones"></a>

以下值可用于时区选项。


****  

| 区 | 时区 | 
| --- | --- | 
|  非洲  |  非洲/开罗、非洲/卡萨布兰卡、非洲/哈拉雷、非洲/拉各斯、非洲/罗安达、非洲/蒙罗维亚、非洲/内罗毕、非洲/的黎波里、非洲/温得和克   | 
|  美洲  |  美洲/阿拉瓜伊纳、美洲/阿根廷/布宜诺斯艾利斯、美洲/亚森松、美洲/Bogota、美洲/加拉加斯、美洲/芝加哥、美洲/奇瓦瓦、美洲/库亚巴、美洲/丹佛、美洲/底特律、美洲/福塔莱萨、美洲/戈特霍布、美洲/危地马拉、美洲/哈利法克斯、美洲/利马、美洲/洛杉矶、美洲/玛瑙斯、美洲/马塔莫罗斯、美洲/墨西哥城、美洲/蒙特雷、美洲/蒙特维多、美洲/纽约、美洲/菲尼克斯、美洲/圣地亚哥、美洲/圣保罗、美洲/蒂华纳、美洲/多伦多   | 
|  亚洲  |  亚洲/阿曼、亚洲/阿什哈巴德、亚洲/巴格达、亚洲/巴库、亚洲/曼谷、亚洲/贝鲁特、亚洲/加尔各答、亚洲/大马士革、亚洲/达卡、亚洲/香港、亚洲/伊尔库茨克、亚洲/雅加达、亚洲/耶路撒冷、亚洲/喀布尔、亚洲/卡拉奇、亚洲/加德满都、亚洲/加尔各答、亚洲/克拉斯诺亚尔斯克、亚洲/马加丹、亚洲/马尼拉、亚洲/马斯喀特、亚洲/新西伯利亚、亚洲/阳光、亚洲/利雅得、亚洲/首尔、亚洲/上海、亚洲/新加坡、亚洲/台北、亚洲/德黑兰、亚洲/东京、亚洲/乌兰巴托、亚洲/符拉迪沃斯托克、亚洲/雅库茨克、亚洲/埃里温   | 
|  大西洋  |  大西洋/亚速尔、大西洋/佛得角   | 
|  澳大利亚  |  澳大利亚/阿德莱德、澳大利亚/布里斯班、澳大利亚/达尔文、澳大利亚/尤克拉、澳大利亚/霍巴特、澳大利亚/豪勋爵岛、澳大利亚/珀斯、澳大利亚/悉尼   | 
|  巴西  |  巴西/迪诺罗尼亚、巴西/东部   | 
|  加拿大  |  加拿大/纽芬兰、加拿大/萨斯喀彻温省   | 
|  ETC  |  ETC/GMT-3  | 
|  欧洲  |  欧洲/阿姆斯特丹、欧洲/雅典、欧洲/柏林、欧洲/都柏林、欧洲/赫尔辛基、欧洲/加里宁格勒、欧洲/伦敦、欧洲/马德里、欧洲/莫斯科、欧洲/巴黎、欧洲/布拉格、欧洲/罗马、欧洲/萨拉热窝   | 
|  太平洋  |  太平洋/阿皮亚、太平洋/奥克兰、太平洋/查塔姆、太平洋/斐济、太平洋/关岛、太平洋/檀香山、太平洋/圣诞岛、太平洋/玛贵斯、太平洋/萨摩亚、太平洋/汤加塔布岛、太平洋/韦克   | 
|  US  |  美国/阿拉斯加、美国/中部、美国/印第安纳东部、美国/东部、美国/太平洋地区   | 
|  UTC  |  UTC  | 

# Oracle 时区文件自动升级
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade"></a>

使用 `TIMEZONE_FILE_AUTOUPGRADE` 选项，您可以将当前时区文件升级到 RDS for Oracle 数据库实例上的最新版本。

**Topics**
+ [Oracle 时区文件概览](Appendix.Oracle.Options.Timezone-file-autoupgrade.tz-overview.md)
+ [更新时区文件的策略](Appendix.Oracle.Options.Timezone-file-autoupgrade.strategies.md)
+ [时区文件更新期间的停机时间](Appendix.Oracle.Options.Timezone-file-autoupgrade.considerations.md)
+ [准备更新时区文件](Appendix.Oracle.Options.Timezone-file-autoupgrade.preparing.md)
+ [添加时区文件自动升级选项](Appendix.Oracle.Options.Timezone-file-autoupgrade.adding.md)
+ [更新时区文件后检查数据](Appendix.Oracle.Options.Timezone-file-autoupgrade.checking.md)

# Oracle 时区文件概览
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.tz-overview"></a>

Oracle Database *时区文件*存储以下信息：
+ 相对于协调世界时（UTC）的偏移量
+ 夏令时（DST）的过渡时间
+ 标准时间和 DST 的缩写

Oracle Database 提供多个版本的时区文件。在本地环境中创建 Oracle 数据库时，可以选择时区文件版本。有关更多信息，请参阅《Oracle Database 全球化支持指南》**中的[选择时区文件](https://docs.oracle.com/en/database/oracle/oracle-database/19/nlspg/datetime-data-types-and-time-zone-support.html#GUID-805AB986-DE12-4FEA-AF56-5AABCD2132DF)。

如果 DST 的规则发生变化，Oracle 将发布新的时区文件。Oracle 发布这些新的时区文件与每季度版本更新（RU）和版本更新修订（RUR）的时间表无关。时区文件位于数据库主机上的目录 `$ORACLE_HOME/oracore/zoneinfo/` 中。时区文件名使用的格式为 DstV*version*，如 DSTV35 所示。

## 时区文件如何影响数据传输
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.data-transfer"></a>

在 Oracle 数据库中，`TIMESTAMP WITH TIME ZONE` 数据类型存储时间戳和时区数据。`TIMESTAMP WITH TIME ZONE` 数据类型的数据使用关联时区文件版本中的规则。这样，当您更新时区文件时，现有 `TIMESTAMP WITH TIME ZONE` 数据会受到影响。

在使用不同版本时区文件的数据库之间传输数据时，可能会出现问题。例如，如果您从时区文件版本比目标数据库更高的源数据库导入数据，数据库会发出 `ORA-39405` 错误。以前，您必须使用以下任一方法解决此错误：
+ 使用所需的时区文件创建 RDS for Oracle 数据库实例，从源数据库导出数据，然后将其导入到新数据库中。
+ 使用 AWS DMS 或逻辑复制来迁移数据。

## 使用 TIMEZONE\$1FILE\$1AUTOUPGRADE 选项进行自动更新
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.option-overview"></a>

当附加到 RDS for Oracle 数据库实例的选项组包括 `TIMEZONE_FILE_AUTOUPGRADE` 选项时，RDS 将自动更新您的时区文件。通过确保 Oracle 数据库使用相同的时区文件版本，可以避免在不同环境之间移动数据时采用耗时的手动方法。容器数据库（CDB）和非 CDB 均支持 `TIMEZONE_FILE_AUTOUPGRADE` 选项。

当您向选项组添加 `TIMEZONE_FILE_AUTOUPGRADE` 选项时，您可以选择是立即添加此选项，还是在维护时段添加此选项。数据库实例应用新选项后，RDS 会检查它是否可以安装更新的 DSTv*version* 文件。目标 DSTv*version* 取决于以下内容：
+ 数据库实例当前正在运行的次要引擎版本
+ 您要将数据库实例升级到的次要引擎版本

例如，您当前的时区文件版本可能是 DSTv33。当 RDS 将更新应用到选项组时，它可能会确定 DSTv34 在数据库实例文件系统上当前可用。然后，RDS 自动将您的时区文件更新到 DSTv34。

要在支持的 RDS 版本更新中查找可用的 DST 版本，请查看[适用于 Oracle 的 Amazon Relational Database Service（Amazon RDS）发布说明](https://docs.aws.amazon.com/AmazonRDS/latest/OracleReleaseNotes/Welcome.html)中的补丁。例如，[版本 19.0.0.0.ru-2022-10.rur-2022-10.r1](https://docs.aws.amazon.com/AmazonRDS/latest/OracleReleaseNotes/oracle-version-19-0.html#oracle-version-RU-RUR.19.0.0.0.ru-2022-10.rur-2022-10.r1) 列出补丁 34533061: RDBMS - DSTV39 UPDATE - TZDATA2022C。

# 更新时区文件的策略
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.strategies"></a>

升级数据库引擎和将 `TIMEZONE_FILE_AUTOUPGRADE` 选项添加到选项组是单独的操作。如果有较新的时区文件可用，则添加 `TIMEZONE_FILE_AUTOUPGRADE` 选项会启动对时区文件的更新。您可以立即或在下一个维护时段运行以下命令（仅显示相关选项）：
+ 仅使用以下 RDS CLI 命令升级数据库引擎：

  ```
  modify-db-instance --engine-version name ...
  ```
+ 仅使用以下 CLI 命令添加 `TIMEZONE_FILE_AUTOUPGRADE` 选项：

  ```
  add-option-to-option-group --option-group-name name --options OptionName=TIMEZONE_FILE_AUTOUPGRADE ...
  ```
+ 使用以下 CLI 命令升级您的数据库引擎并向您的实例添加新的选项组：

  ```
  modify-db-instance --engine-version name --option-group-name name ...
  ```

更新策略取决于是要一起升级数据库和时区文件，还是只执行其中一个操作。请记住，如果您更新选项组，然后在单独的 API 操作中升级数据库引擎，则在升级数据库引擎时，当前可能正在进行时区文件更新。

本部分中的示例假定以下内容：
+ 您尚未将 `TIMEZONE_FILE_AUTOUPGRADE` 添加到当前与您的数据库实例关联的选项组。
+ 您的数据库实例使用数据库版本 19.0.0.0.ru-2019-07.rur-2019-07.r1 和时区文件 DSTv33。
+ 您的数据库实例文件系统包含文件 DSTV34。
+ 版本更新 19.0.0.0.ru-2022-10.rur-2022-10.r1 包含 DSTv35。

要更新时区文件，您可以使用以下策略。

**Topics**
+ [更新时区文件而不升级引擎](#Appendix.Oracle.Options.Timezone-file-autoupgrade.strategies.no-upgrade)
+ [升级时区文件和数据库引擎版本](#Appendix.Oracle.Options.Timezone-file-autoupgrade.strategies.upgrade)
+ [升级数据库引擎版本而不更新时区文件](#Appendix.Oracle.Options.Timezone-file-autoupgrade.strategies.upgrade-only)

## 更新时区文件而不升级引擎
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.strategies.no-upgrade"></a>

在这种情况下，您的数据库使用 DSTv33，但 DSTv34 在您的数据库实例文件系统上可用。您希望将数据库实例使用的时区文件从 DSTv33 更新到 DSTv34，但您不想将您的引擎升级到新的次要版本，其中包括 DSTv35。

在 `add-option-to-option-group` 命令中，将 `TIMEZONE_FILE_AUTOUPGRADE` 添加到您的数据库实例使用的选项组。指定是立即添加此选项，还是将其推迟到维护时段。应用 `TIMEZONE_FILE_AUTOUPGRADE` 选项后，RDS 将执行以下操作：

1. 检查是否有新的 DST 版本。

1. 确定 DSTv34 在文件系统上是否可用。

1. 立即更新时区文件。

## 升级时区文件和数据库引擎版本
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.strategies.upgrade"></a>

在这种情况下，您的数据库使用 DSTv33，但 DSTv34 在您的数据库实例文件系统上可用。您希望将数据库引擎升级到包含 DSTv35 的次要版本 19.0.0.0.ru-2022-10.rur-2022-10.r1，并在引擎升级期间将时区文件更新到 DSTv5。这样，您的目标是跳过 DSTv34 并将时区文件直接更新到 DSTv35。

要同时升级引擎和时区文件，请使用 `--option-group-name` 和 `--engine-version` 选项运行 `modify-db-instance`。您可以立即运行此命令，也可以将其推迟到维护时段。在 `In --option-group-name` 中指定包含 `TIMEZONE_FILE_AUTOUPGRADE` 选项的选项组。例如：

```
aws rds modify-db-instance 
    --db-instance-identifier my-instance \
    --engine-version new-version \
    ----option-group-name og-with-timezone-file-autoupgrade \    
    --apply-immediately
```

RDS 开始将引擎升级到 19.0.0.0.ru-2022-10.rur-2022-10.r1。应用 `TIMEZONE_FILE_AUTOUPGRADE` 选项后，RDS 会检查是否有新的 DST 版本，看到 DSTv35 在 19.0.0.0.ru-2022-10.rur-2022-10.r1 中可用，并立即开始更新到 DSTv35。

要立即升级您的引擎，然后升级您的时区文件，请按顺序执行操作：

1. 仅使用以下 CLI 命令升级数据库引擎：

   ```
   aws rds modify-db-instance \
       --db-instance-identifier my-instance \
       --engine-version new-version \
       --apply-immediately
   ```

1. 使用以下 CLI 命令将 `TIMEZONE_FILE_AUTOUPGRADE` 选项添加到附加到您的实例的选项组：

   ```
   aws rds add-option-to-option-group \
       --option-group-name og-in-use-by-your-instance \
       --options OptionName=TIMEZONE_FILE_AUTOUPGRADE \
       --apply-immediately
   ```

## 升级数据库引擎版本而不更新时区文件
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.strategies.upgrade-only"></a>

在这种情况下，您的数据库使用 DSTv33，但 DSTv34 在您的数据库实例文件系统上可用。您希望将数据库引擎升级到版本 19.0.0.0.ru-2022-10.rur-2022-10.r1（其中包含 DSTv35），但保留时区文件 DSTv33。您可能出于以下原因来选择该策略：
+ 您的数据不使用 `TIMESTAMP WITH TIME ZONE` 数据类型。
+ 您的数据使用 `TIMESTAMP WITH TIME ZONE` 数据类型，但您的数据不受时区更改的影响。
+ 您想推迟更新时区文件，因为您无法容忍额外的停机时间。

您的策略取决于以下哪些可能性是确实存在的：
+ 您的数据库实例未与包含 `TIMEZONE_FILE_AUTOUPGRADE` 的选项组关联。在 `modify-db-instance` 命令中，不要指定新的选项组，这样 RDS 就不会更新您的时区文件。
+ 您的数据库实例目前与一个包含 `TIMEZONE_FILE_AUTOUPGRADE` 的选项组关联。在单个 `modify-db-instance` 命令中，将您的数据库实例与不包含 `TIMEZONE_FILE_AUTOUPGRADE` 的选项组关联，并将您的数据库引擎升级到 19.0.0.0.ru-2022-10.rur-2022-10.r1。

# 时区文件更新期间的停机时间
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.considerations"></a>

当 RDS 更新时区文件时，使用 `TIMESTAMP WITH TIME ZONE` 的现有数据可能会发生变化。在这种情况下，您首要的考虑因素是停机时间。

**警告**  
如果您添加 `TIMEZONE_FILE_AUTOUPGRADE` 选项，则您引擎升级的停机时间可能要延长。更新大型数据库的时区数据可能需要数小时甚至数天。

时区文件更新的长度取决于如下因素：
+ 数据库中的 `TIMESTAMP WITH TIME ZONE` 数据量
+ 数据库实例配置
+ 数据库实例类
+ 存储配置
+ 数据库配置
+ 数据库参数设置

执行以下操作时，可能会产生额外的停机时间：
+ 当数据库实例使用过时的时区文件时，将此选项添加到选项组
+ 当新引擎版本包含时区文件的新版本时，升级 Oracle 数据库引擎

**注意**  
在时区文件更新期间，RDS for Oracle 调用 `PURGE DBA_RECYCLEBIN`。

# 准备更新时区文件
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.preparing"></a>

时区文件升级有两个不同的阶段：准备和升级。虽然准备步骤并非必需，但强烈建议您执行此步骤。在此步骤中，您将了解哪些数据将受到运行 PL/SQL 过程 `DBMS_DST.FIND_AFFECTED_TABLES` 的影响。有关准备窗口的更多信息，请参阅 Oracle 数据库文档中的[使用时区数据升级时区文件和时间戳](https://docs.oracle.com/en/database/oracle/oracle-database/19/nlspg/datetime-data-types-and-time-zone-support.html#GUID-B0ACDB2E-4B49-4EB4-B4CC-9260DAE1567A)。

**准备更新时区文件**

1. 使用 SQL 客户端连接到您的 Oracle 数据库。

1. 确定当前使用的时区文件版本。

   ```
   SELECT * FROM V$TIMEZONE_FILE;
   ```

1. 确定数据库实例上可用的最新时区文件版本。

   ```
   SELECT DBMS_DST.GET_LATEST_TIMEZONE_VERSION FROM DUAL;
   ```

1. 确定具有类型为 `TIMESTAMP WITH LOCAL TIME ZONE` 或 `TIMESTAMP WITH TIME ZONE` 的列的表总大小。

   ```
   SELECT SUM(BYTES)/1024/1024/1024 "Total_size_w_TSTZ_columns_GB"
   FROM   DBA_SEGMENTS
   WHERE  SEGMENT_TYPE LIKE 'TABLE%'
   AND    (OWNER, SEGMENT_NAME) IN
            (SELECT OWNER, TABLE_NAME
             FROM   DBA_TAB_COLUMNS
             WHERE  DATA_TYPE LIKE 'TIMESTAMP%TIME ZONE');
   ```

1. 确定具有类型为 `TIMESTAMP WITH LOCAL TIME ZONE` 或 `TIMESTAMP WITH TIME ZONE` 的列的段的名称和大小。

   ```
   SELECT OWNER, SEGMENT_NAME, SUM(BYTES)/1024/1024/1024 "SEGMENT_SIZE_W_TSTZ_COLUMNS_GB"
   FROM   DBA_SEGMENTS
   WHERE  SEGMENT_TYPE LIKE 'TABLE%'
   AND    (OWNER, SEGMENT_NAME) IN
            (SELECT OWNER, TABLE_NAME
             FROM   DBA_TAB_COLUMNS
             WHERE  DATA_TYPE LIKE 'TIMESTAMP%TIME ZONE')
   GROUP BY OWNER, SEGMENT_NAME;
   ```

1. 运行准备步骤。
   + 过程 `DBMS_DST.CREATE_AFFECTED_TABLE` 可创建表来存储任何受影响的数据。将此表的名称传递给 `DBMS_DST.FIND_AFFECTED_TABLES` 过程。有关更多信息，请参阅 Oracle 数据库文档中的 [CREATE\$1AFFECTED\$1TABLE 过程](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_DST.html#GUID-C53BAABA-914A-404C-9CD5-823257BE0B00)。
   + 此过程 `CREATE_ERROR_TABLE` 创建用于记录错误的表。有关更多信息，请参阅 Oracle 数据库文档中的 [CREATE\$1ERROR\$1TABLE 过程](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_DST.html#GUID-6A7EA024-B02D-4486-B1D6-EF6ABF5DE507)。

   以下示例创建受影响的数据和错误表，并查找所有受影响的表。

   ```
   EXEC DBMS_DST.CREATE_ERROR_TABLE('my_error_table')
   EXEC DBMS_DST.CREATE_AFFECTED_TABLE('my_affected_table')
   
   EXEC DBMS_DST.BEGIN_PREPARE(new_version);
   EXEC DBMS_DST.FIND_AFFECTED_TABLES('my_affected_table', TRUE, 'my_error_table');
   EXEC DBMS_DST.END_PREPARE;
   
   SELECT * FROM my_affected_table;
   SELECT * FROM my_error_table;
   ```

1. 查询受影响表和错误表。

   ```
   SELECT * FROM my_affected_table;
   SELECT * FROM my_error_table;
   ```

# 添加时区文件自动升级选项
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.adding"></a>

当您向选项组添加选项时，该选项组将处于以下状态之一：
+ 一个现有选项组当前已附加到至少一个数据库实例。添加该选项时，所有使用此选项组的数据库实例都会自动重新启动。这会导致短暂中断。
+ 现有选项组未附加到任何数据库实例。您计划添加该选项，然后将现有选项组与现有数据库实例或新数据库实例相关联。
+ 您创建一个新的选项组并添加该选项。您计划将新的选项组与现有数据库实例或新的数据库实例关联。

## 控制台
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.console"></a>

**将时区文件自动升级选项添加到数据库实例**

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

1. 在导航窗格中，选择**选项组**。

1. 确定您想要使用的选项组。您可以创建新的选项组，或使用现有选项组。如果您想使用现有选项组，请跳到下一步。或者，通过以下设置创建自定义数据库选项组：

   1. 对于 **Engine**（引擎），选择适用于您的数据库实例的 Oracle Database 版本。

   1. 对于**主引擎版本**，请选择数据库实例的版本。

   有关更多信息，请参阅 [创建选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)。

1. 选择要修改的选项组，然后选择 **Add Option (添加选项)**。

1. 在**添加选项**窗口中，执行以下操作：

   1. 选择 **TIMEZONE\$1FILE\$1AUTOUPGRADE**。

   1. 要在添加选项后在所有关联数据库实例上启用该选项，对于**立即应用**，请选择**是**。如果选择**否**（默认），则会在下一个维护时段为每个关联数据库实例启用此选项。

1. 根据需要设置完毕后，选择 **Add Option (添加选项)**。

## AWS CLI
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.CLI"></a>

以下示例使用 AWS CLI [add-option-to-option-group](https://docs.aws.amazon.com/cli/latest/reference/rds/add-option-to-option-group.html) 命令将 `TIMEZONE_FILE_AUTOUPGRADE` 选项添加到名为 `myoptiongroup` 的选项组。

对于 Linux、macOS 或 Unix：

```
aws rds add-option-to-option-group \
    --option-group-name "myoptiongroup" \
    --options "OptionName=TIMEZONE_FILE_AUTOUPGRADE" \
    --apply-immediately
```

对于：Windows

```
aws rds add-option-to-option-group ^
    --option-group-name "myoptiongroup" ^
    --options "OptionName=TIMEZONE_FILE_AUTOUPGRADE" ^
    --apply-immediately
```

# 更新时区文件后检查数据
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.checking"></a>

建议您在更新时区文件后检查数据。在准备步骤过程中，RDS for Oracle 会自动创建以下表：
+ `rdsadmin.rds_dst_affected_tables` – 列出包含受更新影响的数据的表
+ `rdsadmin.rds_dst_error_table` – 列出更新过程中生成的错误

这些表独立于您在准备时段中创建的任何表。要查看更新的结果，请按如下方式查询表。

```
SELECT * FROM rdsadmin.rds_dst_affected_tables;
SELECT * FROM rdsadmin.rds_dst_error_table;
```

有关受影响数据和错误表的架构的更多信息，请参阅 Oracle 文档中的 [FIND\$1AFFECTED\$1TABLES 过程](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_DST.html#GUID-1F977505-671C-4D5B-8570-86956F136199)。

# Oracle 透明数据加密
<a name="Appendix.Oracle.Options.AdvSecurity"></a>

Amazon RDS 支持 Oracle 透明数据加密 (TDE)，这是 Oracle 企业版中提供的 Oracle 高级安全选项中的功能。该功能在将数据写入到存储之前自动对数据进行加密，并在从存储读取数据时自动对数据进行解密。仅自带许可（BYOL）模式支持此选项。

TDE 在需要加密敏感数据以防第三方获取数据文件和备份的情况下非常有用。当您需要遵守安全相关法规时，TDE 也非常有用。

有关 Oracle 数据库中 TDE 的详细说明超出了本指南的范围。有关信息，请参阅以下 Oracle 数据库资源：
+ Oracle 数据库文档中的 [Introduction to Transparent Data Encryption](https://docs.oracle.com/en/database/oracle/oracle-database/19/asoag/introduction-to-transparent-data-encryption.html#GUID-62AA9447-FDCD-4A4C-B563-32DE04D55952)
+ Oracle 数据库文档中的 [Oracle 高级安全性](https://www.oracle.com/security/database-security/)
+ [Oracle 高级安全透明数据加密最佳实践](https://www.oracle.com/br/a/tech/docs/technical-resources/twp-transparent-data-encryption-bestpractices.pdf)，这是 Oracle 白皮书

有关将 TDE 和 RDS for Oracle 结合使用的更多信息，请参阅以下博客：
+ [Oracle Database Encryption Options on Amazon RDS](https://aws.amazon.com/blogs/apn/oracle-database-encryption-options-on-amazon-rds/)
+ [Migrate a cross-account TDE-enabled Amazon RDS for Oracle DB instance with reduced downtime using AWS DMS](https://aws.amazon.com/blogs/database/migrate-a-cross-account-tde-enabled-amazon-rds-for-oracle-db-instance-with-reduced-downtime-using-aws-dms/)

## TDE 加密模式
<a name="Appendix.Oracle.Options.AdvSecurity.Modes"></a>

Oracle 透明数据加密支持两种加密方式，即 TDE 表空间加密和 TDE 列加密。TDE 表空间加密用于加密整个应用程序表。TDE 列加密用于加密单个包含敏感数据的数据元素。此外，您还可以应用同时使用 TDE 表空间和列加密的混合加密解决方案。

**注意**  
Amazon RDS 为数据库实例管理 Oracle Wallet 和 TDE 主密钥。您无需使用命令 `ALTER SYSTEM set encryption key` 设置加密密钥。

启用 `TDE` 选项之后，可以使用以下命令检查 Oracle Wallet 的状态：

```
SELECT * FROM v$encryption_wallet;
```

要创建加密的表空间，请使用以下命令：

```
CREATE TABLESPACE encrypt_ts ENCRYPTION DEFAULT STORAGE (ENCRYPT);
```

要指定加密算法，请使用以下命令：

```
CREATE TABLESPACE encrypt_ts ENCRYPTION USING 'AES256' DEFAULT STORAGE (ENCRYPT);
```

前面用于加密表空间的语句与您在本地 Oracle 数据库上使用的语句相同。

## TDE 选项的限制
<a name="Appendix.Oracle.Options.Timezone.Restrictions"></a>

TDE 选项是持久和永久的。在将您的数据库实例与启用了 TDE 选项的选项组关联后，您无法执行以下操作：
+ 在当前关联的选项组中禁用 `TDE` 选项。
+ 将您的数据库实例与不包含 `TDE` 的选项组相关联。
+ 共享使用 `TDE` 选项的数据库快照。有关共享数据库快照的更多信息，请参阅 [共享 Amazon RDS 的数据库快照](USER_ShareSnapshot.md)。

有关持久和永久选项的更多信息，请参阅[持久性和永久性选项](USER_WorkingWithOptionGroups.md#Overview.OptionGroups.Permanent)。

## 确定您的数据库实例是否使用 TDE
<a name="Appendix.Oracle.Options.AdvSecurity.Querying"></a>

您可能需要确定您的数据库实例是否与启用了 `TDE` 选项的选项组相关联。要查看与数据库实例关联的选项组，请使用 RDS 控制台、AWS CLI 命令 [describe-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-instances.html) 或 API 操作 [DescribeDBInstances](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBInstances.html)。

## 添加 TDE 选项
<a name="Appendix.Oracle.Options.AdvSecurity.Add"></a>

要将 `TDE` 选项添加到数据库实例，请完成以下步骤：

1. （推荐）为您的数据库实例拍摄快照。

1. 请执行以下任务之一：
   + 从头开始创建一个新选项组。有关更多信息，请参阅 [创建选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)。
   + 使用 AWS CLI 或 API 复制现有选项组。有关更多信息，请参阅 [复制选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Copy)。
   + 重复使用现有的非默认选项组。最佳实践是使用当前未与任何数据库实例或快照关联的选项组。

1. 将新选项添加到您在前面的步骤中创建的选项组。

1. 如果当前与您的数据库实例关联的选项组已启用一些选项，请将这些选项添加到您的新选项组。此策略可以防止在启用新选项时卸载现有选项。

1. 将新选项添加到您的数据库实例。

### 控制台
<a name="Appendix.Oracle.Options.TDE.Console"></a>

**将 TDE 选项添加到一个选项组并将该选项组与您的数据库实例关联**

1. 在 RDS 控制台中，选择**选项组**。

1. 选择要将选项添加到的选项组的名称。

1. 选择**添加选项**。

1. 对于**选项名称**，选择 **TDE**，然后配置选项设置。

1. 选择**添加选项**。
**重要**  
如果在当前已附加到一个或多个数据库实例的选项组中添加 **TDE** 选项，则所有数据库实例自动重新启动时都会发生短暂中断。

   有关添加选项的更多信息，请参阅 [将选项添加到选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption)。

1. 将该选项组与新的或现有的数据库实例关联：
   + 对于新数据库实例，请在启动实例时应用选项组。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。
   + 对于现有数据库实例，请修改实例并附加新的选项组以应用选项组。数据库实例不会作为此操作的一部分重启。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

### AWS CLI
<a name="Appendix.Oracle.Options.TDE.CLI"></a>

在以下示例中，您使用 AWS CLI [add-option-to-option-group](https://docs.aws.amazon.com/cli/latest/reference/rds/add-option-to-option-group.html) 命令将 `TDE` 选项添加到名为 `myoptiongroup` 的选项组。有关更多信息，请参阅[开始使用：Flink 1.13.2](https://docs.aws.amazon.com/managed-flink/latest/java/earlier.html#getting-started-1-13)。

对于 Linux、macOS 或 Unix：

```
aws rds add-option-to-option-group \
    --option-group-name "myoptiongroup" \
    --options "OptionName=TDE" \
    --apply-immediately
```

对于：Windows

```
aws rds add-option-to-option-group ^
    --option-group-name "myoptiongroup" ^
    --options "OptionName=TDE" ^
    --apply-immediately
```

## 将您的数据复制到不包含 TDE 选项的数据库实例
<a name="Appendix.Oracle.Options.AdvSecurity.Remove"></a>

您无法从数据库实例中删除 TDE 选项或将其与不包括 TDE 选项的选项组关联。要将数据迁移到不包含 TDE 选项的实例，请执行以下操作：

1.  解密数据库实例上的数据。

1.  将数据复制到未与已启用 `TDE` 的选项组关联的新数据库实例。

1.  删除原始数据库实例。

您可以将上一个数据库实例的名称用于新实例。

## 将 TDE 与 Oracle Data Pump 结合使用时的注意事项
<a name="Appendix.Oracle.Options.AdvSecurity.Pump"></a>

可以使用 Oracle Data Pump 导入或导出加密转储文件。Amazon RDS 支持 Oracle Data Pump 的密码加密模式 `(ENCRYPTION_MODE=PASSWORD)`。Amazon RDS 不支持 Oracle Data Pump 的透明加密模式 `(ENCRYPTION_MODE=TRANSPARENT)`。有关更多信息，请参阅 [使用 Oracle Data Pump 导入](Oracle.Procedural.Importing.DataPump.md)。

# Oracle UTL\$1MAIL
<a name="Oracle.Options.UTLMAIL"></a>

Amazon RDS 通过使用 UTL\$1MAIL 选项和 SMTP 服务器支持 Oracle UTL\$1MAIL。您可以通过使用 UTL\$1MAIL 包直接从您的数据库发送电子邮件。Amazon RDS 支持适用于以下版本 Oracle 的 UTL\$1MAIL：
+ Oracle Database 21c (21.0.0.0)，所有版本
+ Oracle Database 19c (19.0.0.0)，所有版本

以下是使用 UTL\$1MAIL 的一些限制：
+ UTL\$1MAIL 不支持传输层安全性 (TLS)，因此，不会对电子邮件进行加密。

  要通过创建和上传自定义 Oracle wallet 来安全地连接到远程 SSL/TLS 资源，请按照 [使用证书和 Oracle Wallet 配置 UTL\$1HTTP 访问](Oracle.Concepts.ONA.md) 中的说明操作。

  Wallet 所需的具体证书因服务而异。对于 AWS 服务，通常可在 [Amazon Trust Services 存储库](https://www.amazontrust.com/repository/)中了解到相关信息。
+ UTL\$1MAIL 不支持对 SMTP 服务器进行身份验证。
+ 您在一封电子邮件中只能发送一个附件。
+ 您无法发送 32 K 以上的附件。
+ 您只能使用 ASCII 和广义二进制编码的十进制交换码 (EBCDIC) 字符编码。
+ SMTP 端口 (25) 根据弹性网络接口所有者的策略进行限制。

当您启用 UTL\$1MAIL 时，仅向数据库实例的主用户授予执行权限。如果需要，主用户可向其他用户授予执行权限，以便他们能够使用 UTL\$1MAIL。

**重要**  
建议您启用 Oracle 的内置审核功能以跟踪 UTL\$1MAIL 过程的使用情况。

## Oracle UTL\$1MAIL 的先决条件
<a name="Oracle.Options.UTLMAIL.PreReqs"></a>

以下是使用 Oracle UTL\$1MAIL 的先决条件：
+ 一个或多个 SMTP 服务器，及对应的 IP 地址或公有或私有域名服务器 (DNS) 名称。有关通过自定义 DNS 服务器解析的私有 DNS 名称的详细信息，请参阅 [设置自定义 DNS 服务器](Appendix.Oracle.CommonDBATasks.System.md#Appendix.Oracle.CommonDBATasks.CustomDNS)。

## 添加“Oracle UTL\$1MAIL”选项
<a name="Oracle.Options.UTLMAIL.Add"></a>

将“Oracle UTL\$1MAIL”选项添加到数据库实例的一般过程如下所示：

1. 创建新的选项组，或者复制或修改现有选项组。

1. 将 选项添加到该选项组。

1. 将选项组与数据库实例相关联。

在添加“UTL\$1MAIL”选项后，一旦激活该选项组，就会激活 UTL\$1MAIL。

**将“UTL\$1MAIL”选项添加到数据库实例**

1. 确定您想要使用的选项组。您可以创建新的选项组，或使用现有选项组。如果您想使用现有选项组，请跳到下一步。或者，通过以下设置创建自定义数据库选项组：

   1. 对于**引擎**，请选择要使用的 Oracle 版本。

   1. 对于**主引擎版本**，选择数据库实例的版本。

   有关更多信息，请参阅“[创建选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)”。

1. 将 **UTL\$1MAIL** 选项添加到该选项组。有关添加选项的更多信息，请参阅 [将选项添加到选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption)。

1. 将选项组应用到新的或现有的数据库实例：
   + 对于新数据库实例，您可以在启动实例时应用选项组。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。
   + 对于现有数据库实例，您可以通过修改实例并附加新的选项组来应用选项组。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

## 使用 Oracle UTL\$1MAIL
<a name="Oracle.Options.UTLMAIL.Using"></a>

在启用“UTL\$1MAIL”选项后，您必须先配置 SMTP 服务器，然后才能开始使用它。

通过将 SMTP\$1OUT\$1SERVER 参数设置为有效的 IP 地址或公有 DNS 名称来配置 SMTP 服务器。对于 SMTP\$1OUT\$1SERVER 参数，您可以指定多个服务器的地址的逗号分隔的列表。如果第一个服务器不可用，则 UTL\$1MAIL 会尝试下一个服务器，依此类推。

您可以通过使用[数据库参数组](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithParamGroups.html)设置数据库实例的默认 SMTP\$1OUT\$1SERVER。您可以通过在数据库实例的数据库上运行以下代码来设置会话的 SMTP\$1OUT\$1SERVER 参数。

```
1. ALTER SESSION SET smtp_out_server = mailserver.domain.com:25;
```

在启用“UTL\$1MAIL”选项并配置 SMTP\$1OUT\$1SERVER 后，您可以通过使用 `SEND` 过程来发送邮件。有关更多信息，请参阅 Oracle 文档中的 [UTL\$1MAIL](http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/u_mail.htm#BABFJJBD)。

## 删除“Oracle UTL\$1MAIL”选项
<a name="Oracle.Options.UTLMAIL.Remove"></a>

您可以从数据库实例中删除“Oracle UTL\$1MAIL”。

要从数据库实例中删除“UTL\$1MAIL”，请执行下列操作之一：
+ 要从多个数据库实例中删除“UTL\$1MAIL”，请从其所属的选项组中删除“UTL\$1MAIL”选项。此更改会影响使用该选项组的所有数据库实例。有关更多信息，请参阅“[从选项组中删除选项](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.RemoveOption)”。
+ 要从单个数据库实例中删除“UTL\$1MAIL”选项，请修改该数据库实例，并指定另一个不包含“UTL\$1MAIL”选项的选项组。您可以指定默认 (空) 选项组，或指定其他自定义选项组。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

## 故障排除
<a name="Oracle.Options.UTLMAIL.Troubleshooting"></a>

以下是您在将 UTL\$1MAIL 用于 Amazon RDS 时可能遇到的问题。
+ 限制。SMTP 端口 (25) 根据弹性网络接口所有者的策略进行限制。如果您可以使用 UTL\$1MAIL 成功发送电子邮件，并且看到错误 `ORA-29278: SMTP transient error: 421 Service not available`，则您可能被限制。如果您在发送电子邮件时遇到限制，我们建议您实施回退算法。有关回退算法的更多信息，请参阅 [AWS中的错误重试和指数回退](https://docs.aws.amazon.com/general/latest/gr/api-retries.html)以及[如何处理“throttling – Maximum sending rate exceeded”错误](https://aws.amazon.com/blogs/ses/how-to-handle-a-throttling-maximum-sending-rate-exceeded-error/)。

  您可以请求删除此限制。有关更多信息，请参阅[如何从 EC2 实例删除端口 25 上的限制？](https://aws.amazon.com/premiumsupport/knowledge-center/ec2-port-25-throttle/)。

# Oracle XML DB
<a name="Appendix.Oracle.Options.XMLDB"></a>

Oracle XML DB 向数据库实例添加本机 XML 支持。利用 XML DB，可以存储和检索结构化或非结构化 XML 以及关系数据。RDS for Oracle 不支持 XML DB 协议服务器。

XML DB 预安装在 Oracle Database 12c 及更高版本上。因此，您无需使用选项组来显式安装 XML DB 作为附加特征。

要了解如何配置和使用 XML DB，请参阅 Oracle 数据库文档中的 [Oracle XML DB Developer's Guide](https://docs.oracle.com/en/database/oracle/oracle-database/19/adxdb/)。