

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

# 使用 Amazon S3 作为来源 AWS DMS
<a name="CHAP_Source.S3"></a>

您可以使用从 Amazon S3 存储桶迁移数据 AWS DMS。为此，请提供对包含一个或多个数据文件的 Amazon S3 存储桶的访问。在该 S3 存储桶中，请包含一个 JSON 文件以描述该数据与这些文件中的数据的数据库表之间的映射。

在开始完全加载之前，必须在 Amazon S3 存储桶中包含源数据文件。您可以使用 `bucketName` 参数指定存储桶名称。

源数据文件可以采用如下格式：
+ 逗号分隔值（.csv）
+ Parquet（DMS 版本 3.5.3 及更高版本）。有关使用 Parquet 格式文件的信息，请参阅 [使用 Amazon S3 中的拼木地板格式文件作为来源 AWS DMS](#CHAP_Source.S3.Parquet)。

对于逗号分隔值（.csv）格式的源数据文件，请使用以下命名约定命名它们。在该约定中，*`schemaName`* 是源架构，*`tableName`* 是该架构中的表的名称。

```
/schemaName/tableName/LOAD001.csv
/schemaName/tableName/LOAD002.csv
/schemaName/tableName/LOAD003.csv
...
```

 例如，假定数据文件位于以下 Amazon S3 路径的 `amzn-s3-demo-bucket` 中。

```
s3://amzn-s3-demo-bucket/hr/employee
```

加载时， AWS DMS 假设源架构名称为`hr`，源表名为`employee`。

除了`bucketName`（必填项）之外，您还可以选择提供一个`bucketFolder`参数来指定 AWS DMS 应在 Amazon S3 存储桶中查找数据文件的位置。继续前面的示例，如果您设置`bucketFolder`为`sourcedata`，则 AWS DMS 读取以下路径中的数据文件。

```
s3://amzn-s3-demo-bucket/sourcedata/hr/employee
```

您可以使用额外连接属性指定列分隔符、行分隔符、null 值指示符以及其他参数。有关更多信息，请参阅 [Amazon S3 的终端节点设置作为来源 AWS DMS](#CHAP_Source.S3.Configuring)。

您可以使用 `ExpectedBucketOwner` Amazon S3 端点设置指定存储桶拥有者并防止狙击，如下所示。然后，当您发出测试连接或执行迁移的请求时，S3 会根据指定参数检查存储桶拥有者的账户 ID。

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

**Topics**
+ [将 Amazon S3 的外部表定义为数据源 AWS DMS](#CHAP_Source.S3.ExternalTableDef)
+ [使用 CDC 和 Amazon S3 作为来源 AWS DMS](#CHAP_Source.S3.CDC)
+ [使用 Amazon S3 作为来源的先决条件 AWS DMS](#CHAP_Source.S3.Prerequisites)
+ [使用 Amazon S3 作为来源时的限制 AWS DMS](#CHAP_Source.S3.Limitations)
+ [Amazon S3 的终端节点设置作为来源 AWS DMS](#CHAP_Source.S3.Configuring)
+ [Amazon S3 的源数据类型](#CHAP_Source.S3.DataTypes)
+ [使用 Amazon S3 中的拼木地板格式文件作为来源 AWS DMS](#CHAP_Source.S3.Parquet)

## 将 Amazon S3 的外部表定义为数据源 AWS DMS
<a name="CHAP_Source.S3.ExternalTableDef"></a>

除了数据文件以外，您还必须提供外部表定义。*外部表定义是一个* JSON 文档，它描述了 AWS DMS 应如何解释 Amazon S3 中的数据。该文档的最大大小为 2 MB。如果您使用 AWS DMS 管理控制台创建源端点，则可以直接在表映射框中输入 JSON。如果您使用 AWS Command Line Interface (AWS CLI) 或 AWS DMS API 执行迁移，则可以创建一个 JSON 文件来指定外部表的定义。

假定您具有包含以下内容的数据文件。

```
101,Smith,Bob,2014-06-04,New York
102,Smith,Bob,2015-10-08,Los Angeles
103,Smith,Bob,2017-03-13,Dallas
104,Smith,Bob,2017-03-13,Dallas
```

以下是该数据的示例外部表定义。

```
{
    "TableCount": "1",
    "Tables": [
        {
            "TableName": "employee",
            "TablePath": "hr/employee/",
            "TableOwner": "hr",
            "TableColumns": [
                {
                    "ColumnName": "Id",
                    "ColumnType": "INT8",
                    "ColumnNullable": "false",
                    "ColumnIsPk": "true"
                },
                {
                    "ColumnName": "LastName",
                    "ColumnType": "STRING",
                    "ColumnLength": "20"
                },
                {
                    "ColumnName": "FirstName",
                    "ColumnType": "STRING",
                    "ColumnLength": "30"
                },
                {
                    "ColumnName": "HireDate",
                    "ColumnType": "DATETIME"
                },
                {
                    "ColumnName": "OfficeLocation",
                    "ColumnType": "STRING",
                    "ColumnLength": "20"
                }
            ],
            "TableColumnsTotal": "5"
        }
    ]
}
```

该 JSON 文档中的元素如下所示：

`TableCount` – 源表数。在该示例中，只有一个表。

`Tables` – 一个数组，对于每个源表，它包含一个 JSON 映射。在该示例中，只有一个映射。每个映射包含以下元素：
+ `TableName` – 源表的名称。
+ `TablePath` – AWS DMS 可以在 Amazon S3 存储桶中找到完整数据加载文件的路径。如果指定了 `bucketFolder` 值，则在路径前面添加其值。
+ `TableOwner` – 该表的架构名称。
+ `TableColumns` – 包含一个或多个映射的数组，每个映射描述源表中的一个列：
  + `ColumnName` – 源表中的列的名称。
  + `ColumnType` – 列的数据类型。有关有效的数据类型，请参阅[Amazon S3 的源数据类型](#CHAP_Source.S3.DataTypes)。
  + `ColumnLength` – 该列中的字节数。由于 S3 源不支持完整 LOB 模式，因此最大列长度限制为 2147483647 字节 (2,047 MegaBytes)。 `ColumnLength`对以下数据类型有效：
    + BYTE
    + string
  + `ColumnNullable` – 一个布尔值；如果该列可以包含 NULL 值，则此值为 `true`（默认值为 `false`）。
  + `ColumnIsPk` – 一个布尔值；如果该列是主键的一部分，则此值为 `true`（默认值为 `false`）。
  + `ColumnDateFormat` – 具有 DATE、TIME 和 DATETIME 类型的列的输入日期格式，用于将数据字符串解析为日期对象。可能的值包括：

    ```
    - YYYY-MM-dd HH:mm:ss
    - YYYY-MM-dd HH:mm:ss.F
    - YYYY/MM/dd HH:mm:ss
    - YYYY/MM/dd HH:mm:ss.F
    - MM/dd/YYYY HH:mm:ss
    - MM/dd/YYYY HH:mm:ss.F
    - YYYYMMdd HH:mm:ss
    - YYYYMMdd HH:mm:ss.F
    ```
+ `TableColumnsTotal` – 总列数。该数字必须与 `TableColumns` 数组中的元素数相匹配。

如果您未另行指定，则 AWS DMS 假定`ColumnLength`为零。

**注意**  
在支持的版本中 AWS DMS，S3 源数据还可以包含一个可选的操作列，作为列值之前的第一`TableName`列。此操作列标识在完全加载期间用于将数据迁移到 S3 目标终端节点的操作 (`INSERT`)。  
如果存在，则此列的值是 `INSERT` 操作关键字的第一个字符 (`I`)。如果指定，则此列通常指示在之前的迁移中 DMS 创建的 S3 源作为 S3 目标。  
在 3.4.2 之前的 DMS 版本中，通过以前的 DMS 完全加载创建的 S3 源数据中没有此列。将此列添加到 S3 目标数据可以使得写入 S3 目标的所有行的格式保持一致，不论它们是在完全加载还是 CDC 加载期间写入。有关格式化 S3 目标数据的选项的更多信息，请参阅[指示迁移的 S3 数据中的源数据库操作](CHAP_Target.S3.md#CHAP_Target.S3.Configuring.InsertOps)。

对于 NUMERIC 类型的列，指定精度和小数位数。*精度* 是数字中的总位数，而*小数位数* 是小数点右边的位数。为此，您可以使用 `ColumnPrecision` 和 `ColumnScale` 元素，如下所示。

```
...
    {
        "ColumnName": "HourlyRate",
        "ColumnType": "NUMERIC",
        "ColumnPrecision": "5"
        "ColumnScale": "2"
    }
...
```

对于数据包含小数秒的 DATETIME 类型的列，请指定小数位数。*小数位数*是小数秒的位数，范围可以从 0 到 9。为此，您可以使用 `ColumnScale` 元素，如下所示。

```
...
{
      "ColumnName": "HireDate",
      "ColumnType": "DATETIME",
      "ColumnScale": "3"
}
...
```

如果未另行指定，则 AWS DMS 假定`ColumnScale`为零并截断小数秒。

## 使用 CDC 和 Amazon S3 作为来源 AWS DMS
<a name="CHAP_Source.S3.CDC"></a>

 AWS DMS 执行完整数据加载后，它可以选择将数据更改复制到目标端点。为此，您需要将变更数据捕获文件（CDC 文件）上传到您的 Amazon S3 存储桶。 AWS DMS 在上传这些 CDC 文件时读取它们，然后将更改应用到目标端点。

CDC 文件是按如下方式命名的：

```
CDC00001.csv
CDC00002.csv
CDC00003.csv
...
```

**注意**  
要在更改数据文件夹中成功地复制 CDC 文件，请按词汇（序列）顺序上传它们。例如，在.csv 文件之前上传 CDC00002 .csv 文件 CDC00003。否则，如果您在 CDC00002 .csv 之后 CDC00003加载.csv，则会跳过且不会对其进行复制。但是，如果在 CDC00004 .csv 之后 CDC00003加载.csv 文件，则可以成功复制。

要指明在哪里 AWS DMS 可以找到文件，请指定`cdcPath`参数。对于前面的示例，如果将 `cdcPath` 设置为 `changedata`，则 AWS DMS 读取以下路径中的 CDC 文件。

```
s3://amzn-s3-demo-bucket/changedata
```

如果将 `cdcPath` 设置为 `changedata`，并将 `bucketFolder` 设置为 `myFolder`， AWS DMS 会读取以下路径中的 CDC 文件。

```
s3://amzn-s3-demo-bucket/myFolder/changedata
```

CDC 文件中的记录格式如下所示：
+ 操作 – 要执行的更改操作：`INSERT`（`I`）、`UPDATE`（`U`）或 `DELETE`（`D`）。这些关键字和字符值不区分大小写。
**注意**  
在支持的 AWS DMS 版本中， AWS DMS 可以通过两种方式识别每个加载记录要执行的操作。 AWS DMS 可以根据记录的关键字值（例如`INSERT`）或其关键字的初始字符（例如`I`）执行此操作。在之前的版本中，只能从完整的关键字值中 AWS DMS 识别加载操作。  
在的先前版本中 AWS DMS，写入了完整的关键字值来记录 CDC 数据。以前的版本仅使用关键字首字母将操作值写入任何 S3 目标。  
无论如何写入操作列 AWS DMS 来创建 S3 源数据，都可以识别这两种格式来处理操作。此方法支持使用 S3 目标数据作为源用于以后的迁移。借助这种方法，您无需更改以后 S3 源的操作列中显示的任意关键字首字母值的格式。
+ 表名称 – 源表的名称。
+ 架构名称 – 源架构的名称。
+ 数据 – 表示要更改的数据的一个或多个列。

以下是名为 `employee` 的表的示例 CDC 文件。

```
INSERT,employee,hr,101,Smith,Bob,2014-06-04,New York
UPDATE,employee,hr,101,Smith,Bob,2015-10-08,Los Angeles
UPDATE,employee,hr,101,Smith,Bob,2017-03-13,Dallas
DELETE,employee,hr,101,Smith,Bob,2017-03-13,Dallas
```

## 使用 Amazon S3 作为来源的先决条件 AWS DMS
<a name="CHAP_Source.S3.Prerequisites"></a>

要使用 Amazon S3 作为来源 AWS DMS，您的源 S3 存储桶必须与迁移数据的 DMS 复制实例位于同一 AWS 区域。此外，用于迁移的 AWS 账户必须具有源存储桶的读取访问权限。对于 AWS DMS 版本 3.4.7 及更高版本，DMS 必须通过 VPC 终端节点或公共路由访问源存储桶。有关 VPC 端点的信息，请参阅 [配置 VPC 终端节点 AWS DMS](CHAP_VPC_Endpoints.md)。

分配给用于创建迁移任务的用户账户的 AWS Identity and Access Management (IAM) 角色必须具有以下权限集。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
       {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket*/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket*"
            ]
        }
    ]
}
```

------

如果在 Amazon S3 存储桶上启用了版本控制，则分配给用于创建迁移任务的用户账户的 AWS Identity and Access Management (IAM) 角色必须具有以下权限集。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
       {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket*/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket*"
            ]
        }
    ]
}
```

------

## 使用 Amazon S3 作为来源时的限制 AWS DMS
<a name="CHAP_Source.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 存储桶。
+ MySQL 将 `time` 数据类型转换为 `string`。要在 MySQL 中查看 `time` 数据类型值，请将目标表中的列定义为 `string`，然后将任务的**目标表准备模式**设置设为**截断**。
+ AWS DMS 在内部对两种`BYTE`数据类型`BYTE`和数据类型都使用该`BYTES`数据类型。
+ S3 源端点不支持 DMS 表重新加载特征。
+ AWS DMS 不支持以 Amazon S3 作为源的完整 LOB 模式。

在作为源的 Amazon S3 中使用 Parquet 格式文件时存在以下限制：
+ S3 Parquet 源日期分区特征不支持 `MMYYYYDD` 或 `DDMMYYYY` 格式的日期。

## Amazon S3 的终端节点设置作为来源 AWS DMS
<a name="CHAP_Source.S3.Configuring"></a>

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

**注意**  
AWS DMS 默认为与 Amazon S3 终端节点的安全连接，无需指定 SSL 模式或证书。

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


| **选项** | **描述** | 
| --- | --- | 
| BucketFolder |  (可选) S3 存储桶中的文件夹名称。如果提供该属性，则分别从 `s3://amzn-s3-demo-bucket/bucketFolder/schemaName/tableName/` 和 `s3://amzn-s3-demo-bucket/bucketFolder/` 路径中读取源数据文件和 CDC 文件。如果未指定此属性，则使用的路径为 `schemaName/tableName/`。 `'{"BucketFolder": "sourceData"}'`  | 
| BucketName |  S3 桶的名称。 `'{"BucketName": "amzn-s3-demo-bucket"}'`  | 
| CdcPath | CDC 文件的位置。如果任务捕获更改数据，则该属性是必需的，否则，该属性是可选的。如果CdcPath存在，则从此路径 AWS DMS 读取 CDC 文件并将数据更改复制到目标端点。有关更多信息，请参阅 [使用 CDC 和 Amazon S3 作为来源 AWS DMS](#CHAP_Source.S3.CDC)。`'{"CdcPath": "changeData"}'`  | 
| CsvDelimiter |  源文件中用于分隔列的分隔符。默认值为逗号。下面是一个示例。 `'{"CsvDelimiter": ","}'`  | 
| CsvNullValue |  用户定义的字符串， AWS DMS 从源读取时将其视为 null。默认值是空字符串。如果未设置此参数，则 AWS DMS 会将空字符串视为空值。如果将此参数设置为诸如 “\$1 N” 之类的字符串，则 AWS DMS 会将此字符串视为空值，并将空字符串视为空字符串值。  | 
| CsvRowDelimiter |  源文件中用于分隔行的分隔符。默认值为换行符 (`\n`)。 `'{"CsvRowDelimiter": "\n"}'`  | 
| DataFormat |  将此值设置为 `Parquet` 可读取 Parquet 格式的数据。 `'{"DataFormat": "Parquet"}'`  | 
| IgnoreHeaderRows |  当此值设置为 1 时，将 AWS DMS 忽略.csv 文件中的第一行标题。值为 1 可启用该功能，值为 0 将禁用该功能。 默认值是 0。 `'{"IgnoreHeaderRows": 1}'`  | 
| Rfc4180 |  当此值设置为 `true` 或 `y` 时，每个前导双引号必须后跟一个结束双引号。此格式符合 RFC 4180。当此值设置为 `false` 或 `n`时，字符串文字将按原样复制到目标。在这种情况下，分隔符（行或列）表示字段的末尾。因此，您不能使用分隔符作为字符串的一部分，因为它表示值的末尾。 默认值为 `true`。 有效值：`true`、`false`、`y`、`n` `'{"Rfc4180": false}'`  | 

## Amazon S3 的源数据类型
<a name="CHAP_Source.S3.DataTypes"></a>

使用 Amazon S3 作为数据源的数据迁移 AWS DMS 需要将数据从 Amazon S3 映射到 AWS DMS 数据类型。有关更多信息，请参阅 [将 Amazon S3 的外部表定义为数据源 AWS DMS](#CHAP_Source.S3.ExternalTableDef)。

有关如何查看目标中映射的数据类型的信息，请参阅有关所使用的目标终端节点的部分。

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

以下 AWS DMS 数据类型用于 Amazon S3 作为数据源：
+ BYTE – 需要 `ColumnLength`。有关更多信息，请参阅 [将 Amazon S3 的外部表定义为数据源 AWS DMS](#CHAP_Source.S3.ExternalTableDef)。
+ DATE
+ TIME
+ DATETIME – 有关更多信息和示例，请参阅 [将 Amazon S3 的外部表定义为数据源 AWS DMS](#CHAP_Source.S3.ExternalTableDef) 中的 DATETIME 类型示例。
+ INT1
+ INT2
+ INT4
+ INT8
+ 数字-需要`ColumnPrecision`和`ColumnScale`。 AWS DMS 支持以下最大值：
  + **ColumnPrecision: 38**
  + **ColumnScale: 31**

  有关更多信息和示例，请参阅 [将 Amazon S3 的外部表定义为数据源 AWS DMS](#CHAP_Source.S3.ExternalTableDef) 中的 NUMERIC 类型示例。
+ REAL4
+ REAL8
+ STRING – 需要 `ColumnLength`。有关更多信息，请参阅 [将 Amazon S3 的外部表定义为数据源 AWS DMS](#CHAP_Source.S3.ExternalTableDef)。
+ UINT1
+ UINT2
+ UINT4
+ UINT8
+ BLOB
+ CLOB
+ BOOLEAN

## 使用 Amazon S3 中的拼木地板格式文件作为来源 AWS DMS
<a name="CHAP_Source.S3.Parquet"></a>

在 3.5.3 及更高 AWS DMS 版本中，您可以使用 S3 存储桶中的 Parquet 格式文件作为满载或 CDC 复制的来源。

DMS 仅支持 Parquet 格式文件作为 DMS 通过将数据迁移到 S3 目标端点而生成的源。文件名必须采用支持的格式，否则 DMS 不会将其包含在迁移中。

Parquet 格式的源数据文件必须位于以下文件夹并遵守以下命名约定。

```
schema/table1/LOAD00001.parquet
schema/table2/LOAD00002.parquet
schema/table2/LOAD00003.parquet
```

对于 Parquet 格式的 CDC 数据的源数据文件，请使用以下文件夹和命名约定对其进行命名和存储。

```
schema/table/20230405-094615814.parquet
schema/table/20230405-094615853.parquet
schema/table/20230405-094615922.parquet
```

要访问 Parquet 格式文件，请设置以下端点设置：
+ 将 `DataFormat` 设置为 `Parquet`。
+ 请勿设置 `cdcPath` 设置。确保在指定的架构/表文件夹中创建 Parquet 格式文件。

有关 S3 端点设置的更多信息，请参阅《AWS Database Migration Service API 参考》**中的 [S3Settings](https://docs.aws.amazon.com/dms/latest/APIReference/API_S3Settings.html)。

### Parquet 格式文件支持的数据类型
<a name="CHAP_Source.S3.Parquet.Datatypes"></a>

AWS DMS 从 Parquet 格式文件迁移数据时，支持以下源和目标数据类型。迁移之前，请确保目标表中包含正确数据类型的列。


| 源数据类型 | 目标数据类型 | 
| --- | --- | 
| BYTE | 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 | UINT | 
| WSTRING | STRING | 
| BLOB | BINARY | 
| NCLOB | STRING | 
| CLOB | STRING | 
| BOOLEAN | BOOL | 