

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Oracle 数据库作为目标 AWS Database Migration Service
<a name="CHAP_Target.Oracle"></a>

您可以使用从其他 Oracle 数据库或其他支持的数据库之一将数据迁移到 Oracle 数据库目标。 AWS DMS可以使用安全套接字层 (SSL) 加密 Oracle 终端节点与复制实例之间的连接。有关在 Oracle 终端节点上使用 SSL 的更多信息，请参阅[将 SSL 与 AWS Database Migration Service](CHAP_Security.SSL.md)。 AWS DMS 还支持使用 Oracle 透明数据加密 (TDE) 来加密目标数据库中的静态数据，因为 Oracle TDE 不需要加密密钥或密码即可写入数据库。

有关 AWS DMS 支持作为目标的 Oracle 版本的信息，请参见[的目标 AWS DMS](CHAP_Introduction.Targets.md)。

将 Oracle 作为目标时，我们假定数据将迁移到目标连接所使用的架构或用户。如果您要将数据迁移到其他架构，请使用架构转换来完成此操作。例如，假设您的目标终端节点连接到用户 `RDSMASTER` 并且您希望从用户 `PERFDATA1` 迁移到 `PERFDATA2`。在这种情况下，请创建一个转换，如下所示。

```
{
   "rule-type": "transformation",
   "rule-id": "2",
   "rule-name": "2",
   "rule-action": "rename",
   "rule-target": "schema",
   "object-locator": {
   "schema-name": "PERFDATA1"
},
"value": "PERFDATA2"
}
```

使用 Oracle 作为目标时，会将所有表和索 AWS DMS 引迁移到目标中的默认表和索引表空间。如果要将表和索引迁移到不同的表和索引表空间，请使用表空间转换来执行此操作。例如，假设您在 `INVENTORY` 架构中有一组已分配给 Oracle 源中的某些表空间的表。对于迁移，您希望将所有这些表分配给目标中的单个 `INVENTORYSPACE` 表空间。在这种情况下，请创建一个转换，如下所示。

```
{
   "rule-type": "transformation",
   "rule-id": "3",
   "rule-name": "3",
   "rule-action": "rename",
   "rule-target": "table-tablespace",
   "object-locator": {
      "schema-name": "INVENTORY",
      "table-name": "%",
      "table-tablespace-name": "%"
   },
   "value": "INVENTORYSPACE"
}
```

有关转换的更多信息，请参阅 [使用 JSON 指定表选择和转换规则](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.md)。

