

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

# 資料庫叢集快照匯出的考量
<a name="aurora-export-snapshot.Considerations"></a>

## 限制
<a name="aurora-export-snapshot.Limits"></a>

將資料庫快照資料匯出至 Amazon S3 時有下列限制：
+ 您無法同時針對相同的資料庫叢集快照執行多個匯出任務。這同時適用於完整和部分匯出。
+ 每個 最多可以有五個同時進行的資料庫快照匯出任務 AWS 帳戶。
+ 您無法從 Aurora Serverless v1 資料庫叢集將快照資料匯出至 S3。
+ 匯出至 S3 不支援包含冒號 (:) 的 S3 字首。
+ 在匯出過程中，S3 檔案路徑中的以下字元將轉換為底線 (\$1)：

  ```
  \ ` " (space)
  ```
+ 如果資料庫、結構描述或資料表的名稱中包含下列字元以外的字元，則不支援部分匯出。但是，您可以匯出整個資料庫快照。
  + 拉丁字母 (A–Z)
  + 數字 (0–9)
  + 美元符號 (\$1)
  + 底線 (\$1)
+ 資料庫資料表資料欄名稱不支援空格 ( ) 和某些字元。資料行名稱中具備下列字元的資料表會在匯出時跳過：

  ```
  , ; { } ( ) \n \t = (space)
  ```
+ 匯出時會略過名稱中具備斜線 (/) 的表格。
+ 匯出期間，系統會略過 Aurora PostgreSQL 的暫存和未記錄資料表。
+ 若資料包含接近或超過 500 MB 的大型物件 (例如 BLOB 或 CLOB)，則匯出會失敗。
+ 如果資料表包含接近或大於 2 GB 的大型資料列，則在匯出期間會略過該資料表。
+ 對於部分匯出，`ExportOnly` 清單的大小上限為 200 KB。
+ 強烈建議您對每個匯出任務使用唯一的名稱。如果不使用唯一的任務名稱，可能會收到下列錯誤訊息：

  ExportTaskAlreadyExistsFault：呼叫 StartExportTask 操作時出現錯誤 (ExportTaskAlreadyExists)：ID *xxxxx* 的匯出任務已存在。
+ 您在將快照資料匯出至 S3 時可以刪除該快照，但在匯出任務完成之前，仍會向您收取該快照的儲存費用。
+ 您無法將匯出的快照資料從 S3 還原到新的資料庫叢集。

## 檔案命名慣例
<a name="aurora-export-snapshot.FileNames"></a>

特定表格的匯出資料會以 `base_prefix/files` 的格式儲存，其中基本前綴如下：

```
export_identifier/database_name/schema_name.table_name/
```

例如：

```
export-1234567890123-459/rdststdb/rdststdb.DataInsert_7ADB5D19965123A2/
```

檔案命名方式有兩種慣例：
+ 目前慣例：

  ```
  batch_index/part-partition_index-random_uuid.format-based_extension
  ```

  批次索引是序號，代表從資料表讀取的資料批次。如果我們無法將您的資料表分割成要平行匯出的小型區塊，將會有多個批次索引。如果您的資料表分割為多個資料表，則會發生相同的情況。此時會有多個批次索引，一個用於主資料表的每個資料表分割區。

  如果我們可以將您的資料表分割成要平行讀取的小區塊，則只會有批次索引 `1` 資料夾。

  在批次索引資料夾中，有一或多個 Parquet 檔案包含資料表的資料。Parquet 檔案名稱的字首為 `part-partition_index`。如果您的資料表已分割，則會有多個以分割區索引 `00000` 開頭的檔案。

  分割區索引序列中可能會有間隙。這是因為每個分割區是從資料表中的範圍查詢取得。如果該分割區的範圍內沒有資料，則會略過該序號。

  例如，假設 `id` 欄是資料表的主索引鍵，且其最小值和最大值為 `100` 和 `1000`。當我們嘗試使用九個分割區匯出此資料表時，我們會使用平行查詢來讀取它，如下所示：

  ```
  SELECT * FROM table WHERE id <= 100 AND id < 200
  	SELECT * FROM table WHERE id <= 200 AND id < 300
  ```

  這應該會產生從 `part-00000-random_uuid.gz.parquet` 到 `part-00008-random_uuid.gz.parquet` 的九個檔案。不過，如果沒有 ID 介於 `200` 和 `350` 之間的資料列，則其中一個已完成的分割區是空的，而且不會為其建立檔案。在上一個範例中，`part-00001-random_uuid.gz.parquet` 不會建立。
+ 較舊的慣例：

  ```
  part-partition_index-random_uuid.format-based_extension
  ```

  這與目前的慣例相同，但沒有 `batch_index` 字首，例如：

  ```
  part-00000-c5a881bb-58ff-4ee6-1111-b41ecff340a3-c000.gz.parquet
  	part-00001-d7a881cc-88cc-5ab7-2222-c41ecab340a4-c000.gz.parquet
  	part-00002-f5a991ab-59aa-7fa6-3333-d41eccd340a7-c000.gz.parquet
  ```

檔案命名慣例可能會有所變更。因此，在讀取目標資料表時，建議您讀取資料表基本字首內的所有內容。

## 匯出至 Amazon S3 儲存貯體時的資料轉換
<a name="aurora-export-snapshot.data-types"></a>

當您將資料庫快照匯出至 Amazon S3 儲存貯體時，Amazon Aurora 會以 Parquet 格式轉換資料、匯出資料，以及存放資料。如需 Parquet 的詳細資訊，請參閱 [Apache Parquet](https://parquet.apache.org/docs/) 網站。

Parquet 會將所有資料以下列其中一種基本類型存放：
+ BOOLEAN
+ INT32
+ INT64
+ INT96
+ FLOAT
+ DOUBLE
+ BYTE\$1ARRAY – 長度可變的位元組陣列，也稱為二進位
+ FIXED\$1LEN\$1BYTE\$1ARRAY – 長度固定的位元組陣列，用於值具備固定大小時

Parquet 的資料類型相當少，可減少讀取和寫入格式的複雜性。Parquet 提供擴充基本類型的邏輯類型。「邏輯類型」**會實作為標註，並將資料存放在 `LogicalType` 中繼資料欄位中。邏輯類型標註會說明如何解譯基本類型。

當 `STRING` 邏輯類型標註 `BYTE_ARRAY` 類型時，會指出位元組陣列應解譯為 UTF-8 編碼的字元字串。匯出任務完成後，Amazon Aurora 會通知您是否發生任何字串轉換。匯出的基礎資料一律與來源資料相同。但是，由於 UTF-8 中的編碼存在差異，在 Athena 等工具中讀取時，有些字元的顯示方式可能會和來源中的顯示方式不同。

如需詳細資訊，請參閱 Parquet 文件中的 [Parquet Logical Type Definitions](https://github.com/apache/parquet-format/blob/master/LogicalTypes.md)。

**Topics**
+ [MySQL 資料類型映射至 Parquet](#aurora-export-snapshot.data-types.MySQL)
+ [PostgreSQL 資料類型對 Parquet 的映射](#aurora-export-snapshot.data-types.PostgreSQL)

### MySQL 資料類型映射至 Parquet
<a name="aurora-export-snapshot.data-types.MySQL"></a>

下表顯示轉換資料並匯出至 Amazon S3 時，從 MySQL 資料類型到 Parquet 資料類型的映射。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/AuroraUserGuide/aurora-export-snapshot.Considerations.html)

### PostgreSQL 資料類型對 Parquet 的映射
<a name="aurora-export-snapshot.data-types.PostgreSQL"></a>

下表顯示轉換資料並匯出至 Amazon S3 時，PostgreSQL 資料類型到 Parquet 資料類型的映射。


| PostgreSQL 資料類型 | Parquet 基本類型 | 邏輯類型標註 | 映射備註 | 
| --- | --- | --- | --- | 
| 數值資料類型 | 
| BIGINT | INT64 |  |   | 
| BIGSERIAL | INT64 |  |   | 
| DECIMAL | BYTE\$1ARRAY | STRING | DECIMAL 類型會轉換成 BYTE\$1ARRAY 類型中的字串，並以 UTF8 編碼。此轉換是為了避免因非數字 (NaN) 而導致的資料精確度和資料值複雜性。 | 
| DOUBLE PRECISION | DOUBLE |  |   | 
| INTEGER | INT32 |  |   | 
| MONEY | BYTE\$1ARRAY | STRING |   | 
| REAL | FLOAT |  |   | 
| SERIAL | INT32 |  |   | 
| SMALLINT | INT32 | INT(16, true) |   | 
| SMALLSERIAL | INT32 | INT(16, true) |   | 
| 字串和相關資料類型 | 
| ARRAY | BYTE\$1ARRAY | STRING |  陣列會轉換成字串，並以 BINARY (UTF8) 編碼。 此轉換是為了避免因非數字 (NaN) 和時間資料值而導致的資料精確度複雜性。  | 
| BIT | BYTE\$1ARRAY | STRING |   | 
| BIT VARYING | BYTE\$1ARRAY | STRING |   | 
| BYTEA | BINARY |  |   | 
| CHAR | BYTE\$1ARRAY | STRING |   | 
| CHAR(N) | BYTE\$1ARRAY | STRING |   | 
| ENUM | BYTE\$1ARRAY | STRING |   | 
| NAME | BYTE\$1ARRAY | STRING |   | 
| TEXT | BYTE\$1ARRAY | STRING |   | 
| TEXT SEARCH | BYTE\$1ARRAY | STRING |   | 
| VARCHAR(N) | BYTE\$1ARRAY | STRING |   | 
| XML | BYTE\$1ARRAY | STRING |   | 
| 日期和時間資料類型 | 
| DATE | BYTE\$1ARRAY | STRING |   | 
| INTERVAL | BYTE\$1ARRAY | STRING |   | 
| TIME | BYTE\$1ARRAY | STRING |  | 
| TIME WITH TIME ZONE | BYTE\$1ARRAY | STRING |  | 
| TIMESTAMP | BYTE\$1ARRAY | STRING |  | 
| TIMESTAMP WITH TIME ZONE | BYTE\$1ARRAY | STRING |  | 
| 幾何資料類型 | 
| BOX | BYTE\$1ARRAY | STRING |   | 
| CIRCLE | BYTE\$1ARRAY | STRING |   | 
| LINE | BYTE\$1ARRAY | STRING |   | 
| LINESEGMENT | BYTE\$1ARRAY | STRING |   | 
| PATH | BYTE\$1ARRAY | STRING |   | 
| POINT | BYTE\$1ARRAY | STRING |   | 
| POLYGON | BYTE\$1ARRAY | STRING |   | 
| JSON 資料類型 | 
| JSON | BYTE\$1ARRAY | STRING |   | 
| JSONB | BYTE\$1ARRAY | STRING |   | 
| 其他資料類型 | 
| BOOLEAN | BOOLEAN |  |   | 
| CIDR | BYTE\$1ARRAY | STRING |  網路資料類型 | 
| COMPOSITE | BYTE\$1ARRAY | STRING |   | 
| DOMAIN | BYTE\$1ARRAY | STRING |   | 
| INET | BYTE\$1ARRAY | STRING |  網路資料類型 | 
| MACADDR | BYTE\$1ARRAY | STRING |   | 
| OBJECT IDENTIFIER | N/A |  |  | 
| PG\$1LSN | BYTE\$1ARRAY | STRING |   | 
| RANGE | BYTE\$1ARRAY | STRING |   | 
| UUID | BYTE\$1ARRAY | STRING |   | 