

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 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-format 檔案的詳細資訊，請參閱 [使用 Amazon S3 中的 Parquet 格式檔案做為 的來源 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` 參數，以指定 Amazon S3 儲存貯體中 AWS DMS 應在何處尋找資料檔案。繼續先前的範例，如果您將 `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 會根據指定參數檢查儲存貯體擁有者的帳戶識別碼。

```
--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 中的 Parquet 格式檔案做為 的來源 AWS DMS](#CHAP_Source.S3.Parquet)

## 將 Amazon S3 的外部資料表定義為 的來源 AWS DMS
<a name="CHAP_Source.S3.ExternalTableDef"></a>

除了資料檔案，您還必須提供外部資料表定義。*外部資料表定義*是 JSON 文件，說明如何從 Amazon S3 AWS DMS 解譯資料。此文件大小上限為 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`：在 Amazon S3 儲存貯體中， AWS DMS 可以在其中找到完整資料載入檔案的路徑。如已指定 `bucketFolder` 值，則此值會附加到路徑前。
+ `TableOwner`：此資料表的結構描述名稱。
+ `TableColumns`：一或多個對應的陣列，其中每一個都會描述來源資料表中的資料欄：
  + `ColumnName`：來源資料表中的資料欄名稱。
  + `ColumnType`：資料欄的資料類型。如需有效的資料類型，請參閱[Amazon S3 的來源資料類型](#CHAP_Source.S3.DataTypes)。
  + `ColumnLength`：此資料欄中的位元組數量。最大資料欄長度限制為 2147483647 位元組 (2,047 百萬位元組)，因為 S3 來源不支援完整 LOB 模式。`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`) 的起首字元。若已指定，此欄通常指出 S3 來源在前一個遷移期間已被 DMS 建立為 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 檔案，請按辭典 (連續) 順序上傳。例如，先上傳檔案 CDC00002.csv 後，再上傳 CDC00003.csv。如果您在 CDC00003.csv 之後載入 CDC00002.csv，則會略過且不會複寫 CDC00002.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 帳戶必須有來源儲存貯體的讀取存取權。對於 3.4.7 版和更新 AWS DMS 版本，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 來源日期分割功能`DDMMYYYY`不支援 `MMYYYYDD`、 或 中的日期。

## Amazon S3 做為 來源的端點設定 AWS DMS
<a name="CHAP_Source.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)指定設定。

**注意**  
AWS DMS 預設為 Amazon S3 端點的安全連線，而不需要指定 SSL 模式或憑證。

下列資料表顯示您可以在將 Amazon S3 作為來源搭配使用的端點設定。


| **選項** | **Description** | 
| --- | --- | 
| 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 會將空字串視為 null 值。如果您將此參數設定為 "\$1N" 之類的字串， AWS DMS 會將此字串視為 null 值，並將空字串視為空字串值。  | 
| 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
+ NUMERIC – 需要 `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 中的 Parquet 格式檔案做為 的來源 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 | 