如果 Oracle 同时作为源和目标，则可以通过设置 Oracle 源额外连接属性 `enableHomogenousTablespace=true` 来保留现有的表或索引表空间分配。有关更多信息，请参阅 [使用 Oracle 作为来源时的终端节点设置 AWS DMS](CHAP_Source.Oracle.md#CHAP_Source.Oracle.ConnectionAttrib)。

有关使用 Oracle 数据库作为目标的更多详细信息 AWS DMS，请参阅以下各节：

**Topics**
+ [将 Oracle 作为目标的局限性 AWS Database Migration Service](#CHAP_Target.Oracle.Limitations)
+ [将 Oracle 作为目标所需的用户账户权限](#CHAP_Target.Oracle.Privileges)
+ [将 Oracle 数据库配置为目标 AWS Database Migration Service](#CHAP_Target.Oracle.Configuration)
+ [使用 Oracle 作为目标时的终端节点设置 AWS DMS](#CHAP_Target.Oracle.ConnectionAttrib)
+ [Oracle 的目标数据类型](#CHAP_Target.Oracle.DataTypes)

## 将 Oracle 作为目标的局限性 AWS Database Migration Service
<a name="CHAP_Target.Oracle.Limitations"></a>

使用 Oracle 作为数据迁移目标的限制如下所示：
+ AWS DMS 不会在目标 Oracle 数据库上创建架构。您必须在目标 Oracle 数据库上创建任意所需的架构。Oracle 目标中很可能已存在该架构名称。源架构中的表将导入用户或架构，该用户或架构 AWS DMS 用于连接到目标实例。要迁移多个架构，可以创建多个复制任务。您也可以将数据迁移到目标上的不同架构。为此，您需要对 AWS DMS 表映射使用架构转换规则。
+ AWS DMS 不支持带有 INDEXTYPE 上下文的表的`Use direct path full load`选项。作为解决方法，您可以使用数组加载。
+ 利用批量优化应用选项，加载到净更改表中时使用直接路径，这不支持 XML 类型。作为解决方法，您可以使用事务应用模式。
+ Oracle 目标可以按不同方式处理从源数据库迁移的空字符串（例如，转换为一个空格字符串）。这可能会导致 AWS DMS 验证报告不匹配。
+ 您可以使用以下公式表示在批量优化应用模式下支持的每个表的总列数：

  ```
  2 * {{columns_in_original_table}} + {{columns_in_primary_key}} <= 999
  ```

  例如，如果原始表有 25 列，其主键由 5 列组成，则总列数为 55。如果表超过支持的列数，则所有更改都将在 one-by-one模式下应用。
+ AWS DMS 不支持 Oracle 云基础架构 (OCI) 上的自治数据库。
+ 在事务应用模式下，Oracle 目标可以处理大小不超过 32 KB 的 DML 语句。虽然此限制足以满足许多使用案例的要求，但超过 32 KB 的 DML 语句将失败，并显示错误：“ORA-01460：请求的转换未实现或不合理。” 要解决此问题，必须将 `BatchApplyEnabled` 任务设置设为 `true`，从而启用批量应用功能。批量应用减少了语句的总体大小，从而让您绕过 32 KB 的限制。有关更多信息，请参阅 [目标元数据任务设置](CHAP_Tasks.CustomizingTasks.TaskSettings.TargetMetadata.md)。
+ AWS DMS 由于 LOB 数据的特殊处理要求，LOB 表的直接路径满载可能会失败，并显示错误 ORA-39777。此错误发生在直接路径加载过程中，可能会中断涉及 LOB 列的迁移任务。要解决此问题，请在目标端点上禁用 `useDirectPathFullLoad` 设置，然后重试加载操作。

## 将 Oracle 作为目标所需的用户账户权限
<a name="CHAP_Target.Oracle.Privileges"></a>

要在 AWS Database Migration Service 任务中使用 Oracle 目标，请在 Oracle 数据库中授予以下权限。您可向 AWS DMS的 Oracle 数据库定义中指定的用户账户授予这些权限。
+ SELECT ANY TRANSACTION 
+ 针对 V$NLS\_PARAMETERS 的 SELECT 
+ 针对 V$TIMEZONE\_NAMES 的 SELECT 
+ 针对 ALL\_INDEXES 的 SELECT 
+ 针对 ALL\_OBJECTS 的 SELECT 
+ 针对 DBA\_OBJECTS 的 SELECT
+ 针对 ALL\_TABLES 的 SELECT 
+ 针对 ALL\_USERS 的 SELECT 
+ 针对 ALL\_CATALOG 的 SELECT 
+ 针对 ALL\_CONSTRAINTS 的 SELECT 
+ 针对 ALL\_CONS\_COLUMNS 的 SELECT 
+ 针对 ALL\_TAB\_COLS 的 SELECT 
+ 针对 ALL\_IND\_COLUMNS 的 SELECT 
+ DROP ANY TABLE 
+ SELECT ANY TABLE
+ INSERT ANY TABLE 
+ UPDATE ANY TABLE
+ CREATE ANY VIEW
+ DROP ANY VIEW
+ CREATE ANY PROCEDURE
+ ALTER ANY PROCEDURE
+ DROP ANY PROCEDURE
+ CREATE ANY SEQUENCE
+ ALTER ANY SEQUENCE
+ DROP ANY SEQUENCE 
+ DELETE ANY TABLE

对于下列要求，授予这些附加权限：
+ 要使用特定表列表，请对任意复制表授予 SELECT 权限以及 ALTER 权限。
+ 要允许用户在默认表空间中创建表，请授予权限 GRANT UNLIMITED TABLESPACE。
+ 对于登录，请授予权限 CREATE SESSION。
+ 如果您使用直接路径（完全加载时的默认路径），则 `GRANT LOCK ANY TABLE to {{dms_user}};`.
+ 如果使用“DROP and CREATE”表格准备模式时架构不同，则 `GRANT CREATE ANY INDEX to {{dms_user}};`.
+ 对于一些完全加载场景，您已选择“DROP and CREATE table (对表执行 DROP 或 CREATE 操作)”或“TRUNCATE before loading (加载前执行 TRUNCATE 操作)”选项，其中目标表架构与 DMS 用户的不同。在此情况下，授予 DROP ANY TABLE 权限。
+ 要将更改存储在更改表或审计表（其中目标表架构与 DMS 用户的不同）中，请授予 CREATE ANY TABLE 和 CREATE ANY INDEX 权限。
+ 要使用验证功能验证 LOB 列，请授予 DMS 用户对 `SYS.DBMS_CRYPTO` 的 EXECUTE 权限。

### 目标数据库所需的 AWS Database Migration Service 读取权限
<a name="CHAP_Target.Oracle.Privileges.Read"></a>

必须向 AWS DMS 用户帐户授予以下 DBA 表的读取权限：
+ 针对 DBA\_USERS 的 SELECT
+ 针对 DBA\_TAB\_PRIVS 的 SELECT
+ 针对 DBA\_OBJECTS 的 SELECT
+ 针对 DBA\_SYNONYMS 的 SELECT
+ 针对 DBA\_SEQUENCES 的 SELECT
+ 针对 DBA\_TYPES 的 SELECT
+ 针对 DBA\_INDEXES 的 SELECT
+ 针对 DBA\_TABLES 的 SELECT
+ 针对 DBA\_TRIGGERS 的 SELECT
+ SYS.DBA\_REGISTRY 上的 SELECT

如果无法将任意所需权限授予 V$xxx，则将其授予 V\_$xxx。

### 迁移前评测
<a name="CHAP_Target.Oracle.Privileges.Premigration"></a>

要使用[Oracle 评测](CHAP_Tasks.AssessmentReport.Oracle.md)中列出的迁移前评测并将 Oracle 作为目标，您必须向 Oracle 数据库目标端点中指定的用户账户添加以下权限：

```
GRANT SELECT ON V_$INSTANCE TO dms_user;
GRANT EXECUTE ON SYS.DBMS_XMLGEN TO dms_user;
```

## 将 Oracle 数据库配置为目标 AWS Database Migration Service
<a name="CHAP_Target.Oracle.Configuration"></a>

在使用 Oracle 数据库作为数据迁移目标之前，必须向提供一个 Oracle 用户帐户 AWS DMS。用户帐户必须具有对 Oracle 数据库的 read/write 权限，如中所述[将 Oracle 作为目标所需的用户账户权限](#CHAP_Target.Oracle.Privileges)。

## 使用 Oracle 作为目标时的终端节点设置 AWS DMS
<a name="CHAP_Target.Oracle.ConnectionAttrib"></a>

您可以使用端点设置来配置 Oracle 目标数据库，这与使用额外连接属性类似。您可以在使用 AWS DMS 控制台创建目标端点时指定设置，或者使用中的`create-endpoint`命令和 `--oracle-settings '{"{{EndpointSetting"}}: {{"value"}}, {{...}}}'` JSON 语法。[AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/dms/index.html)

下表显示了您可以将 Oracle 作为目标的端点设置。


| Name | 说明 | 
| --- | --- | 
| `UseDirectPathFullLoad` | 设置为时`Y`， AWS DMS 使用直接路径满载。指定此值以在 Oracle Call Interface (OCI) 中启用直接路径协议。此 OCI 协议允许在完全加载期间批量加载 Oracle 目标表。<br />默认值：`true`<br />有效值：`true`/`false` <br />示例：`--oracle-settings '{"UseDirectPathFullLoad": false}'` | 
| `DirectPathParallelLoad` | 如果设置为 `true`，则此属性在 `UseDirectPathFullLoad` 设置为 `Y` 时指定并行加载。此属性也仅在您使用 parallel 加载 AWS DMS 功能时适用。有关更多信息，请参阅 [表和集合设置规则和操作](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Tablesettings.md)中 `parallel-load` 操作的描述。<br />有关指定此并行加载设置的限制是目标表不能具有任何约束或索引。有关此限制的更多信息，请参阅[在并行直接路径加载后启用约束](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-sql-loader-conventional-and-direct-loads.html#GUID-E2A3A8A3-78FF-45B6-90C0-14211621E77C)。如果启用约束或索引，则将此属性设置为 `true` 将不起作用。<br />默认值：`false`<br />有效值：`true`/`false` <br />示例：`--oracle-settings '{"DirectPathParallelLoad": true}'` | 
| `DirectPathNoLog` | 如果设置为 `true`，此属性可以通过直接写入表而不向数据库日志写入跟踪来提高 Oracle 目标数据库的提交率。有关更多信息，请参阅[直接加载 INSERT](https://docs.oracle.com/cd/A87860_01/doc/server.817/a76965/c21dlins.htm)。此属性仅在您将 `UseDirectPathFullLoad` 设置为 `Y` 时才适用。<br />默认值：`false`<br />有效值：`true`/`false` <br />示例：`--oracle-settings '{"DirectPathNoLog": true}'` | 
| `CharLengthSemantics` | 指定字符列的长度是以字节数为单位还是以字符数为单位。要指示字符列长度以字符数为单位，请将此属性设置为 `CHAR`。否则，字符列长度以字节数为单位。<br />默认值：未设置为 `CHAR`<br />有效值：`CHAR`<br />示例：`--oracle-settings '{"CharLengthSemantics": "CHAR"}'` | 
| `AlwaysReplaceEmptyString` | AWS DMS 在迁移到 Oracle 目标时，会添加一个额外的空间来复制空字符串。通常，Oracle 没有表示空字符串的符号。在 varchar2 上插入空字符串时，会将空字符串加载为 NULL。如果要在 Oracle 上将数据作为 NULL 插入，请将此属性设置为 FALSE。<br />默认值：`true`<br />有效值：`true`/`false`<br />示例：`--oracle-settings '{"AlwaysReplaceEmptyString": false}'` | 

## Oracle 的目标数据类型
<a name="CHAP_Target.Oracle.DataTypes"></a>

与一起使用的目标 Oracle 数据库 AWS DMS 支持大多数 Oracle 数据类型。下表显示了使用时支持的 Oracle 目标数据类型 AWS DMS 以及 AWS DMS 数据类型的默认映射。有关如何查看从源映射的数据类型的更多信息，请参阅有关所使用的源的部分。


|  AWS DMS 数据类型  |  Oracle 数据类型  | 
| --- | --- | 
| BOOLEAN | NUMBER (1) | 
| BYTES | RAW (length) | 
| DATE | DATETIME | 
| TIME | TIMESTAMP (0) | 
| DATETIME | TIMESTAMP (scale) | 
| INT1 | NUMBER (3) | 
| INT2 | NUMBER (5) | 
| INT4 | NUMBER (10) | 
| INT8 | NUMBER (19) | 
| NUMERIC | NUMBER (p,s) | 
| REAL4 | FLOAT | 
| REAL8 | FLOAT | 
| STRING | 带日期指示：DATE <br />带时间指示：TIMESTAMP <br />带时间戳指示：TIMESTAMP <br />带 timestamp\_with\_timezone 指示：TIMESTAMP WITH TIMEZONE <br />带 timestamp\_with\_local\_timezone 指示：TIMESTAMP WITH LOCAL TIMEZONE 带 interval\_year\_to\_month 指示：INTERVAL YEAR TO MONTH <br />带 interval\_day\_to\_second 指示：INTERVAL DAY TO SECOND <br />如果 length > 4000：CLOB<br />在所有其他情况下： VARCHAR2 （长度） | 
| UINT1 | NUMBER (3) | 
| UINT2 | NUMBER (5) | 
| UINT4 | NUMBER (10) | 
| UINT8 | NUMBER (19) | 
| WSTRING | 如果 length > 2000：NCLOB<br />在所有其他情况下： NVARCHAR2 （长度） | 
| BLOB | BLOB<br />要将此数据类型与一起使用 AWS DMS，必须 BLOBs 为特定任务启用使用。仅包含主键的表中支持 BLOB 数据类型 | 
| CLOB | CLOB<br />要将此数据类型与一起使用 AWS DMS，必须 CLOBs 为特定任务启用使用。在更改数据捕获 (CDC) 期间，仅包含主键的表支持 CLOB 数据类型。<br />string<br />源上声明的大小大于 4000 字节的 Oracle VARCHAR2 数据类型通过 AWS DMS CLOB 映射到 Oracle 目标上的字符串。 | 
| NCLOB | NCLOB<br />要将此数据类型与一起使用 AWS DMS，必须 NCLOBs 为特定任务启用使用。在 CDC 期间，仅包含主键的表中支持 NCLOB 数据类型。<br />WSTRING<br />源上声明的大小大于 4000 字节的 Oracle VARCHAR2 数据类型通过 AWS DMS NCLOB 映射到 Oracle 目标上的 WSTRING。 | 
| XMLTYPE | XMLTYPE 目标数据类型仅与 Oracle-to-Oracle复制任务相关。<br />当源数据库是 Oracle 时，源数据类型将按“原样”复制到 Oracle 目标。例如，源上的 XMLTYPE 数据类型将创建为目标上的 XMLTYPE 数据类型。 | 