

# 将 Amazon RDS 的数据库快照数据导出到 Amazon S3
<a name="USER_ExportSnapshot"></a>

您可以将数据库快照数据导出到 Amazon S3 存储桶。导出过程在后台运行，而不会影响活动数据库的性能。

导出数据库快照时，Amazon RDS 从快照中提取数据并将其存储在 Amazon S3 存储桶中。数据以压缩和一致的 Apache Parquet 格式存储。

您可以导出所有类型的数据库快照 – 包括手动快照、自动系统快照和 Amazon Backup 服务创建的快照。默认情况下，将导出快照中的所有数据。但是，您可以选择导出特定的一组数据库、方案或表。

导出数据后，您可以通过 Amazon Athena 或 Amazon Redshift Spectrum 等工具直接分析导出的数据。有关使用 Athena 读取 Parque 数据的更多信息，请参阅 *Amazon Athena 用户指南*中的 [Parquet SerDe](https://docs.amazonaws.cn/athena/latest/ug/parquet-serde.html)。有关使用 Redshift Spectrum 读取 Parquet 数据的更多信息，请参阅《Amazon Redshift 数据库开发人员指南》中的[从列式数据格式执行 COPY 操作](https://docs.amazonaws.cn/redshift/latest/dg/copy-usage_notes-copy-from-columnar.html)。

**警告**  
您无法将从 S3 导出的快照数据还原到新的数据库实例，也无法将快照数据从 S3 导入到现有的数据库实例。但是，您可以使用 Amazon Athena 或 Redshift Spectrum 处理数据来进行分析。此外，您可以使用 Amazon Glue 转换数据，然后使用诸如 Amazon DMS 之类的工具或自定义脚本将其导入 Amazon RDS。

有关将数据库快照导出到 Amazon S3 的更多信息，请参阅以下主题。

**主题**
+ [监控 Amazon RDS 的快照导出](USER_ExportSnapshot.Monitoring.md)
+ [取消 Amazon RDS 的快照导出任务](USER_ExportSnapshot.Canceling.md)
+ [Amazon RDS 的 Amazon S3 导出任务的失败消息](USER_ExportSnapshot.failure-msg.md)
+ [排查 RDS for PostgreSQL 权限错误](USER_ExportSnapshot.postgres-permissions.md)
+ [Amazon RDS 导出到 Amazon S3 时的文件命名约定](USER_ExportSnapshot.FileNames.md)
+ [Amazon RDS 导出到 Amazon S3 存储桶时的数据转换](USER_ExportSnapshot.data-types.md)

## 导出快照数据概述
<a name="USER_ExportSnapshot.Overview"></a>

您可以使用以下过程将数据库快照数据导出到 Amazon S3 存储桶。有关更多详细信息，请参阅以下部分。

1. 确定要导出的快照。

   使用现有的自动快照或手动快照，或创建数据库实例或多可用区数据库集群的手动快照。

1. 设置对 Amazon S3 存储桶的访问权限。

   *存储桶*是 Amazon S3 对象或文件的容器。要提供访问存储桶的信息，请执行以下步骤：

   1. 标识要将快照导出到的 S3 存储桶。S3 存储桶必须与快照位于同一 Amazon 区域。有关更多信息，请参阅 [标识要导出到的 Amazon S3 存储桶](#USER_ExportSnapshot.SetupBucket)。

   1. 创建一个 Amazon Identity and Access Management (IAM) 角色，用于授予快照导出任务对 S3 存储桶的访问权限。有关更多信息，请参阅 [使用 IAM 角色提供对 Amazon S3 存储桶的访问权限](#USER_ExportSnapshot.SetupIAMRole)。

1. 创建对称加密 Amazon KMS key 以进行服务器端加密。快照导出任务使用 KMS 密钥在将导出数据写入 S3 时设置 Amazon KMS 服务器端加密。

   KMS 密钥策略必须同时包含 `kms:CreateGrant` 和 `kms:DescribeKey` 权限。有关在 Amazon RDS 中使用 KMS 密钥的更多信息，请参阅[Amazon KMS key 管理](Overview.Encryption.Keys.md)。

   如果 KMS 密钥策略中有拒绝语句，则确保显式排除 Amazon 服务主体 `export.rds.amazonaws.com`。

   您可以在您的 Amazon 账户内使用 KMS 密钥，或者您可以使用跨账户 KMS 密钥。有关更多信息，请参阅 [使用跨账户 Amazon KMS key 加密 Amazon S3 导出的内容](#USER_ExportSnapshot.CMK)。

1. 使用控制台或 `start-export-task` CLI 命令将快照导出到 Amazon S3。有关更多信息，请参阅 [将数据库快照导出到 Amazon S3 桶](#USER_ExportSnapshot.Exporting)。

1. 要访问 Amazon S3 存储桶中导出的数据，请参阅 *Amazon Simple Storage Service 用户指南*中的[上传、下载和管理对象](https://docs.amazonaws.cn/AmazonS3/latest/user-guide/upload-download-objects.html)。

## 设置 Amazon S3 存储桶的访问权限
<a name="USER_ExportSnapshot.Setup"></a>

要将数据库快照数据导出到 Amazon S3 文件，首先需要授予快照访问 Amazon S3 存储桶的权限。然后，您创建 IAM 角色以允许 Amazon RDS 服务写入 Amazon S3 存储桶。

**Topics**
+ [标识要导出到的 Amazon S3 存储桶](#USER_ExportSnapshot.SetupBucket)
+ [使用 IAM 角色提供对 Amazon S3 存储桶的访问权限](#USER_ExportSnapshot.SetupIAMRole)
+ [使用跨账户 Amazon S3 存储桶](#USER_ExportSnapshot.Setup.XAcctBucket)
+ [使用跨账户 Amazon KMS key 加密 Amazon S3 导出的内容](#USER_ExportSnapshot.CMK)

### 标识要导出到的 Amazon S3 存储桶
<a name="USER_ExportSnapshot.SetupBucket"></a>

标识要将数据库快照导出到的 Amazon S3 存储桶。使用现有 S3 存储桶或创建新的 S3 存储桶。

**注意**  
要导出到的 S3 存储桶必须与快照位于同一 Amazon 区域中。

有关使用 Amazon S3 存储桶的详细信息，请参阅 *Amazon Simple Storage Service 用户指南*中的以下主题：
+ [如何查看 S3 存储桶的属性？](https://docs.amazonaws.cn/AmazonS3/latest/user-guide/view-bucket-properties.html)
+ [如何为 Amazon S3 存储桶启用默认加密？](https://docs.amazonaws.cn/AmazonS3/latest/user-guide/default-bucket-encryption.html)
+ [如何创建 S3 存储桶？](https://docs.amazonaws.cn/AmazonS3/latest/user-guide/create-bucket.html)

### 使用 IAM 角色提供对 Amazon S3 存储桶的访问权限
<a name="USER_ExportSnapshot.SetupIAMRole"></a>

将数据库快照数据导出到 Amazon S3 之前，请授予快照导出任务对 Amazon S3 存储桶的写入访问权限。

要授予此权限，请创建 IAM 策略以提供对桶的访问权限，然后创建一个 IAM 角色并将该策略附加到该角色。您稍后将此 IAM 角色分配给快照导出任务。

有关其他 Amazon S3 访问管理工具的信息，请参阅《Amazon S3 用户指南》**中的 [Amazon S3 中的访问控制](https://docs.amazonaws.cn/AmazonS3/latest/userguide/access-management.html)。

**重要**  
如果计划使用Amazon Web Services 管理控制台导出快照，则可以选择在导出快照时自动创建 IAM 策略和角色。有关说明，请参阅 [将数据库快照导出到 Amazon S3 桶](#USER_ExportSnapshot.Exporting)。

**授予数据库快照任务访问 Amazon S3 的权限**

1. 创建一个 IAM 策略。此策略提供允许快照导出任务访问 Amazon S3 的存储桶和对象权限。

   在策略中包含以下必需操作，以允许将文件从 Amazon RDS 桶传输到 S3 桶：
   + `s3:PutObject*`
   + `s3:GetObject*` 
   + `s3:ListBucket` 
   + `s3:DeleteObject*`
   +  `s3:GetBucketLocation`

   在策略中，包含以下资源以标识 S3 桶以及该桶中的对象。以下资源列表显示用于访问 Amazon S3 的 Amazon Resource Name (ARN) 格式。
   + `arn:aws:s3:::amzn-s3-demo-bucket`
   + `arn:aws:s3:::amzn-s3-demo-bucket/*`

   有关为 Amazon RDS 创建 IAM 策略的更多信息，请参阅[创建和使用适用于 IAM 数据库访问的 IAM 策略](UsingWithRDS.IAMDBAuth.IAMPolicy.md)。另请参阅 *IAM 用户指南*中的[教程：创建和附加您的第一个客户托管策略](https://docs.amazonaws.cn//IAM/latest/UserGuide/tutorial_managed-policies.html)。

   以下 Amazon CLI 命令使用这些选项创建一个名为 `ExportPolicy` 的 IAM 策略。该策略授予对名为 *amzn-s3-demo-bucket* 的存储桶的访问权限。
**注意**  
创建策略后，请记下策略的 ARN。在将策略附加到 IAM 角色时，您在后面的步骤中需要使用 ARN。

   ```
   aws iam create-policy  --policy-name ExportPolicy --policy-document '{
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "ExportPolicy",
               "Effect": "Allow",
               "Action": [
                   "s3:PutObject*",
                   "s3:ListBucket",
                   "s3:GetObject*",
                   "s3:DeleteObject*",
                   "s3:GetBucketLocation"
               ],
               "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-bucket",
                   "arn:aws:s3:::amzn-s3-demo-bucket/*"
               ]
           }
       ]
   }'
   ```

1. 创建一个 IAM 角色，以便 Amazon RDS 可以代入该 IAM 角色，代表您访问 Amazon S3 桶。有关更多信息，请参阅 *IAM 用户指南*中的[创建向 IAM 用户委派权限的角色](https://docs.amazonaws.cn//IAM/latest/UserGuide/id_roles_create_for-user.html)。

   以下示例说明了如何使用 Amazon CLI 命令创建一个名为 `rds-s3-export-role` 的角色。

   ```
   aws iam create-role  --role-name rds-s3-export-role  --assume-role-policy-document '{
        "Version": "2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
               "Service": "export.rds.amazonaws.com"
             },
            "Action": "sts:AssumeRole"
          }
        ] 
      }'
   ```

1. 将您创建的 IAM 策略附加到您创建的 IAM 角色。

   以下 Amazon CLI 命令将之前创建的策略附加到名为 `rds-s3-export-role` 的角色。将 `your-policy-arn` 替换为您在先前步骤中记下的策略 ARN。

   ```
   aws iam attach-role-policy  --policy-arn your-policy-arn  --role-name rds-s3-export-role
   ```

### 使用跨账户 Amazon S3 存储桶
<a name="USER_ExportSnapshot.Setup.XAcctBucket"></a>

您可以跨 Amazon 账户使用 Amazon S3 存储桶。要使用跨账户存储桶，请添加存储桶策略以允许访问您用于 S3 导出的 IAM 角色。有关更多信息，请参阅[示例 2：存储桶拥有者授予跨账户存储桶权限](https://docs.amazonaws.cn/AmazonS3/latest/userguide/example-walkthroughs-managing-access-example2.html)。

将存储桶策略附加到存储桶，如下面的示例所示。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:role/Admin"
            },
            "Action": [
                "s3:PutObject*",
                "s3:ListBucket",
                "s3:GetObject*",
                "s3:DeleteObject*",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-destination-bucket",
                "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
            ]
        }
    ]
}
```

------

### 使用跨账户 Amazon KMS key 加密 Amazon S3 导出的内容
<a name="USER_ExportSnapshot.CMK"></a>

您可以使用跨账户 Amazon KMS key 以加密 Amazon S3 导出的内容。首先，向本地账户添加密钥策略，然后在外部账户中添加 IAM 策略。有关更多信息，请参阅[允许其他账户中的用户使用 KMS 密钥](https://docs.amazonaws.cn/kms/latest/developerguide/key-policy-modifying-external-accounts.html)。

**要使用跨账户 KMS 密钥**

1. 向本地账户添加密钥策略。

   以下示例为外部账户 444455556666 中的 `ExampleRole` 和 `ExampleUser` 提供了内部账户 123456789012 中的权限。

   ```
   {
       "Sid": "Allow an external account to use this KMS key",
       "Effect": "Allow",
       "Principal": {
           "AWS": [
               "arn:aws:iam::444455556666:role/ExampleRole",
               "arn:aws:iam::444455556666:user/ExampleUser"
           ]
       },
       "Action": [
           "kms:Encrypt",
           "kms:Decrypt",
           "kms:ReEncrypt*",
           "kms:GenerateDataKey*",
           "kms:CreateGrant",
           "kms:DescribeKey",
           "kms:RetireGrant"
       ],
       "Resource": "*"
   }
   ```

1. 在外部账户中添加 IAM 策略。

   以下示例 IAM 策略允许主体使用账户 123456789012 中的 KMS 密钥执行加密操作。要向账户 444455556666 中的 `ExampleRole` 和 `ExampleUser` 授予此权限，[请将策略附加](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_managed-using.html#attach-managed-policy-console)到该账户中的用户或角色。

   ```
   {
       "Sid": "Allow use of KMS key in account 123456789012",
       "Effect": "Allow",
       "Action": [
           "kms:Encrypt",
           "kms:Decrypt",
           "kms:ReEncrypt*",
           "kms:GenerateDataKey*",
           "kms:CreateGrant",
           "kms:DescribeKey",
           "kms:RetireGrant"
       ],
       "Resource": "arn:aws:kms:us-west-2:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"
   }
   ```

## 将数据库快照导出到 Amazon S3 桶
<a name="USER_ExportSnapshot.Exporting"></a>

每个 Amazon Web Services 账户 最多可以执行五个并发数据库快照导出任务。

**注意**  
导出 RDS 快照可能需要一段时间，具体取决于您的数据库类型和大小。导出任务首先还原并扩展整个数据库，然后再将数据提取到 Amazon S3。此阶段的任务进度显示为**正在启动**。当任务切换到将数据导出到 S3 时，进度显示为**正在进行**。  
完成导出所需的时间取决于数据库中存储的数据。例如，具有分布良好的数字主键或索引列的表导出速度最快。不包含适用于分区的列的表，以及只有基于字符串的列上的一个索引的表将需要更长时间。导出时间之所以更长，是因为导出使用较慢的单线程进程。

您可以使用Amazon Web Services 管理控制台、Amazon CLI 或 RDS API 将数据库快照导出到 Amazon S3。要将数据库快照导出到跨账户 Amazon S3 存储桶，请使用 Amazon CLI 或 RDS API。

如果您使用 Lambda 函数导出快照，请将 `kms:DescribeKey` 操作添加到 Lambda 函数策略中。有关更多信息，请参阅 [Amazon Lambda 权限](https://docs.amazonaws.cn/lambda/latest/dg/lambda-permissions.html)。

### 控制台
<a name="USER_ExportSnapshot.ExportConsole"></a>

仅为可导出到 Amazon S3 的快照显示**导出到 Amazon S3** 控制台选项。由于以下原因，快照可能无法导出：
+ 此数据库引擎不支持 S3 导出。
+ 此数据库引擎版本不支持 S3 导出。
+ 创建了快照的 Amazon 区域不支持 S3 导出。

**导出数据库快照**

1. 登录 Amazon Web Services 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.amazonaws.cn/rds/)。

1. 在导航窗格中，选择**快照**。

1. 从选项卡中，选择要导出的快照类型。

1. 在快照列表中，选择要导出的快照。

1. 对于 **Actions (操作)**，选择 **Export to Amazon S3 (导出到 Amazon S3)**。

   此时将显示 **Export to Amazon S3 (导出到 Amazon S3)** 窗口。

1. 对于 **Export identifier (导出标识符)**，输入用于标识导出任务的名称。此值也用于在 S3 存储桶中创建的文件的名称。

1. 选择要导出的数据：
   + 选择 **All (全部)** 可导出快照中的所有数据。
   + 选择 **Partial (部分)** 可导出快照的特定部分。如需标识要导出快照的哪些部分，请为 **Identifiers (标识符)**（以空格分隔）输入一个或多个数据库、架构或表。

     使用以下格式：

     ```
     database[.schema][.table] database2[.schema2][.table2] ... databasen[.scheman][.tablen]
     ```

     例如：

     ```
     mydatabase mydatabase2.myschema1 mydatabase2.myschema2.mytable1 mydatabase2.myschema2.mytable2
     ```

1. 对于 **S3 bucket (S3 存储桶)**，选择要导出到的存储桶。

   要将导出的数据分配给 S3 存储桶中的文件夹路径，请为 **S3 prefix (S3 前缀)** 输入可选路径。

1. 对于 **IAM role (IAM 角色)**，请选择一个角色以授予您对所选 S3 存储桶的写入访问权限，或创建新角色。
   + 如果您按照 [使用 IAM 角色提供对 Amazon S3 存储桶的访问权限](#USER_ExportSnapshot.SetupIAMRole)中的步骤创建了角色，请选择该角色。
   + 如果您没有创建授予您对所选 S3 桶的写入访问权限的角色，则选择 **Create a new role**（创建新角色）来自动创建该角色。接下来，在 **IAM role name (IAM 角色名称)** 中输入角色的名称。

1. 对于 **Amazon KMS key**，输入要用于加密导出数据的密钥的 ARN。

1. 选择 **Export to Amazon S3 (导出到 Amazon S3)**。

### Amazon CLI
<a name="USER_ExportSnapshot.ExportCLI"></a>

要使用 Amazon CLI 将数据库快照导出到 Amazon S3，请使用包含以下所需选项的 [start-export-task](https://docs.amazonaws.cn/cli/latest/reference/rds/start-export-task.html) 命令：
+ `--export-task-identifier` 
+ `--source-arn` 
+ `--s3-bucket-name` 
+ `--iam-role-arn` 
+ `--kms-key-id` 

在以下示例中，快照导出任务名为 *my-snapshot-export*，该任务将快照导出到名为 *amzn-s3-demo-bucket* 的 S3 存储桶。

**Example**  
对于 Linux、macOS 或 Unix：  

```
1. aws rds start-export-task \
2.     --export-task-identifier my-snapshot-export \
3.     --source-arn arn:aws:rds:Amazon_Region:123456789012:snapshot:snapshot-name \
4.     --s3-bucket-name amzn-s3-demo-bucket \
5.     --iam-role-arn iam-role \
6.     --kms-key-id my-key
```
对于：Windows  

```
1. aws rds start-export-task ^
2.     --export-task-identifier my-snapshot-export ^
3.     --source-arn arn:aws:rds:Amazon_Region:123456789012:snapshot:snapshot-name ^
4.     --s3-bucket-name amzn-s3-demo-bucket ^
5.     --iam-role-arn iam-role ^
6.     --kms-key-id my-key
```
示例输出如下。  

```
{
    "Status": "STARTING", 
    "IamRoleArn": "iam-role", 
    "ExportTime": "2019-08-12T01:23:53.109Z", 
    "S3Bucket": "my-export-bucket", 
    "PercentProgress": 0, 
    "KmsKeyId": "my-key", 
    "ExportTaskIdentifier": "my-snapshot-export", 
    "TotalExtractedDataInGB": 0, 
    "TaskStartTime": "2019-11-13T19:46:00.173Z", 
    "SourceArn": "arn:aws:rds:Amazon_Region:123456789012:snapshot:snapshot-name"
}
```
要在 S3 存储桶中为快照导出提供文件夹路径，请在 [start-export-task](https://docs.amazonaws.cn/cli/latest/reference/rds/start-export-task.html) 命令中包含 `--s3-prefix` 选项。

### RDS API
<a name="USER_ExportSnapshot.ExportAPI"></a>

要使用 Amazon RDS API 将数据库快照导出到 Amazon S3，请使用包含以下所需参数的 [StartExportTask](https://docs.amazonaws.cn/AmazonRDS/latest/APIReference/API_StartExportTask.html) 操作：
+ `ExportTaskIdentifier`
+ `SourceArn`
+ `S3BucketName`
+ `IamRoleArn`
+ `KmsKeyId`

## 区域和版本可用性
<a name="USER_ExportSnapshot.RegionVersionAvailability"></a>

功能可用性和支持因每个数据库引擎的特定版本以及 Amazon Web Services 区域而异。有关将快照导出到 S3 的版本和区域可用性的更多信息，请参阅[支持在 Amazon RDS 中将快照导出到 S3 的区域和数据库引擎](Concepts.RDS_Fea_Regions_DB-eng.Feature.ExportSnapshotToS3.md)。

## 限制
<a name="USER_ExportSnapshot.Limits"></a>

将数据库快照数据导出到 Amazon S3 有以下限制：
+ 您不能同时为同一个数据库快照运行多个导出任务。这同时适用于完全导出和部分导出。
+ 不支持从使用磁性存储的数据库导出快照。
+ 导出到 S3 不支持包含冒号（:）的 S3 前缀。
+ 在导出过程中，S3 文件路径中的以下字符将转换为下划线 (\$1)：

  ```
  \ ` " (space)
  ```
+ 如果数据库、架构或表的名称中包含以下字符以外的字符，则不支持部分导出。但是，您可以导出整个数据库快照。
  + 拉丁字母 (A–Z)
  + 数字 (0–9)
  + 美元符号 (\$1)
  + 下划线 (\$1)
+ 数据库表列名不支持空格 ( ) 和某些字符。在导出过程中会跳过列名中包含以下字符的表：

  ```
  , ; { } ( ) \n \t = (space)
  ```
+ 在导出过程中会跳过其名称中包含斜杠 (/) 的表。
+ 在导出期间，将跳过 RDS for PostgreSQL 临时表和未记录的表。
+ 如果数据包含接近或大于 500MB 的大型对象（例如 BLOB 或 CLOB），则导出失败。
+ 如果表中某个大行的大小接近或大于 2GB，则会在导出过程中略过该表。
+ 对于部分导出，`ExportOnly` 列表的最大大小为 200 KB。
+ 强烈建议您为每个导出任务使用唯一的名称。如果您没有使用唯一的任务名称，可能会收到以下错误消息：

  ExportTaskAlreadyExistsFault：调用 StartExportTask 操作时发生错误 (ExportTaskAlreadyExists)：ID 为 *xxxxx* 的导出任务已存在。
+ 您可以在将快照数据导出到 S3 时删除快照，但是在导出任务完成之前，仍需支付该快照的存储成本。
+ 您无法将从 S3 导出的快照数据还原到新的数据库实例，也无法将快照数据从 S3 导入到现有的数据库实例。
+ 每个 Amazon Web Services 账户 最多可以执行五个并发数据库快照导出任务。
+ 要将数据库快照导出到跨账户 Amazon S3 存储桶，必须使用 Amazon CLI 或 RDS API。
+ 在 Amazon RDS 完成导出任务后，您可能需要稍等片刻才能从同一个数据库快照开始另一个导出任务。
+ 您无法导出视图或实体化视图。
+ RDS 导出到 S3 对于 GuardDuty Malware Protection for S3 不支持基于标签的访问控制。