

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

# 使用亚马逊 S3 作为目标 AWS Database Migration Service
<a name="CHAP_Target.S3"></a>

您可以使用任何支持的数据库源将数据迁移到 Amazon S3。 AWS DMS 在 AWS DMS 任务中使用 Amazon S3 作为目标时，默认情况下，满载和更改数据捕获 (CDC) 数据都以逗号分隔值 (.csv) 格式写入。对于更紧凑的存储和更快速的查询选项，您还可以选择将数据写入 Apache Parquet (.parquet) 格式。

AWS DMS 使用增量十六进制计数器命名在满载期间创建的文件，例如.csv，... LOAD00001 LOAD00002 、 LOAD00009、 LOAD0000 A 等用于.csv 文件。 AWS DMS 使用时间戳命名 CDC 文件，例如 20141029-1134010000.csv。对于每个包含记录的源表，在指定的目标文件夹下 AWS DMS 创建一个文件夹（如果源表不为空）。 AWS DMS 将所有满载文件和 CDC 文件写入指定的 Amazon S3 存储桶。您可以使用[MaxFileSize](https://docs.aws.amazon.com/dms/latest/APIReference/API_S3Settings.html#DMS-Type-S3Settings-MaxFileSize)端点设置控制所 AWS DMS 创建文件的大小。

参数 `bucketFolder` 包含 .csv 或 .parquet 文件在上传到 S3 存储桶之前的存储位置。利用 .csv 文件，表数据使用以下格式存储在 S3 存储桶中，与完全加载文件一起显示。

```
{{database_schema_name}}/{{table_name}}/LOAD00000001.csv
{{database_schema_name}}/{{table_name}}/LOAD00000002.csv
...
{{database_schema_name}}/{{table_name}}/LOAD00000009.csv
{{database_schema_name}}/{{table_name}}/LOAD0000000A.csv
{{database_schema_name}}/{{table_name}}/LOAD0000000B.csv
...{{database_schema_name}}/{{table_name}}/LOAD0000000F.csv
{{database_schema_name}}/{{table_name}}/LOAD00000010.csv
...
```

您可以使用额外连接属性指定列分隔符、行分隔符以及其他参数。有关额外连接属性的更多信息，请参阅此部分结尾的[使用 Amazon S3 作为目标时的终端节点设置 AWS DMS](#CHAP_Target.S3.Configuring)。

为防止欺骗，请在执行操作之前 AWS DMS 验证存储桶所有权。默认情况下，如果未指定 `ExpectedBucketOwner` Amazon S3 终端节点设置，则 AWS DMS 使用拥有该 AWS DMS 服务角色的 AWS 账户 ID 作为预期的存储桶拥有者。

要将数据迁移到其他 AWS 账户拥有的 S3 存储桶，您必须在 `ExpectedBucketOwner` Amazon S3 终端节点设置中明确指定实际的存储桶拥有者，如下所示。否则，跨账户复制任务将失败。

```
--s3-settings '{"ExpectedBucketOwner": "AWS_Account_ID"}'
```

当您使用使用 AWS DMS CDC 任务复制数据更改时，.csv 或.parquet 输出文件的第一列会指示行数据的更改方式，如以下.csv 文件所示。

```
I,101,Smith,Bob,4-Jun-14,New York
U,101,Smith,Bob,8-Oct-15,Los Angeles
U,101,Smith,Bob,13-Mar-17,Dallas
D,101,Smith,Bob,13-Mar-17,Dallas
```

在本示例中，假设源数据库中有一个`EMPLOYEE`表。 AWS DMS 将数据写入.csv 或.parquet 文件，以响应以下事件：
+ 14 年 6 月 4 日，纽约办事处聘用了一名新员工 (Bob Smith，员工 ID 101)。在 .csv 或 .parquet 文件中，第一列中的 `I` 指示在源数据库的 EMPLOYEE 表中插入 (`INSERT`) 了一个新行。
+ 15 年 10 月 8 日，Bob 调到了洛杉矶办事处。在 .csv 或 .parquet 文件中，`U` 指示更新 （`UPDATE`） 了 EMPLOYEE 表中的相应行以反映 Bob 的新办公地点。该行的其余部分反映更新（`UPDATE`）后如何显示该 EMPLOYEE 表行。
+ 17 年 3 月 13 日，Bob 又调到了达拉斯办事处。在 .csv 或 .parquet 文件中，`U` 指示再次更新 (`UPDATE`) 了该行。该行的其余部分反映更新（`UPDATE`）后如何显示该 EMPLOYEE 表行。
+ 在达拉斯工作一段时间后，Bob 离开了公司。在 .csv 或 .parquet 文件中，`D` 指示在源表中删除 `DELETE` 了该行。该行的其余部分反映在删除之前如何显示该 EMPLOYEE 表行。

请注意，默认情况下，CDC 会 AWS DMS 存储每个数据库表的行更改，而不考虑事务顺序。如果要根据事务顺序将行更改存储在 CDC 文件中，则需要使用 S3 端点设置来指定此设置以及您希望在 S3 目标上存储 CDC 事务文件的文件夹路径。有关更多信息，请参阅 [捕获数据更改（CDC）时包括 S3 目标上的事务顺序](#CHAP_Target.S3.EndpointSettings.CdcPath)。

要控制在执行数据复制任务期间向 Amazon S3 目标写入的频率，您可以配置 `cdcMaxBatchInterval` 和 `cdcMinFileSize` 额外连接属性。这可以提高分析数据的性能，而无需任何额外的开销操作。有关更多信息，请参阅 [使用 Amazon S3 作为目标时的终端节点设置 AWS DMS](#CHAP_Target.S3.Configuring)。

**Topics**
+ [将 Amazon S3 作为目标的先决条件](#CHAP_Target.S3.Prerequisites)
+ [将 Amazon S3 作为目标的限制](#CHAP_Target.S3.Limitations)
+ [安全性](#CHAP_Target.S3.Security)
+ [使用 Apache Parquet 存储 Amazon S3 对象](#CHAP_Target.S3.Parquet)
+ [Amazon S3 对象标记](#CHAP_Target.S3.Tagging)
+ [创建用于加密 Amazon S3 目标对象的 AWS KMS 密钥](#CHAP_Target.S3.KMSKeys)
+ [使用基于日期的文件夹分区](#CHAP_Target.S3.DatePartitioning)
+ [使用 Amazon S3 作为目标时并行加载分区源 AWS DMS](#CHAP_Target.S3.ParallelLoad)
+ [使用 Amazon S3 作为目标时的终端节点设置 AWS DMS](#CHAP_Target.S3.Configuring)
+ [AWS Glue Data Catalog 与 Amazon S3 目标一起使用 AWS DMS](#CHAP_Target.S3.GlueCatalog)
+ [在 Amazon S3 目标上使用数据加密、parquet 文件和 CDC](#CHAP_Target.S3.EndpointSettings)
+ [指示迁移的 S3 数据中的源数据库操作](#CHAP_Target.S3.Configuring.InsertOps)
+ [S3 Parquet 的目标数据类型](#CHAP_Target.S3.DataTypes)

## 将 Amazon S3 作为目标的先决条件
<a name="CHAP_Target.S3.Prerequisites"></a>

在使用 Amazon S3 作为目标之前，请检查是否满足以下条件：
+ 您用作目标的 S3 存储桶与您用于迁移数据的 DMS 复制实例位于同一 AWS 区域。
+ 您用于迁移的 AWS 账户具有 IAM 角色，该角色对用作目标的 S3 存储桶具有写入和删除权限。
+ 此角色已标记访问，以便您可以标记写入目标存储桶的任何 S3 对象。
+ IAM 角色已将 DMS（dms.amazonaws.com）添加为*可信实体*。
+ 对于 AWS DMS 版本 3.4.7 及更高版本，DMS 必须通过 VPC 终端节点或公共路由访问源存储桶。有关 VPC 端点的信息，请参阅 [配置 VPC 终端节点 AWS DMS](CHAP_VPC_Endpoints.md)。

要设置此账户访问权限，请确保向用于创建迁移任务的用户账户分配的角色具有以下一系列权限。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:DeleteObject",
                "s3:PutObjectTagging"
            ],
            "Resource": [
                "arn:aws:s3:::buckettest2/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::buckettest2"
            ]
        }
    ]
}
```

------

有关将 S3 作为目标使用验证的先决条件，请参阅[S3 目标验证先决条件](CHAP_Validating_S3.md#CHAP_Validating_S3_prerequisites)。

## 将 Amazon S3 作为目标的限制
<a name="CHAP_Target.S3.Limitations"></a>

将 Amazon S3 作为目标时存在以下限制：
+ 不要为 S3 启用版本控制。如果您需要 S3 版本控制，请使用生命周期策略主动删除旧版本。否则，您可能会遇到由于 S3 `list-object` 调用超时而导致端点测试连接失败的情况。要为 S3 存储桶创建生命周期策略，请参阅[管理存储生命周期](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)。要删除 S3 对象的某个版本，请参阅[从启用版本控制的存储桶中删除对象版本](https://docs.aws.amazon.com/AmazonS3/latest/dev/DeletingObjectVersions.html)。
+ 3.4.7 及更高版本支持启用了 VPC（网关 VPC）的 S3 存储桶。
+ 支持以下数据定义语言（DDL）命令以更改数据捕获（CDC）：截断表、删除表、创建表、重命名表、添加列、删除列、重命名列、重命名列和更改列数据类型。请注意，在源数据库上添加、删除或重命名列时，目标 S3 存储桶中不会记录 ALTER 语句， AWS DMS 也不会更改先前创建的记录以匹配新结构。更改后，使用新的表结构 AWS DMS 创建任何新记录。
**注意**  
截断 DDL 操作会删除 S3 存储桶中的所有文件和相应的表文件夹。您可以使用任务设置来禁用该行为，并配置 DMS 在更改数据捕获（CDC）期间处理 DDL 行为的方式。有关更多信息，请参阅 [更改处理 DDL 处理的任务设置](CHAP_Tasks.CustomizingTasks.TaskSettings.DDLHandling.md)。
+ 不支持完整 LOB 模式。
+ 不支持在完全加载期间对源表结构进行更改。支持在完全加载期间更改数据。
+ 将多个任务从同一源表复制到同一目标 S3 终端节点存储桶将导致这些任务写入到同一文件。如果您的数据源来自同一个表，我们建议您指定不同的目标端点（存储桶）。
+ S3 端点不支持 `BatchApply`。为 S3 目标使用“批应用”（例如，`BatchApplyEnabled` 目标元数据任务设置）可能会导致数据丢失。
+ 您可以将 `DatePartitionEnabled` 或 `addColumnName` 与 `PreserveTransactions` 或 `CdcPath` 一起使用。
+ AWS DMS 不支持使用转换规则将多个源表重命名为同一个目标文件夹。
+ 如果在完全加载阶段对源表进行大量写入，则 DMS 可能会将重复的记录写入 S3 存储桶或缓存的更改。
+ 如果为任务配置的 `TargetTablePrepMode` 为 `DO_NOTHING`，并且任务在完全加载阶段突然停止并恢复，则 DMS 可能会将重复的记录写入 S3 存储桶。
+ 如果为目标端点配置的 `PreserveTransactions` 设置为 `true`，则重新加载表不会清除之前生成的 CDC 文件。有关更多信息，请参阅 [捕获数据更改（CDC）时包括 S3 目标上的事务顺序](#CHAP_Target.S3.EndpointSettings.CdcPath)。

有关将 S3 作为目标使用验证的限制，请参阅[使用 S3 目标验证的限制](CHAP_Validating_S3.md#CHAP_Validating_S3_limitations)。

## 安全性
<a name="CHAP_Target.S3.Security"></a>

要使用 Amazon S3 作为目标，在迁移中使用的账户必须具有对作为目标的 Amazon S3 存储桶的写入和删除访问权限。对于具有访问 Amazon S3 所需权限的 IAM 角色，指定该角色的 Amazon 资源名称（ARN）。

AWS DMS 支持一组针对 Amazon S3 的预定义授权，称为固定访问控制列表 (ACLs)。每个标准 ACL 具有一组被授予者和权限，可用于为 Amazon S3 存储桶设置权限。您可以将 `cannedAclForObjects` 用于 S3 目标终端节点的连接字符串属性以指定标准 ACL。有关使用额外连接属性 `cannedAclForObjects` 的更多信息，请参阅[使用 Amazon S3 作为目标时的终端节点设置 AWS DMS](#CHAP_Target.S3.Configuring)。有关 Amazon S3 封装版的更多信息 ACLs，请参阅封[装 ACL](https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl)。

用于迁移的 IAM 角色必须能够执行 `s3:PutObjectAcl` API 操作。

## 使用 Apache Parquet 存储 Amazon S3 对象
<a name="CHAP_Target.S3.Parquet"></a>

逗号分隔值（.csv）格式是 Amazon S3 目标对象的默认存储格式。对于更紧凑的存储和更快速的查询，您可以改用 Apache Parquet (.parquet) 作为存储格式。

Apache Parquet 是一种最初专为 Hadoop 设计的开源文件存储格式。有关 Apache Parquet 的更多信息，请参阅 [https://parquet.apache.org/](https://parquet.apache.org/)。

要将 .parquet 设置为您的已迁移 S3 目标对象的存储格式，您可以使用以下机制：
+ 您在使用 AWS CLI 或 AWS DMS的 API 创建终端节点时提供作为 JSON 对象的参数的终端节点设置。有关更多信息，请参阅 [在 Amazon S3 目标上使用数据加密、parquet 文件和 CDC](#CHAP_Target.S3.EndpointSettings)。
+ 您在创建终端节点时提供作为分号分隔列表的额外连接属性。有关更多信息，请参阅 [使用 Amazon S3 作为目标时的终端节点设置 AWS DMS](#CHAP_Target.S3.Configuring)。

## Amazon S3 对象标记
<a name="CHAP_Target.S3.Tagging"></a>

您可以标记复制实例所创建的 Amazon S3 对象，方式是指定适当的 JSON 对象作为任务-表映射规则的一部分。有关 S3 对象标记的要求和选项（包括有效标签名称）的更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[对象标记](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-tagging.html)。有关使用 JSON 的表映射的更多信息，请参阅[使用 JSON 指定表选择和转换规则](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.md)。

您可以标记为指定表创建的 S3 对象，方式是使用 `selection` 规则类型的一个或多个 JSON 对象。然后，您可以使用 `add-tag` 操作在此 `selection` 对象后添加 `post-processing` 规则类型的一个或多个 JSON 对象。这些后处理规则标识要标记的 S3 对象并指定要添加到这些 S3 对象的标签的名称和值。

您可以在下表中找到要在 `post-processing` 规则类型的 JSON 对象中指定的参数。


| 参数 | 可能的值 | 说明 | 
| --- | --- | --- | 
| rule-type | post-processing | 一个将后处理操作应用于生成的目标对象的值。您可以指定一个或多个后处理规则以标记所选 S3 对象。 | 
| rule-id | 一个数字值。 | 一个用于标识规则的唯一数字值。 | 
| rule-name | 一个字母数字值。 | 一个用于标识规则的唯一名称。 | 
| rule-action | add-tag | 要应用于 S3 对象的后处理操作。您可以通过对 add-tag 操作使用单个 JSON 后处理对象来添加一个或多个标签。 | 
| object-locator | `schema-name` – 表架构的名称。<br />`table-name` – 表的名称。 | 规则应用于的每个架构和表的名称。您可以使用“%”百分比符号作为每个 `object-locator` 参数的值的全部或部分的通配符。因此，您可以匹配这些项目：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/dms/latest/userguide/CHAP_Target.S3.html) | 
| tag-set | `key` – 单个标签的任何有效名称。<br />`value` – 此标签的任何有效的 JSON 值。 | 要在匹配指定的 `object-locator` 的每个已创建 S3 对象上设置的一个或多个标签的名称和值。您可以在单个 `tag-set` 参数对象中最多指定 10 个键值对。有关 S3 对象标记的更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[对象标记](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-tagging.html)。<br />您还可以使用 `${dyn-value}` 为 `key` 和 `value` 参数的值的全部或部分指定一个动态值。此处，`${dyn-value}` 可以是 `${schema-name}` 或 `${table-name}`。因此，您可以插入当前选定架构或表的名称作为参数值的完整内容或任何部分。  如果为 `key` 参数插入一个动态值，则可以使用 S3 对象的重复名称生成标签，具体取决于其使用方式。在这种情况下，仅将一个重复标签设置添加到对象。   | 

在指定多个 `post-processing` 规则类型来标记一系列 S3 对象时，将仅使用来自一个后处理规则的一个 `tag-set` 对象来标记每个 S3 对象。用于标记给定 S3 对象的特定标记集是来自后处理规则的标记集，其关联对象定位器与该 S3 对象最匹配。

例如，假设两个后处理规则标识同一 S3 对象。另外，假设一个规则中的对象定位器使用通配符，而另一个规则中的对象定位器使用精确匹配来标识 S3 对象（不带通配符）。在这种情况下，与后处理规则关联的带精确匹配的标签集将用于标记 S3 对象。如果多个后处理规则同样匹配某个给定 S3 对象，则与第一个此类后处理规则关联的标签集将用于标记该对象。

**Example 将静态标签添加到为单个表和架构创建的 S3 对象**  
以下选择和后处理规则将三个标签（`tag_1`、`tag_2` 和 `tag_3`，分别带有相应的静态值 `value_1`、`value_2` 和 `value_3`）添加到创建的 S3 对象。此 S3 对象对应于带有名为 `aat2` 的架构的名为 `STOCK` 的源中的单个表。  

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "5",
            "rule-name": "5",
            "object-locator": {
                "schema-name": "aat2",
                "table-name": "STOCK"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "post-processing",
            "rule-id": "41",
            "rule-name": "41",
            "rule-action": "add-tag",
            "object-locator": {
                "schema-name": "aat2",
                "table-name": "STOCK"
            },
            "tag-set": [
              {
                "key": "tag_1",
                "value": "value_1"
              },
              {
                "key": "tag_2",
                "value": "value_2"
              },
              {
                "key": "tag_3",
                "value": "value_3"
              }                                     
           ]
        }
    ]
}
```

**Example 将静态和动态标签添加到为多个表和架构创建的 S3 对象**  
以下示例具有一个选择规则和两个后处理规则，其中来自源的输入包括所有表及其所有架构。  

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "%",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "post-processing",
            "rule-id": "21",
            "rule-name": "21",
            "rule-action": "add-tag",
            "object-locator": {
                "schema-name": "%",
                "table-name": "%",
            },
            "tag-set": [
              { 
                "key": "dw-schema-name",
                "value":"${schema-name}"
              },
              {
                "key": "dw-schema-table",
                "value": "my_prefix_${table-name}"
              }
            ]
        },
        {
            "rule-type": "post-processing",
            "rule-id": "41",
            "rule-name": "41",
            "rule-action": "add-tag",
            "object-locator": {
                "schema-name": "aat",
                "table-name": "ITEM",
            },
            "tag-set": [
              {
                "key": "tag_1",
                "value": "value_1"
              },
              {
                "key": "tag_2",
                "value": "value_2"
              }           ]
        }
    ]
}
```
第一个后处理规则将带有相应的动态值（`${schema-name}` 和 `my_prefix_${table-name}`）的两个标签（`dw-schema-name` 和 `dw-schema-table`）添加到目标中创建的几乎所有 S3 对象。例外情况是使用第二个后处理规则标识和标记的 S3 对象。因此，由通配符对象定位器标识的每个目标 S3 对象是使用标识其在源中对应的架构和表的标签创建的。  
第二个后处理规则将 `tag_1` 和 `tag_2`（分别带有相应的静态值 `value_1` 和 `value_2`）添加到由精确匹配对象定位器标识的创建的 S3 对象。因此，该创建的 S3 对象对应于带有名为 `aat` 的架构的名为 `ITEM` 的源中的单个表。由于精确匹配，这些标签将替换第一个后处理规则中添加的此对象上的任何标签，这仅按通配符匹配 S3 对象。

**Example 将动态标签名称和值添加到 S3 对象**  
以下示例具有两个选择规则和一个后处理规则。在这里，源中的输入仅包括 `retail` 或 `wholesale` 架构中的 `ITEM` 表。  

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "retail",
                "table-name": "ITEM"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "wholesale",
                "table-name": "ITEM"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "post-processing",
            "rule-id": "21",
            "rule-name": "21",
            "rule-action": "add-tag",
            "object-locator": {
                "schema-name": "%",
                "table-name": "ITEM",
            },
            "tag-set": [
              { 
                "key": "dw-schema-name",
                "value":"${schema-name}"
              },
              {
                "key": "dw-schema-table",
                "value": "my_prefix_ITEM"
              },
              {
                "key": "${schema-name}_ITEM_tag_1",
                "value": "value_1"
              },
              {
                "key": "${schema-name}_ITEM_tag_2",
                "value": "value_2"
              }
            ]
    ]
}
```
后处理规则的标签集将两个标签（`dw-schema-name` 和 `dw-schema-table`）添加到为目标中的 `ITEM` 表创建的所有 S3 对象。第一个标签具有动态值 `"${schema-name}"`，第二个标签具有静态值 `"my_prefix_ITEM"`。因此，每个目标 S3 对象是使用标识其在源中对应的架构和表的标签创建的。  
此外，该标签集还添加带动态名称（`${schema-name}_ITEM_tag_1` 和 `"${schema-name}_ITEM_tag_2"`）的两个额外标签。这些标签具有相应的静态值 `value_1` 和 `value_2`。因此，这些标签均针对当前架构 `retail` 和 `wholesale` 进行命名。您无法在此对象中创建重复的动态标签名称，因为每个对象都为单个唯一的架构名称创建的。架构名称用于创建另一个唯一的标签名称。

## 创建用于加密 Amazon S3 目标对象的 AWS KMS 密钥
<a name="CHAP_Target.S3.KMSKeys"></a>

您可以创建和使用自定义 AWS KMS 密钥来加密您的 Amazon S3 目标对象。创建 KMS 密钥后，您可以在创建 S3 目标端点时，使用该密钥通过下列方法之一加密对象：
+ 当您使用 AWS CLI运行 `create-endpoint` 命令时对 S3 目标对象（采用默认的 .csv 文件存储格式）使用以下选项。

  ```
  --s3-settings '{"ServiceAccessRoleArn": "{{your-service-access-ARN}}", 
  "CsvRowDelimiter": "\n", "CsvDelimiter": ",", "BucketFolder": "{{your-bucket-folder}}", 
  "BucketName": "{{your-bucket-name}}", "EncryptionMode": "SSE_KMS", 
  "ServerSideEncryptionKmsKeyId": "{{your-KMS-key-ARN}}"}'
  ```

  在这里，your-`{{your-KMS-key-ARN}}` 是 KMS 密钥的 Amazon 资源名称（ARN），并且您的 IAM 角色必须具有访问权限，请参阅[在 Amazon S3 目标上使用数据加密、parquet 文件和 CDC](#CHAP_Target.S3.EndpointSettings)。
+ 将额外连接属性 `encryptionMode` 设置为值 `SSE_KMS`，并将额外连接属性 `serverSideEncryptionKmsKeyId` 设置为您的 KMS 密钥的 ARN。有关更多信息，请参阅 [使用 Amazon S3 作为目标时的终端节点设置 AWS DMS](#CHAP_Target.S3.Configuring)。

要使用 KMS 密钥加密 Amazon S3 目标对象，您需要一个有权访问 Amazon S3 存储桶的 IAM 角色。随后，在附加到您创建的加密密钥的政策（密钥政策）中访问此 IAM 角色。您可以通过创建以下项在 IAM 控制台中执行此操作：
+ 一个具有访问 Amazon S3 存储桶的权限的策略。
+ 一个带有此策略的 IAM 角色。
+ 一个带引用此角色的密钥政策的 KMS 加密密钥。

以下过程介绍了如何执行此操作。

**创建有权访问 Amazon S3 存储桶的 IAM policy**

1. 使用 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择 **Policies (策略)**。**Policies (策略)** 页面随即打开。

1. 选择**创建策略**。此时将打开**创建策略**页面。

1. 选择 **Service (服务)**，然后选择 **S3**。此时会显示操作权限列表。

1. 选择**全部展开**以展开列表并至少选择以下权限：
   + **ListBucket**
   + **PutObject**
   + **DeleteObject**

   选择所需的任何其他权限，然后选择 **Collapse all (全部折叠)** 以折叠列表。

1. 选择 **Resources (资源)** 以指定要访问的资源。至少选择**所有资源**以提供一般 Amazon S3 资源访问权限。

1. 添加所需的任何其他条件或权限，然后选择 **Review policy (查看策略)**。在 **Review policy (查看策略)** 页面上查看您的结果。

1. 如果这些设置是您所需的，请输入策略名称（例如，`DMS-S3-endpoint-access`）及任何其他描述，然后选择 **Create policy (创建策略)**。**Policies (策略)** 页面随即打开，并显示一条指示您的策略已创建的消息。

1. 在 **Policies (策略)** 列表中搜索并选择策略名称。此时会显示 **Summary (摘要)** 页面，并显示与以下内容类似的策略的 JSON。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "VisualEditor0",
               "Effect": "Allow",
               "Action": [
                   "s3:PutObject",
                   "s3:ListBucket",
                   "s3:DeleteObject"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

现在，您已创建新策略来访问 Amazon S3 资源以使用指定名称（例如 `DMS-S3-endpoint-access`）进行加密。

**创建具有此策略的 IAM 角色**

1. 在 IAM 控制台上的导航窗格中，选择**角色**。**Roles (角色)** 详细信息页面随即打开。

1. 选择**创建角色**。**Create role (创建角色)** 页面随即打开。

1. 选择 AWS 服务作为可信实体后，选择 **DMS** 作为使用 IAM 角色的服务。

1. 选择**下一步: 权限**。**Attach permissions policies (附加权限策略)** 视图将显示在 **Create role (创建角色)** 页面中。

1. 查找并选择您在上一过程中创建的 IAM 角色的 IAM policy（`DMS-S3-endpoint-access`）。

1. 选择**下一步：标签**。**Add tags (添加标签)** 视图将显示在 **Create role (创建角色)** 页面中。您可以在此处添加所需的任何标签。

1. 选择**下一步: 审核**。**Review (查看)** 视图将显示在 **Create role (创建角色)** 页面中。在这里，您可以验证结果。

1. 如果这些设置是您所需的，请输入角色名称（必填，例如 `DMS-S3-endpoint-access-role`）及任何其他描述，然后选择 **Create role (创建角色)**。**Roles (角色)** 详细信息页面随即打开，并显示一条指示您的角色已创建的消息。

现在，您已创建新角色来访问 Amazon S3 资源以使用指定名称（例如，`DMS-S3-endpoint-access-role`）进行加密。

**创建具有引用您的 IAM 角色的密钥政策的 KMS 加密密钥**
**注意**  
有关 AWS DMS 如何使用 AWS KMS 加密密钥的更多信息，请参阅[设置加密密钥并指定 AWS KMS 权限](CHAP_Security.md#CHAP_Security.EncryptionKey)。

1. 登录 AWS 管理控制台 并在 [https://console.aws.amazon.com/km](https://console.aws.amazon.com/kms) s 处打开 AWS Key Management Service (AWS KMS) 控制台。

1. 要更改 AWS 区域，请使用页面右上角的区域选择器。

1. 在导航窗格中，选择**客户托管密钥**。

1. 选择**创建密钥**。此时会打开 **Configure key (配置密钥)** 页面。

1. 对于**密钥类型**，选择**对称**。
**注意**  
创建此密钥时，您只能创建对称密钥，因为所有 AWS 服务（例如 Amazon S3）都只能使用对称加密密钥。

1. 选择 **Advanced Options**。对于 **Key material origin (密钥材料来源)**，请确保选择了 **KMS**，然后选择 **Next (下一步)**。此时会打开 **Add labels (添加标签)** 页面。

1. 对于 **Create alias and description (创建别名和描述)**，输入密钥的别名（例如 `DMS-S3-endpoint-encryption-key`）和任何其他描述。

1. 对于 **Tags (标签)**，添加要用于帮助标识密钥并跟踪其使用情况的任何标签，然后选择 **Next (下一步)**。此时会打开 **Define key administrative permissions (定义密钥管理权限)** 页面，其中显示了可供选择的用户和角色的列表。

1. 添加要管理密钥的用户和角色。确保这些用户和角色具有管理密钥所需的权限。

1. 对于 **Key deletion (密钥删除)**，选择密钥管理员是否能删除密钥，然后选择 **Next (下一步)**。此时会打开 **Define Key Usage Permissions (定义密钥使用权限)** 页面，其中显示了可供选择的用户和角色的附加列表。

1. 对于**此账户**，选择要对 Amazon S3 目标执行加密操作的可用用户。此外，还应选择您之前在**角色**中创建的角色以启用访问权限来加密 Amazon S3 目标对象，例如 `DMS-S3-endpoint-access-role`。

1. 如果要添加未列出的其他账户以获得相同访问权限，请在 “**其他 AWS 账户” 中选择 “**添加其他 AWS 账户****”，然后选择 “**下一步**”。此时会打开 **Review and edit key policy (查看和编辑密钥策略)** 页面，其中显示了密钥策略的 JSON，您可以通过键入到现有 JSON 来查看和编辑该策略。在此处，您可以看到密钥策略引用您在上一步中选择的角色和用户（例如，`Admin` 和 `User1`）的位置。您还可以查看不同委托人（用户和角色）所允许的不同密钥操作，如以下示例所示。

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

****  

   ```
   {
       "Id": "key-consolepolicy-3",
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "Enable IAM User Permissions",
               "Effect": "Allow",
               "Principal": {
                   "AWS": [
                       "arn:aws:iam::111122223333:root"
                   ]
               },
               "Action": "kms:*",
               "Resource": "*"
           },
           {
               "Sid": "Allow access for Key Administrators",
               "Effect": "Allow",
               "Principal": {
                   "AWS": [
                       "arn:aws:iam::111122223333:role/Admin"
                   ]
               },
               "Action": [
                   "kms:Create*",
                   "kms:Describe*",
                   "kms:Enable*",
                   "kms:List*",
                   "kms:Put*",
                   "kms:Update*",
                   "kms:Revoke*",
                   "kms:Disable*",
                   "kms:Get*",
                   "kms:Delete*",
                   "kms:TagResource",
                   "kms:UntagResource",
                   "kms:ScheduleKeyDeletion",
                   "kms:CancelKeyDeletion"
               ],
               "Resource": "*"
           },
           {
               "Sid": "Allow use of the key",
               "Effect": "Allow",
               "Principal": {
                   "AWS": [
                       "arn:aws:iam::111122223333:role/DMS-S3-endpoint-access-role",
                       "arn:aws:iam::111122223333:role/Admin",
                       "arn:aws:iam::111122223333:role/User1"
                   ]
               },
               "Action": [
                   "kms:Encrypt",
                   "kms:Decrypt",
                   "kms:ReEncrypt*",
                   "kms:GenerateDataKey*",
                   "kms:DescribeKey"
               ],
               "Resource": "*"
           },
           {
               "Sid": "Allow attachment of persistent resources",
               "Effect": "Allow",
               "Principal": {
                   "AWS": [
                       "arn:aws:iam::111122223333:role/DMS-S3-endpoint-access-role",
                       "arn:aws:iam::111122223333:role/Admin",
                       "arn:aws:iam::111122223333:role/User1"
                   ]
               },
               "Action": [
                   "kms:CreateGrant",
                   "kms:ListGrants",
                   "kms:RevokeGrant"
               ],
               "Resource": "*",
               "Condition": {
                   "Bool": {
                       "kms:GrantIsForAWSResource": true
                   }
               }
           }
       ]
   }
   ```

------

1. 选择**结束**。**加密密钥**页面随即打开，并显示一条指示您的 KMS 密钥已创建的消息。

现在，您已创建一个具有指定别名（例如，`DMS-S3-endpoint-encryption-key`）的新 KMS 密钥。使用此密钥可以 AWS DMS 加密 Amazon S3 目标对象。

## 使用基于日期的文件夹分区
<a name="CHAP_Target.S3.DatePartitioning"></a>

AWS DMS 当您使用 Amazon S3 作为目标终端节点时，支持基于事务提交日期的 S3 文件夹分区。通过使用基于日期的文件夹分区，您可以将数据从单个源表写入 S3 存储桶中的时间层次结构文件夹结构中。通过在创建 S3 目标端点时对文件夹进行分区，您可以：
+ 更好地管理您的 S3 对象
+ 限制每个 S3 文件夹的大小
+ 优化数据湖查询或其他后续操作

创建 S3 目标端点时，您可以启用基于日期的文件夹分区。在迁移现有数据和复制持续更改（完全加载 \+ CDC）或仅复制数据更改（仅 CDC）时，您可以启用它。迁移现有数据并复制持续更改时，只会对持续更改进行分区。使用以下目标端点设置：
+ `DatePartitionEnabled` – 指定基于日期的分区。将该布尔选项设置为 `true` 时，可根据事务提交日期对 S3 存储桶文件夹进行分区。

  不能将此设置与 `PreserveTransactions` 或 `CdcPath` 一起使用。

  默认值为 `false`。
+ `DatePartitionSequence` – 标识文件夹分区期间使用的日期格式顺序。将此 ENUM 选项设置为 `YYYYMMDD`、`YYYYMMDDHH`、`YYYYMM`、`MMYYYYDD` 或 `DDMMYYYY`。默认值为 `YYYYMMDD`。在 `DatePartitionEnabled` 设置为 `true.` 时使用此设置。
+ `DatePartitionDelimiter` – 指定要在文件夹分区期间使用的分隔日期分隔符。将此 ENUM 选项设置为 `SLASH`、`DASH`、`UNDERSCORE` 或 `NONE`。默认值为 `SLASH`。在 `DatePartitionEnabled` 设置为 `true` 时使用此设置。
+ `DatePartitionTimezone` – 创建 S3 目标端点时，设置 `DatePartitionTimezone` 以将当前 UTC 时间转换为指定时区。当创建日期分区文件夹并生成 CDC 文件名时，就会发生转换。时区格式为区域/位置。在 `DatePartitionedEnabled` 被设置为 `true` 时使用此参数，如以下示例所示：

  ```
  s3-settings='{"DatePartitionEnabled": true, "DatePartitionSequence": "YYYYMMDDHH", "DatePartitionDelimiter": "SLASH", "DatePartitionTimezone":"Asia/Seoul", "BucketName": "dms-nattarat-test"}'
  ```

以下示例说明如何启用基于日期的文件夹分区，并使用数据分区顺序和分隔符的默认值。它使用以下`--s3-settings '{{{json-settings}}}'`选项 AWS CLI。 `create-endpoint`命令。

```
   --s3-settings '{"DatePartitionEnabled": true,"DatePartitionSequence": "YYYYMMDD","DatePartitionDelimiter": "SLASH"}'
```

## 使用 Amazon S3 作为目标时并行加载分区源 AWS DMS
<a name="CHAP_Target.S3.ParallelLoad"></a>

您可以配置将已分区数据源并行完全加载到 Amazon S3 目标。该方法可缩短将已分区数据从支持的源数据库引擎迁移到 S3 目标的加载时间。为缩短已分区源数据的加载时间，您可以创建映射到源数据库中每个表的分区的 S3 目标子文件夹。这些分区绑定子文件夹允许 AWS DMS 运行并行进程来填充目标上的每个子文件夹。

要配置 S3 目标的并行完全加载，S3 支持表映射 `table-settings` 规则的三种 `parallel-load` 规则类型：
+ `partitions-auto`
+ `partitions-list`
+ `ranges`

有关这些并行加载规则类型的更多信息，请参阅[表和集合设置规则和操作](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Tablesettings.md)。

对于 `partitions-auto` 和 `partitions-list` 规则类型， AWS DMS 使用源端点中的各分区名称来标识目标子文件夹结构，如下所示。

```
{{bucket_name}}/{{bucket_folder}}/{{database_schema_name}}/{{table_name}}/{{partition_name}}/LOAD{{seq_num}}.csv
```

此时，S3 目标上用于迁移和存储数据的子文件夹路径包括一个额外的 `{{partition_name}}` 子文件夹，并与同名的源分区相对应。之后，该 `{{partition_name}}` 子文件夹存储一个或多个 `LOAD{{seq_num}}.csv` 文件，其中包含从指定源分区迁移的数据。此处，`{{seq_num}}` 是.csv 文件名的序列号后缀，例如名为 `LOAD00000001.csv` 的 .csv 文件中的序列号后缀 `00000001`。

但是，MongoDB 和 DocumentDB 等部分数据库引擎没有分区的概念。对于这些数据库引擎， AWS DMS 将正在运行的源段索引作为前缀添加到目标.csv 文件名中，如下所示。

```
.../{{database_schema_name}}/{{table_name}}/SEGMENT1_LOAD00000001.csv
.../{{database_schema_name}}/{{table_name}}/SEGMENT1_LOAD00000002.csv
...
.../{{database_schema_name}}/{{table_name}}/SEGMENT2_LOAD00000009.csv
.../{{database_schema_name}}/{{table_name}}/SEGMENT3_LOAD0000000A.csv
```

此处，文件 `SEGMENT1_LOAD00000001.csv` 和 `SEGMENT1_LOAD00000002.csv` 以相同的运行源段索引前缀 `SEGMENT1` 命名。之所以这样命名，是因为这两个 .csv 文件的迁移源数据与同一个运行源段索引相关联。另一方面，存储在每个目标 `SEGMENT2_LOAD00000009.csv` 和 `SEGMENT3_LOAD0000000A.csv` 文件中的迁移数据与不同的运行源段索引相关联。每个文件的文件名都以其运行段索引的名称作为前缀，即 `SEGMENT2` 和 `SEGMENT3`。

对于 `ranges` 并行加载类型，您可以使用 `table-settings` 规则的 `columns` 和 `boundaries` 设置来定义列名和列值。使用这些规则，您可以指定与分段名称对应的分区，如下所示。

```
"parallel-load": {
    "type": "ranges",
    "columns": [
         "region",
         "sale"
    ],
    "boundaries": [
          [
               "NORTH",
               "1000"
          ],
          [
               "WEST",
               "3000"
          ]
    ],
    "segment-names": [
          "custom_segment1",
          "custom_segment2",
          "custom_segment3"
    ]
}
```

此处，`segment-names` 设置定义了三个分区的名称，以便在 S3 目标上并行迁移数据。所迁移数据以并行方式加载并按顺序存储在分区子文件夹下的 .csv 文件中，如下所示。

```
.../{{database_schema_name}}/{{table_name}}/custom_segment1/LOAD[00000001...].csv
.../{{database_schema_name}}/{{table_name}}/custom_segment2/LOAD[00000001...].csv
.../{{database_schema_name}}/{{table_name}}/custom_segment3/LOAD[00000001...].csv
```

在这里，将一系列.csv 文件 AWS DMS 存储在三个分区子文件夹中的每个子文件夹中。各个分区子文件夹中的一系列 .csv 文件从 `LOAD00000001.csv` 开始递增命名，直至所有数据已完成迁移。

在某些情况下，您可能不会使用 `segment-names` 设置为 `ranges` 并行加载类型明确命名分区子文件夹。在这种情况下， AWS DMS 应用在其`{{table_name}}`子文件夹下创建每个系列的.csv 文件的默认设置。此时， AWS DMS 在各系列 .csv 文件的文件名前面加上运行源段索引的名称，如下所示。

```
.../{{database_schema_name}}/{{table_name}}/SEGMENT1_LOAD[00000001...].csv
.../{{database_schema_name}}/{{table_name}}/SEGMENT2_LOAD[00000001...].csv
.../{{database_schema_name}}/{{table_name}}/SEGMENT3_LOAD[00000001...].csv
...
.../{{database_schema_name}}/{{table_name}}/SEGMENT{{Z}}_LOAD[00000001...].csv
```

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

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

**注意**  
DMS 根据源数据库的提交顺序将更改写入 Parquet 文件，但是在迁移多个表时，由于表级分区，原始事务顺序不会保留。要维护事务序列信息，请将 `TimestampColumnName` 端点设置配置为包括每行的源提交时间戳，然后可以在下游处理中使用该时间戳来重建原始事务序列。与提供 `PreserveTransactions` 设置的 CSV 格式不同，Parquet 文件由于其列式存储结构而以不同方式处理事务，但是这种方法可以准确跟踪源提交时间，支持迁移后事务顺序重建，并在保持数据一致性的同时实现高效的数据处理。

下表显示了将 Amazon S3 作为目标时您可以使用的端点设置。


| **选项** | **描述** | 
| --- | --- | 
| CsvNullValue | 一个可选参数，用于指定如何 AWS DMS 处理空值。在处理 null 值时，您可以使用此参数在写入目标时将用户定义的字符串作为 null 传递。例如，当目标列可以为空时，您可以使用此选项来区分空字符串值和空值。<br />默认值：`""`<br />有效值：任何有效的字符串<br />示例：`--s3-settings '{"CsvNullValue": "NULL"}'`<br />如果源数据库的列值为 null，则在 S3 CSV 文件中，列值为 `NULL` 而非 "" 字符串。 | 
| AddColumnName | 一个可选参数，当设置为 `true` 或 `y` 时，可用于将列名称信息添加到 .csv 输出文件中。<br />此参数不能与 `PreserveTransactions` 或 `CdcPath` 一起使用。<br />默认值：`false`<br />有效值：`true`、`false`、`y`、`n`<br />示例：`--s3-settings '{"AddColumnName": true}'` | 
| AddTrailingPaddingCharacter | 使用 S3 目标端点设置 `AddTrailingPaddingCharacter` 为字符串数据添加填充。默认值为 `false`。<br />类型：布尔值<br />示例：`--s3-settings '{"AddTrailingPaddingCharacter": true}'` | 
| BucketFolder | 一个可选参数，用于在 S3 桶中设置文件夹的名称。如果提供此参数，则在路径 `{{BucketFolder}}/{{schema_name}}/{{table_name}}/` 中创建目标对象作为 .csv 或 .parquet 文件。如果未指定此参数，则使用的路径为 `{{schema_name}}/{{table_name}}/`。<br />示例：`--s3-settings '{"BucketFolder": "testFolder"}'` | 
| BucketName | 在其中将 S3 目标对象创建为 .csv 或 .parquet 文件的 S3 存储桶的名称。<br />示例：`--s3-settings '{"BucketName": "buckettest"}'` | 
| CannedAclForObjects | 该值允许 AWS DMS 为在 S3 存储桶中创建的对象指定预定义（固定）访问控制列表作为.csv 或.parquet 文件。有关 Amazon S3 封装版的更多信息 ACLs，请参阅 *Amazon S3 开发人员指南中的[预装 ACL](https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl)。*<br />默认值：NONE<br />此属性的有效值为：无；PRIVATE；PUBLIC\_READ；PUBLIC\_READ\_WRITE；AUTHENTICATED\_READ；BUCKET\_OWNER\_READ；BUCKET\_OWNER\_FULL\_CONTROL。 AWS\_EXEC<br />示例：`--s3-settings '{"CannedAclForObjects": "PUBLIC_READ"}'` | 
| CdcInsertsOnly | 一个在更改数据捕获 (CDC) 加载期间仅将 INSERT 操作写入逗号分隔值 (.csv) 或列式存储 (.parquet) 输出文件的可选参数。默认情况下（`false` 设置），.csv 或 .parquet 记录中的第一个字段包含字母 I (INSERT)、U (UPDATE) 或 D (DELETE)。该字母表示是在源数据库中插入、更新还是删除行，以将 CDC 加载到目标。如果设置`cdcInsertsOnly`为`true`或`y`，则仅 INSERTs 从源数据库迁移到.csv 或.parquet 文件。<br />仅对于 .csv 格式，记录这些 INSERTS 的方式取决于 `IncludeOpForFullLoad` 的值。如果将 `IncludeOpForFullLoad` 设置为 `true`，则每条 CDC 记录的第一个字段都将设置为 I 以指示源上的 INSERT 操作。如果将 `IncludeOpForFullLoad` 设置为 `false`，则写入每条 CDC 记录（不带用于指示源上的 INSERT 操作的第一个字段）。有关这些参数的协作方式的更多信息，请参阅[指示迁移的 S3 数据中的源数据库操作](#CHAP_Target.S3.Configuring.InsertOps)。<br />默认值：`false`<br />有效值：`true`、`false`、`y`、`n`<br />示例：`--s3-settings '{"CdcInsertsOnly": true}'` | 
| CdcInsertsAndUpdates | 启用更改数据捕获 (CDC) 加载以将 INSERT 和 UPDATE 操作写入 .csv 或 .parquet（列式存储）输出文件。默认设置为`false`，但是当设置为`true`或时 `cdcInsertsAndUpdates``y`， INSERTs 会 UPDATEs 从源数据库迁移到.csv 或.parquet 文件。<br />仅对于.csv 文件格式， UPDATEs 这些 INSERTs 和的记录方式取决于`includeOpForFullLoad`参数的值。如果 `includeOpForFullLoad` 设置为 `true`，则每条 CDC 记录的第一个字段都将设置为 `I` 或 `U` 以指示源上的 INSERT 和 UPDATE 操作。但如果 `includeOpForFullLoad` 设置为 `false`，则 CDC 记录在不指示源上的 INSERT 和 UPDATE 操作的情况下写入。<br /> 有关这些参数的协作方式的更多信息，请参阅[指示迁移的 S3 数据中的源数据库操作](#CHAP_Target.S3.Configuring.InsertOps)。 对于同一终端节点，`CdcInsertsOnly` 和 `cdcInsertsAndUpdates` 不同时设置为 true。对于同一终端节点，将 `cdcInsertsOnly` 或 `cdcInsertsAndUpdates` 设置为 `true`，但不能同时设置这两者。 <br />默认值：`false`<br />有效值：`true`、`false`、`y`、`n`<br />示例：`--s3-settings '{"CdcInsertsAndUpdates": true}'` | 
| `CdcPath` | 指定 CDC 文件的文件夹路径。对于 S3 来源，如果任务捕获更改数据，则该设置是必需的，否则，该设置是可选的。如果设置了 `CdcPath`，则 DMS 将通过该路径读取 CDC 文件，然后将数据更改复制到目标端点。对于 S3 目标，如果将 `PreserveTransactions` 设置为 true，DMS 会验证是否已将此参数设置为 S3 目标上的文件夹路径，使 DMS 可在其中保存 CDC 加载的事务顺序。DMS 在 S3 目标工作目录或 `BucketFolder` 和 `BucketName` 指定的 S3 目标位置中创建此 CDC 文件夹路径。<br />此参数不能与 `DatePartitionEnabled` 或 `AddColumnName` 一起使用。<br />类型：字符串<br />例如，如果您将 `CdcPath` 指定为 `MyChangedData`，且将 `BucketName` 指定为 `MyTargetBucket`，但没有指定 `BucketFolder`，DMS 会创建如下 CDC 文件夹路径：`MyTargetBucket/MyChangedData`。<br />如果您指定相同的 `CdcPath`,并将 `BucketName` 指定为 `MyTargetBucket`，`BucketFolder` 指定为 `MyTargetData`，DMS 创建如下 CDC 文件夹路径：`MyTargetBucket/MyTargetData/MyChangedData`。3.4.2 及更高 AWS DMS 版本支持此设置。 <br />按事务顺序捕获数据更改时，无论目标上的 S DataFormat 3 设置值如何，DMS 始终将行更改存储在.csv 文件中。  | 
| `CdcMaxBatchInterval` | 最大间隔长度条件（以秒为单位），之后将文件输出到 Amazon S3。<br />默认值：60 秒<br />指定 `CdcMaxBatchInterval` 并指定 `CdcMinFileSize` 时，文件写入由首先满足的参数条件触发。<br />从 AWS DMS 版本 3.5.3 开始，当使用 PostgreSQL 或 Aurora PostgreSQL 作为源，使用 Parquet 作为目标的 Amazon S3 时`confirmed_flush_lsn`，更新的频率取决于目标终端节点配置为在内存中保留的数据量。 AWS DMS 只有在内存中的数据写入 Amazon S3 之后，才会将数据发送`confirmed_flush_lsn`回源端。如果将 `CdcMaxBatchInterval` 参数配置为更高的值，则可能会观察到源数据库的复制槽位使用率增加。  | 
| `CdcMinFileSize` | 将文件输出到 Amazon S3 所要达到的最小文件大小条件（以千字节为单位）。<br />默认值：32000 KB<br />指定 `CdcMinFileSize` 并指定 `CdcMaxBatchInterval` 时，文件写入由首先满足的参数条件触发。 | 
| `PreserveTransactions` | 如果设置为 `true`，DMS 将在 `CdcPath` 指定的 Amazon S3 目标上保存更改数据捕获（CDC）的事务顺序。<br />此参数不能与 `DatePartitionEnabled` 或 `AddColumnName` 一起使用。<br />类型：布尔值<br />按事务顺序捕获数据更改时，无论目标上的 S DataFormat 3 设置值如何，DMS 始终将行更改存储在.csv 文件中。3.4.2 及更高 AWS DMS 版本支持此设置。  | 
| IncludeOpForFullLoad | 一个在完全加载期间仅将 INSERT 操作写入逗号分隔值 (.csv) 输出文件的可选参数。<br />对于完全加载，只能插入记录。默认情况下，（`false` 设置），这些输出文件中没有记录完全加载的信息，以指示行已插入源数据库。如果将 `IncludeOpForFullLoad` 设置为 `true` 或 `y`，则在 .csv 文件的第一个字段中将 INSERT 记录为 I 注释。 此参数与 `CdcInsertsOnly` 或 `CdcInsertsAndUpdates` 结合使用，以仅输出到 .csv 文件。有关这些参数的协作方式的更多信息，请参阅[指示迁移的 S3 数据中的源数据库操作](#CHAP_Target.S3.Configuring.InsertOps)。 <br />默认值：`false`<br />有效值：`true`、`false`、`y`、`n`<br />示例：`--s3-settings '{"IncludeOpForFullLoad": true}'` | 
| CompressionType | 一个可选参数，当设置为 `GZIP` 时，用于使用 GZIP 压缩目标 .csv 文件。当此参数设置为默认值时，它会使文件保持未压缩状态。<br />默认值：`NONE`<br />有效值：`GZIP` 或 `NONE`<br />示例：`--s3-settings '{"CompressionType": "GZIP"}'` | 
| CsvDelimiter | .csv 源文件中用于分隔列的分隔符。默认值为逗号（,）。<br />示例：`--s3-settings '{"CsvDelimiter": ","}'` | 
| CsvRowDelimiter | .csv 源文件中用于分隔行的分隔符。默认值为换行符 (\\n)。<br />示例：`--s3-settings '{"CsvRowDelimiter": "\n"}'` | 
|  `MaxFileSize`  | 一个值，指定在完整加载期间，迁移到 S3 目标时所要创建的任意 .csv 文件的最大大小（以 KB 为单位）。<br />默认值：1048576 KB (1 GB)<br />有效值：1–1048576<br />示例：`--s3-settings '{"MaxFileSize": 512}'` | 
| Rfc4180 | 一个可选参数，用于设置行为以符合 RFC，仅适用于使用 .csv 文件格式迁移到 Amazon S3 的数据。将此值设置为`true`或`y`使用 Amazon S3 作为目标时，如果数据中包含引号、逗号或换行符，则用一对额外的双引号 (“) AWS DMS 将整列括起来。数据中的每个引号将被重复两次。此格式符合 RFC 4180。<br />默认值：`true`<br />有效值：`true`、`false`、`y`、`n`<br />示例：`--s3-settings '{"Rfc4180": false}'` | 
| EncryptionMode | 要用于加密复制到 S3 的 .csv 或 .parquet 对象文件的服务器端加密模式。有效值为 `SSE_S3`（S3 服务器端加密）或 `SSE_KMS`（KMS 密钥加密）。如果您选择 `SSE_KMS`，请将 `ServerSideEncryptionKmsKeyId` 参数设置为要用于加密的 KMS 密钥的 Amazon 资源名称 (ARN)。 您也可以使用 CLI `modify-endpoint` 命令将现有端点的 `EncryptionMode` 属性值从 `SSE_KMS` 更改为 `SSE_S3`。但您不能将 `EncryptionMode` 值从 `SSE_S3` 更改为 `SSE_KMS`。 <br />默认值：`SSE_S3`<br />有效值：`SSE_S3` 或 `SSE_KMS`<br />示例：`--s3-settings '{"EncryptionMode": SSE_S3}'` | 
| ServerSideEncryptionKmsKeyId | 如果您将 `EncryptionMode` 设置为 `SSE_KMS`，请将此参数设置为 KMS 密钥的 Amazon 资源名称（ARN）。您可以通过在为您的账户创建的密钥列表中选择密钥别名来找到此 ARN。 AWS KMS 在创建密钥时，您必须将特定策略和角色与此 KMS 密钥关联。有关更多信息，请参阅 [创建用于加密 Amazon S3 目标对象的 AWS KMS 密钥](#CHAP_Target.S3.KMSKeys)。<br />示例：`--s3-settings '{"ServerSideEncryptionKmsKeyId":"arn:aws:kms:us-east-1:111122223333:key/11a1a1a1-aaaa-9999-abab-2bbbbbb222a2"}'` | 
| DataFormat | 用于创建 S3 对象的 AWS DMS 文件的输出格式。对于 Amazon S3 目标， AWS DMS 支持.csv 或.parquet 文件。.parquet 文件具有一种二进制列式存储格式，并具有有效的压缩选项和更快的查询性能。有关 .parquet 文件的更多信息，请参阅 [https://parquet.apache.org/](https://parquet.apache.org/)。<br />默认值：`csv`<br />有效值：`csv` 或 `parquet`<br />示例：`--s3-settings '{"DataFormat": "parquet"}'` | 
| EncodingType | Parquet 编码类型。编码类型选项包括：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/dms/latest/userguide/CHAP_Target.S3.html)<br />默认值：`rle-dictionary`<br />有效值：`rle-dictionary`、`plain` 或 `plain-dictionary`<br />示例：`--s3-settings '{"EncodingType": "plain-dictionary"}'` | 
| DictPageSizeLimit | .parquet 文件中的词典页面允许的最大大小（以字节为单位）。如果词典页面超出此值，则该页面使用纯编码。<br />默认值：1024000（1 MB）<br />有效值：任何有效的整数值<br />示例：`--s3-settings '{"DictPageSizeLimit": 2,048,000}'` | 
| RowGroupLength | .parquet 文件的一个行组中的行数。<br />默认值：10024 (10 KB)<br />有效值：任何有效整数<br />示例：`--s3-settings '{"RowGroupLength": 20,048}'` | 
| DataPageSize | .parquet 文件中的数据页面允许的最大大小（以字节为单位）。<br />默认值：1024000（1 MB）<br />有效值：任何有效整数<br />示例：`--s3-settings '{"DataPageSize": 2,048,000}'` | 
| ParquetVersion | .parquet 文件格式的版本。<br />默认值：`PARQUET_1_0`<br />有效值：`PARQUET_1_0` 或 `PARQUET_2_0`<br />示例：`--s3-settings '{"ParquetVersion": "PARQUET_2_0"}'` | 
| EnableStatistics | 设置为 `true` 或 `y` 以启用有关 .parquet 文件页面和行组的统计数据。<br />默认值：`true`<br />有效值：`true`、`false`、`y`、`n`<br />示例：`--s3-settings '{"EnableStatistics": false}'` | 
| TimestampColumnName | 一个可选参数，用于在 S3 目标终端节点数据中包含时间戳列。<br />AWS DMS 当您设置`TimestampColumnName`为非空值时，在迁移数据的.csv 或.parquet 对象文件中包含一个附加`STRING`列。<br />对于完全加载，此时间戳列的每个行均包含一个时间戳，用于指示 DMS 将数据从源传输到目标的时间。<br />对于 CDC 加载，时间戳列的每个行均包含该行在源数据库中的提交的时间戳。<br />此时间戳列值的字符串格式为 `yyyy-MM-dd HH:mm:ss.SSSSSS`。默认情况下，此值是以微秒为单位的时间精度。对于 CDC 负载，精度的舍入取决于 DMS 支持的源数据库的提交时间戳。<br />在将 `AddColumnName` 参数设置为 `true` 时，DMS 还包含设置为 `TimestampColumnName` 的非空值的时间戳列的名称。<br />示例：`--s3-settings '{"TimestampColumnName": "TIMESTAMP"}'` | 
| UseTaskStartTimeForFullLoadTimestamp | 设置为 `true` 时，此参数使用任务开始时间作为时间戳列值，而不是将数据写入目标的时间。对于完全加载，当 `UseTaskStartTimeForFullLoadTimestamp` 设置为 `true` 时，时间戳列的每一行都包含任务的开始时间。对于 CDC 加载，时间戳列的每个行均包含事务提交时间。<br />当 `UseTaskStartTimeForFullLoadTimestamp` 被设置为 `false` 时，时间戳列中的满载时间戳会随着数据到达目标的时间而递增。<br />默认值：`false`<br />有效值：`true`、`false`<br />示例：`--s3-settings '{"UseTaskStartTimeForFullLoadTimestamp": true}'`<br />`UseTaskStartTimeForFullLoadTimestamp: true` 有助于使完全加载的 S3 目标 `TimestampColumnName` 可与 CDC 加载的 `TimestampColumnName` 一起排序。 | 
| ParquetTimestampInMillisecond | 一个可选参数，指定写入 .parquet 格式 S3 对象文件的任意 `TIMESTAMP` 列值的精度。<br />当此属性设置为`true`或时`y`，将所有`TIMESTAMP`列以毫秒精度 AWS DMS 写入.parquet 格式的文件中。否则，DMS 以微秒为精度写入它们。<br />目前， Amazon Athena 和 AWS Glue 只能处理值的毫秒精度。`TIMESTAMP`对于 .parquet 格式的 S3 端点对象文件，仅在您计划使用 Athena 或 AWS Glue查询或处理数据时，才设置此属性。   AWS DMS 以微秒精度以.csv 格式写入到 S3 文件中的任何`TIMESTAMP`列值。   此属性的设置对通过设置 `TimestampColumnName` 属性插入的时间戳列的字符串格式没有任何影响。   <br />默认值：`false`<br />有效值：`true`、`false`、`y`、`n`<br />示例：`--s3-settings '{"ParquetTimestampInMillisecond": true}'` | 
| GlueCatalogGeneration | 要生成 AWS Glue Data Catalog，请将此端点设置设置为`true`。<br />默认值：`false`<br />有效值：`true`、`false`<br />示例：`--s3-settings '{"GlueCatalogGeneration": true}'`<br />**注意：**请勿将 `GlueCatalogGeneration` 与 `PreserveTransactions` 和 `CdcPath` 一起使用。 | 

## AWS Glue Data Catalog 与 Amazon S3 目标一起使用 AWS DMS
<a name="CHAP_Target.S3.GlueCatalog"></a>

AWS Glue 是一项提供简单数据分类方法的服务，由名为 AWS Glue Data Catalog的元数据存储库组成。您可以 AWS Glue Data Catalog 与您的 Amazon S3 目标终端节点集成，并通过其他 AWS 服务（例如亚马逊 Athena）查询亚马逊 S3 数据。Amazon Redshift 可以使用， AWS Glue 但 AWS DMS 不支持将其作为预建选项。

要生成数据目录，请将`GlueCatalogGeneration`端点设置设置为`true`，如以下 AWS CLI 示例所示。

```
aws dms create-endpoint --endpoint-identifier s3-target-endpoint 
            --engine-name s3 --endpoint-type target--s3-settings '{"ServiceAccessRoleArn": 
            "your-service-access-ARN", "BucketFolder": "your-bucket-folder", "BucketName": 
            "your-bucket-name", "DataFormat": "parquet", "GlueCatalogGeneration": true}'
```

对于包含 `csv` 类型数据的完全加载复制任务，将 `IncludeOpForFullLoad` 设置为 `true`。

注意：请勿将 `GlueCatalogGeneration` 与 `PreserveTransactions` 和 `CdcPath` 一起使用。C AWS Glue rawler 无法协调存储在指定文件下的不同架构。`CdcPath`

要让 Amazon Athena 为您的 Amazon S3 数据编制索引，并且您能够通过 Amazon Athena 使用标准 SQL 查询来查询数据，附加到端点的 IAM 角色必须具有以下策略：

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

****  

```
{
    "Version":"2012-10-17",		 	 	  
    "Statement": [ 
        {
            "Effect": "Allow", 
            "Action": [
                "s3:GetBucketLocation", 
                "s3:GetObject",
                "s3:ListBucket", 
                "s3:ListBucketMultipartUploads", 
                "s3:ListMultipartUploadParts", 
                "s3:AbortMultipartUpload" 
            ], 
            "Resource": [
                "arn:aws:s3:::bucket123", 
                "arn:aws:s3:::bucket123/*" 
            ]
        },
        {
            "Effect": "Allow", 
            "Action": [ 
                "glue:CreateDatabase", 
                "glue:GetDatabase", 
                "glue:CreateTable", 
                "glue:DeleteTable", 
                "glue:UpdateTable", 
                "glue:GetTable", 
                "glue:BatchCreatePartition", 
                "glue:CreatePartition", 
                "glue:UpdatePartition", 
                "glue:GetPartition", 
                "glue:GetPartitions", 
                "glue:BatchGetPartition"
            ], 
            "Resource": [
                "arn:aws:glue:*:111122223333:catalog", 
                "arn:aws:glue:*:111122223333:database/*", 
                "arn:aws:glue:*:111122223333:table/*" 
            ]
        }, 
        {
            "Effect": "Allow",
            "Action": [
                "athena:StartQueryExecution",
                "athena:GetQueryExecution", 
                "athena:CreateWorkGroup"
            ],
            "Resource": "arn:aws:athena:*:111122223333:workgroup/glue_catalog_generation_for_task_*"
        }
    ]
}
```

------

**参考**
+ 有关更多信息 AWS Glue，请参阅《*AWS Glue 开发者指南*》中的[概念](https://docs.aws.amazon.com//glue/latest/dg/components-key-concepts.html)。
+ 有关更多信息， AWS Glue Data Catalog 请参阅《*AWS Glue 开发人员指南*》中的[组件](https://docs.aws.amazon.com/glue/latest/dg/components-overview.html)。

## 在 Amazon S3 目标上使用数据加密、parquet 文件和 CDC
<a name="CHAP_Target.S3.EndpointSettings"></a>

您可以使用 S3 目标终端节点设置来配置以下内容：
+ 用于加密 S3 目标对象的自定义 KMS 密钥。
+ 作为 S3 目标对象的存储格式的 Parquet 文件。
+ 将数据捕获（CDC）更改为包括 S3 目标上的事务顺序。
+  AWS Glue Data Catalog 与您的亚马逊 S3 目标终端节点集成，并通过其他服务（例如亚马逊 Athena）查询亚马逊 S3 数据。

### AWS KMS 数据加密的密钥设置
<a name="CHAP_Target.S3.EndpointSettings.KMSkeys"></a>

以下示例说明如何配置自定义 KMS 密钥以加密 S3 目标对象。要开始，您可以运行以下 `create-endpoint` CLI 命令。

```
aws dms create-endpoint --endpoint-identifier s3-target-endpoint --engine-name s3 --endpoint-type target 
--s3-settings '{"ServiceAccessRoleArn": "{{your-service-access-ARN}}", "CsvRowDelimiter": "\n", 
"CsvDelimiter": ",", "BucketFolder": "{{your-bucket-folder}}", 
"BucketName": "{{your-bucket-name}}", 
"EncryptionMode": "SSE_KMS", 
"ServerSideEncryptionKmsKeyId": "arn:aws:kms:us-east-1:111122223333:key/72abb6fb-1e49-4ac1-9aed-c803dfcc0480"}'
```

此处，`--s3-settings` 选项所指定的 JSON 对象定义了两个参数。一个是带值 `SSE_KMS` 的 `EncryptionMode` 参数。另一个是带值 `arn:aws:kms:us-east-1:111122223333:key/72abb6fb-1e49-4ac1-9aed-c803dfcc0480` 的 `ServerSideEncryptionKmsKeyId` 参数。此值是自定义 KMS 密钥的 Amazon 资源名称 (ARN)。对于 S3 目标，您还可以指定其他设置。这些设置标识服务器访问角色，为默认 CSV 对象存储格式提供分隔符，并提供存储桶位置和名称来存储 S3 目标对象。

默认情况下，使用 S3 服务器端加密进行 S3 数据加密。对于上一示例中的 S3 目标，这也等同于指定其终端节点设置，如以下示例所示。

```
aws dms create-endpoint --endpoint-identifier s3-target-endpoint --engine-name s3 --endpoint-type target
--s3-settings '{"ServiceAccessRoleArn": "{{your-service-access-ARN}}", "CsvRowDelimiter": "\n", 
"CsvDelimiter": ",", "BucketFolder": "{{your-bucket-folder}}", 
"BucketName": "{{your-bucket-name}}", 
"EncryptionMode": "SSE_S3"}'
```

有关使用 S3 服务器端加密的更多信息，请参阅[使用服务器端加密保护数据](https://docs.aws.amazon.com/AmazonS3/latest/dev/serv-side-encryption.html)。

**注意**  
您也可以使用 CLI `modify-endpoint` 命令将现有端点的 `EncryptionMode` 参数值从 `SSE_KMS` 更改为 `SSE_S3`。但您不能将 `EncryptionMode` 值从 `SSE_S3` 更改为 `SSE_KMS`。

### 使用 .parquet 文件存储 S3 目标对象的设置
<a name="CHAP_Target.S3.EndpointSettings.Parquet"></a>

用于创建 S3 目标对象的默认格式为 .csv 文件。以下示例显示用于指定 .parquet 文件作为创建 S3 目标对象的格式的某些终端节点设置。您可以指定带所有默认值的 .parquet 文件格式，如以下示例所示。

```
aws dms create-endpoint --endpoint-identifier s3-target-endpoint --engine-name s3 --endpoint-type target 
--s3-settings '{"ServiceAccessRoleArn": "{{your-service-access-ARN}}", "DataFormat": "parquet"}'
```

在这里，`DataFormat` 参数设置为 `parquet` 以启用带所有 S3 默认值的格式。这些默认值包括一个词典编码 (`"EncodingType: "rle-dictionary"`)，该编码使用位压缩和运行长度编码的组合以更高效地存储重复值。

您可以为选项添加默认值之外的其他设置，如以下示例所示。

```
aws dms create-endpoint --endpoint-identifier s3-target-endpoint --engine-name s3 --endpoint-type target
--s3-settings '{"ServiceAccessRoleArn": "your-service-access-ARN", "BucketFolder": "your-bucket-folder",
"BucketName": "your-bucket-name", "DataFormat": "parquet", "EncodingType: "plain-dictionary", "DictPageSizeLimit": 3,072,000,
"EnableStatistics": false }'
```

在这里，除了几个标准 S3 存储桶选项的参数和 `DataFormat` 参数外，将设置以下额外的 .parquet 文件参数：
+ `EncodingType` – 设置为一个词典编码（`plain-dictionary`），该编码将每个列中遇到的值存储在词典页面的每列数据块中。
+ `DictPageSizeLimit` – 最大词典页面大小设置为 3 MB。
+ `EnableStatistics` – 禁用用来启用有关 Parquet 文件页面和行组的统计数据集合的默认值。

### 捕获数据更改（CDC）时包括 S3 目标上的事务顺序
<a name="CHAP_Target.S3.EndpointSettings.CdcPath"></a>

默认情况下，在 AWS DMS 运行 CDC 任务时，它会将源数据库（或数据库）中记录的所有行更改存储在每个表的一个或多个文件中。包含同一表更改的每组文件都位于与该表关联的单个目标目录中。 AWS DMS 创建的目标目录与迁移到 Amazon S3 目标终端节点的数据库表一样多。文件存储在 S3 目标上的这些目录中，而不考虑事务顺序。有关文件命名惯例、数据内容和格式的更多信息，请参阅[使用亚马逊 S3 作为目标 AWS Database Migration Service](#CHAP_Target.S3)。

要以同时捕获事务顺序的方式捕获源数据库的更改，您可以指定 S3 端点设置，这些设置 AWS DMS 将*所有*数据库表的行更改存储在一个或多个根据事务大小创建的.csv 文件中。这些 .csv *事务文件*包含按事务顺序依次列出的、每个事务中涉及的所有表的所有行更改。这些事务文件一起保存在您同样在 S3 目标上指定的单个*事务目录*中。在每个事务文件中，每处行更改的事务操作以及数据库和源表的标识都作为行数据的一部分存储，如下所示。

```
{{operation}},{{table_name}},{{database_schema_name}},{{field_value}},...
```

其中，`{{operation}}` 是对已更改行的事务操作，`{{table_name}}` 是在其中更改该行的数据库表的名称，`{{database_schema_name}}` 是该表所在数据库架构的名称，而 `{{field_value}}` 是为该行指定数据的一个或多个字段值中的第一个。

事务文件之后的示例显示了涉及两个表的一个或多个事务中更改的行。

```
I,Names_03cdcad11a,rdsTempsdb,13,Daniel
U,Names_03cdcad11a,rdsTempsdb,23,Kathy
D,Names_03cdcad11a,rdsTempsdb,13,Cathy
I,Names_6d152ce62d,rdsTempsdb,15,Jane
I,Names_6d152ce62d,rdsTempsdb,24,Chris
I,Names_03cdcad11a,rdsTempsdb,16,Mike
```

其中，每行的事务操作由第一列中的 `I`（插入）、`U`（更新）或 `D`（删除）表示。表名是第二列的值（例如，`Names_03cdcad11a`）。数据库架构的名称是第三列的值（例如，`rdsTempsdb`）。其余列将使用您自己的行数据填充（例如，`13,Daniel`）。

此外，根据以下命 AWS DMS 名惯例，使用时间戳命名其在 Amazon S3 目标上创建的事务文件。

```
CDC_TXN-{{timestamp}}.csv
```

其中，`{{timestamp}}` 是创建事务文件的时间，如以下示例所示。

```
CDC_TXN-20201117153046033.csv
```

文件名中的该时间戳可确保按照您在事务目录中列出相关事务的事务顺序来创建和列出事务文件。

**注意**  
按事务顺序捕获数据更改时，无论目标上的 `DataFormat` S3 设置值如何， AWS DMS 始终将行更改存储在.csv 文件中。

要控制在执行数据复制任务期间向 Amazon S3 目标写入的频率，您可以配置 `CdcMaxBatchInterval` 和 `CdcMinFileSize` 设置。这可以提高分析数据的性能，而无需任何额外的开销操作。有关更多信息，请参阅 [使用 Amazon S3 作为目标时的终端节点设置 AWS DMS](#CHAP_Target.S3.Configuring)。

**告知 AWS DMS 要按事务顺序存储所有行更改**

1. 将目标上的 `PreserveTransactions` S3 设置设为 `true`。

1. 将目标上`CdcPath`的 S3 设置设置为 AWS DMS 要存储.csv 事务文件的相对文件夹路径。

   AWS DMS 在默认 S3 目标存储桶和工作目录下，或者在目标上使用和 `BucketFolder` S3 设置指定的存储桶`BucketName`和存储桶文件夹下创建此路径。

## 指示迁移的 S3 数据中的源数据库操作
<a name="CHAP_Target.S3.Configuring.InsertOps"></a>

将记录 AWS DMS 迁移到 S3 目标时，它可以在每条迁移的记录中创建一个额外的字段。此额外字段指示应用于源数据库中的记录的操作。如何 AWS DMS 创建和设置第一个字段取决于迁移任务类型以及`includeOpForFullLoad``cdcInsertsOnly`、和的设置`cdcInsertsAndUpdates`。

对于完全加载，当 `includeOpForFullLoad` 为 `true` 时， AWS DMS 始终在每条 .csv 记录中额外创建第一个字段。该字段包含字母 I (INSERT)，指示该行已插入源数据库中。对于 CDC 加载时`cdcInsertsOnly`为`false`（默认）， AWS DMS 也始终在每条.csv 或.parquet 记录中创建一个额外的第一个字段。此字段包含字母 I (INSERT)、U (UPDATE) 或 D (DELETE)，指示是否在源数据库中插入、更新或删除行。

在下表中，您可以了解 `includeOpForFullLoad` 和 `cdcInsertsOnly` 属性的设置如何协作以影响所迁移记录的设置。


<table>
<thead>
  <tr><th colspan="2">使用这些参数设置</th><th colspan="2">DMS 将目标记录设置为 .csv 和 .parquet 输出的后续记录 </th></tr>
  <tr><th>includeOpForFullLoad</th><th>cdcInsertsOnly</th><th>对于完全加载</th><th>对于 CDC 加载</th></tr>
</thead>
<tbody>
  <tr><td>true</td><td>true</td><td>添加的第一个字段值设置为 I</td><td>添加的第一个字段值设置为 I</td></tr>
  <tr><td>false</td><td>false</td><td>无添加的字段</td><td>添加的第一个字段值设置为 I、U 或 D</td></tr>
  <tr><td>false</td><td>true</td><td>无添加的字段</td><td>无添加的字段</td></tr>
  <tr><td>true</td><td>false</td><td>添加的第一个字段值设置为 I</td><td>添加的第一个字段值设置为 I、U 或 D</td></tr>
</tbody>
</table>


在将 `includeOpForFullLoad` 和 `cdcInsertsOnly` 设置为同一值时，将根据控制当前迁移类型的记录设置的属性来设置目标记录。该属性为 `includeOpForFullLoad`（对于完全加载）和 `cdcInsertsOnly`（对于 CDC 加载）。

当`includeOpForFullLoad`和设置`cdcInsertsOnly`为不同的值时， AWS DMS 会使 CDC 和满载的目标记录设置保持一致。它通过使 CDC 加载的记录设置符合 `includeOpForFullLoad` 指定的任何早期完全加载的记录设置来实现此目的。

换句话说，假设将完全加载设置为添加第一个字段来指示插入的记录。在此情况下，将以下 CDC 加载设置为添加第一个字段，该字段指示在源中适当插入、更新或删除的记录。相反，假设将完全加载设置为*不* 添加第一个字段来指示插入的记录。在此情况下，CDC 加载也将设置为不向每条记录添加第一个字段，而不管其在源中的相应记录操作如何。

同样，DMS 如何创建和设置附加的第一个字段取决于 `includeOpForFullLoad` 和 `cdcInsertsAndUpdates` 的设置。在下表中，您可以了解 `includeOpForFullLoad` 和 `cdcInsertsAndUpdates` 属性的设置如何协作以影响采用此格式的迁移记录的设置。


<table>
<thead>
  <tr><th colspan="2">使用这些参数设置</th><th colspan="2">DMS 将目标记录设置为 .csv 输出的后续记录 </th></tr>
  <tr><th>includeOpForFullLoad</th><th>cdcInsertsAnd更新</th><th>对于完全加载</th><th>对于 CDC 加载</th></tr>
</thead>
<tbody>
  <tr><td>true</td><td>true</td><td>添加的第一个字段值设置为 I</td><td>添加的第一个字段值设置为 I 或 U</td></tr>
  <tr><td>false</td><td>false</td><td>无添加的字段</td><td>添加的第一个字段值设置为 I、U 或 D</td></tr>
  <tr><td>false</td><td>true</td><td>无添加的字段</td><td>添加的第一个字段值设置为 I 或 U</td></tr>
  <tr><td>true</td><td>false</td><td>添加的第一个字段值设置为 I</td><td>添加的第一个字段值设置为 I、U 或 D</td></tr>
</tbody>
</table>


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

下表显示了使用时支持的 Parquet 目标数据类型 AWS DMS 以及 AWS DMS 数据类型的默认映射。

有关 AWS DMS 数据类型的更多信息，请参见[AWS Database Migration Service 的数据类型](CHAP_Reference.DataTypes.md)。


|  AWS DMS 数据类型  |  S3 parquet 数据类型   | 
| --- | --- | 
| BYTES | BINARY | 
| DATE | DATE32 | 
| TIME | TIME32 | 
| DATETIME | TIMESTAMP | 
| INT1 | INT8 | 
| INT2 | INT16 | 
| INT4 | INT32 | 
| INT8 | INT64 | 
| NUMERIC | DECIMAL | 
| REAL4 | FLOAT | 
| REAL8 | DOUBLE | 
| STRING | STRING | 
| UINT1 | UINT8 | 
| UINT2 | UINT16 | 
| UINT4 | UINT32 | 
| UINT8 | UINT64 | 
| WSTRING | STRING | 
| BLOB | BINARY | 
| NCLOB | STRING | 
| CLOB | STRING | 
| BOOLEAN | BOOL | 