

# 数据库集群快照导出注意事项
<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 临时表和未记录的表。
+ 如果数据包含接近或大于 500MB 的大型对象（例如 BLOB 或 CLOB），则导出失败。
+ 如果表中某个大行的大小接近或大于 2GB，则会在导出过程中略过该表。
+ 对于部分导出，`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 逻辑类型定义](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_cn/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 |   | 
| 文本搜索 | BYTE\$1ARRAY | STRING |   | 
| VARCHAR(N) | BYTE\$1ARRAY | STRING |   | 
| XML | BYTE\$1ARRAY | STRING |   | 
| 日期和时间数据类型 | 
| DATE | BYTE\$1ARRAY | STRING |   | 
| INTERVAL | BYTE\$1ARRAY | STRING |   | 
| TIME | BYTE\$1ARRAY | STRING |  | 
| 带时区的时间 | BYTE\$1ARRAY | STRING |  | 
| TIMESTAMP | BYTE\$1ARRAY | STRING |  | 
| TIMESTAMP（有时区） | BYTE\$1ARRAY | STRING |  | 
| 几何数据类型 | 
| BOX | BYTE\$1ARRAY | STRING |   | 
| CIRCLE | BYTE\$1ARRAY | STRING |   | 
| LINE | BYTE\$1ARRAY | STRING |   | 
| LINESEGMENT | BYTE\$1ARRAY | STRING |   | 
| 路径 | 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 |   | 
| 对象标识符 | 不适用 |  |  | 
| PG\$1LSN | BYTE\$1ARRAY | STRING |   | 
| RANGE | BYTE\$1ARRAY | STRING |   | 
| UUID | BYTE\$1ARRAY | STRING |   | 