

# 将 Amazon RDS for SQL Server 数据库实例与 Amazon S3 集成
<a name="User.SQLServer.Options.S3-integration"></a>

您可以在运行 Amazon RDS for SQL Server 的数据库实例和 Amazon S3 存储桶之间传输文件。通过执行此操作，您可以结合使用 Amazon S3 和 SQL Server 功能，例如批量插入。例如，您可以将 .csv、.xml、.txt 和其他文件从 Amazon S3 下载到数据库实例主机，并将数据从 `D:\S3\` 导入到数据库中。所有文件都存储在数据库实例上的 `D:\S3\` 中。

适用以下限制：

**注意**  
对于所有使用 S3 的 SQL Server 功能，RDS 主机和 S3 之间的流量通过 RDS 内部 VPC 中的 VPC 端点进行路由。此流量不使用 RDS 实例端点 ENI。S3 存储桶策略无法通过网络条件限制 RDS 流量。
+ 在多可用区实例上进行故障转移后，将在备用副本上删除 `D:\S3` 文件夹中的文件。有关更多信息，请参阅“[S3 集成的多可用区限制](#S3-MAZ)”。
+ 数据库实例和 S3 存储桶必须位于同一 AWS 区域。
+ 如果您一次运行多个 S3 集成任务，则这些任务将按顺序运行，而不是并行运行。
**注意**  
S3 集成任务与本机备份和还原任务共享相同的队列。在此队列中，任何时候最多只能有两个正在进行的任务。因此，两个正在运行的本机备份和还原任务将阻止所有 S3 集成任务。
+ 您必须在已还原的实例上重新启用 S3 集成功能。S3 集成不会从源实例传播到已还原的实例。`D:\S3` 中的文件在还原的实例上被删除。
+ 下载到数据库实例的文件数不能超过 100 个。换句话说，`D:\S3\` 中的文件数不能超过 100 个。
+ 仅支持下载无文件扩展名或具有以下文件扩展名的文件：.abf、.asdatabase、.bcp、configsettings、.csv、.dat、.deploymentoptions、.deploymenttargets、.fmt、.info、.ispac、.lst、.tbl、.txt、.xml 和 .xmla。
+ S3 存储桶必须与相关 AWS Identity and Access Management (IAM) 角色具有同一所有者。因此，不支持跨账户 S3 集成。
+ S3 存储桶不能向公众开放。
+ 从 RDS 上传到 S3 的文件大小限制为每个文件 50 GB。
+ 从 S3 下载到 RDS 的文件大小限制为 S3 支持的最大文件大小。

**Topics**
+ [将 RDS for SQL Server 与 S3 集成的先决条件](Appendix.SQLServer.Options.S3-integration.preparing.md)
+ [启用 RDS for SQL Server 与 S3 的集成](Appendix.SQLServer.Options.S3-integration.enabling.md)
+ [在 RDS for SQL Server 和 Amazon S3 之间传输文件](Appendix.SQLServer.Options.S3-integration.using.md)
+ [列出 RDS 数据库实例上的文件](Appendix.SQLServer.Options.S3-integration.using.listing-files.md)
+ [删除 RDS 数据库实例上的文件](Appendix.SQLServer.Options.S3-integration.using.deleting-files.md)
+ [监控文件传输任务的状态](Appendix.SQLServer.Options.S3-integration.using.monitortasks.md)
+ [取消任务](Appendix.SQLServer.Options.S3-integration.canceltasks.md)
+ [S3 集成的多可用区限制](#S3-MAZ)
+ [禁用 RDS for SQL Server 与 S3 的集成](Appendix.SQLServer.Options.S3-integration.disabling.md)

有关使用 Amazon S3 中的文件的更多信息，请参阅 [Amazon Simple Storage Service 入门](https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3)。

# 将 RDS for SQL Server 与 S3 集成的先决条件
<a name="Appendix.SQLServer.Options.S3-integration.preparing"></a>

在开始之前，请找到或创建要使用的 S3 存储桶。另外，添加权限，以便 RDS 数据库实例可以访问 S3 存储桶。要配置此访问权限，请同时创建 IAM 策略和 IAM 角色。

## 控制台
<a name="Appendix.SQLServer.Options.S3-integration.preparing.console"></a>

**创建用于访问 Amazon S3 的 IAM 策略**

1. 在 [IAM 管理控制台](https://console.aws.amazon.com/iam/home?#home)中，选择导航窗格中的**策略**。

1. 创建新策略，并使用 **Visual editor (可视化编辑器)** 选项卡执行以下步骤。

1. 对于 **Service (服务)**，输入 **S3**，然后选择 **S3** 服务。

1. 对于**操作**，选择以下各项以授予数据库实例所需的访问权限：
   + `ListAllMyBuckets` – 必需
   + `ListBucket` – 必需
   + `GetBucketAcl` – 必需
   + `GetBucketLocation` – 必需
   + `GetObject` – 将文件从 S3 下载到 所必需`D:\S3\`
   + `PutObject` – 将文件从 `D:\S3\` 上传到 S3 所必需
   + `ListMultipartUploadParts` – 将文件从 `D:\S3\` 上传到 S3 所必需
   + `AbortMultipartUpload` – 将文件从 `D:\S3\` 上传到 S3 所必需

1. 对于 **Resources (资源)**，显示的选项取决于您在上一步中选择的操作。您可能会看到针对 **bucket (存储桶)** 和/或 **object (对象)** 的选项。对于其中的每一个，添加适当的 Amazon Resource Name (ARN)。

   对于 **bucket (存储桶)**，为要使用的存储桶添加 ARN。例如，如果存储桶名为 *amzn-s3-demo-bucket*，请将 ARN 设置为 `arn:aws:s3:::amzn-s3-demo-bucket`。

   对于 **object (对象)**，为存储桶输入 ARN，然后选择以下各项之一：
   + 要授予对指定存储桶中所有文件的访问权限，请为 **Bucket name (存储桶名称)** 和 **Object name (对象名称)** 选择 **Any (任何)**。
   + 要授予对存储桶中特定文件或文件夹的访问权限，请提供您希望 SQL Server 访问的特定存储桶和对象的 ARN。

1. 按照控制台中的说明进行操作，直到您完成策略创建。

   前面是设置策略的简要指南。有关创建 IAM 策略的更多详细说明，请参阅 *IAM 用户指南*中的 [创建 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

**创建使用上一过程中的 IAM 策略的 IAM 角色**

1. 在 [IAM 管理控制台](https://console.aws.amazon.com/iam/home?#home)中，选择导航窗格中的**角色**。

1. 创建新的 IAM 角色，然后选择控制台中显示的以下选项：
   + **AWS 服务**
   + **RDS**
   + **RDS – Add Role to Database (将角色添加到数据库**

   然后选择底部的 **Next:Permissions (下一步: 权限)**。

1. 对于 **Attach permissions policies (附加权限策略)**，输入您之前创建的 IAM 策略的名称。然后，从列表中选择该策略。

1. 按照控制台中的说明进行操作，直到您完成角色创建。

   前面是设置角色的简要指南。如果您需要有关创建角色的更多详细说明，请参阅 *IAM 用户指南*中的 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)。

## AWS CLI
<a name="Appendix.SQLServer.Options.S3-integration.preparing.CLI"></a>

要授予 Amazon RDS 对 Amazon S3 存储桶的访问权限，请使用以下过程：

1. 创建向 Amazon RDS 授予对 S3 存储桶的访问权限的 IAM 策略。

1. 创建一个让 Amazon RDS 可代表您访问 S3 存储桶的 IAM 角色。

   有关更多信息，请参阅《IAM 用户指南》**中的[创建向 IAM 用户委派权限的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)。

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

**创建 IAM policy**

包括适当的操作以授予数据库实例所需的访问权限：
+ `ListAllMyBuckets` – 必需
+ `ListBucket` – 必需
+ `GetBucketAcl` – 必需
+ `GetBucketLocation` – 必需
+ `GetObject` – 将文件从 S3 下载到 所必需`D:\S3\`
+ `PutObject` – 将文件从 `D:\S3\` 上传到 S3 所必需
+ `ListMultipartUploadParts` – 将文件从 `D:\S3\` 上传到 S3 所必需
+ `AbortMultipartUpload` – 将文件从 `D:\S3\` 上传到 S3 所必需

1. 以下 AWS CLI 命令使用这些选项创建一个名为 `rds-s3-integration-policy` 的 IAM 策略。该策略授予对名为 *amzn-s3-demo-bucket* 的存储桶的访问权限。  
**Example**  

   对于 Linux、macOS 或 Unix：

   ```
   aws iam create-policy \
   	 --policy-name rds-s3-integration-policy \
   	 --policy-document '{
   	        "Version": "2012-10-17",		 	 	 
   	        "Statement": [
   	            {
   	                "Effect": "Allow",
   	                "Action": "s3:ListAllMyBuckets",
   	                "Resource": "*"
   	            },
   	            {
   	                "Effect": "Allow",
   	                "Action": [
   	                    "s3:ListBucket",
   	                    "s3:GetBucketAcl",
   	                    "s3:GetBucketLocation"
   	                ],
   	                "Resource": "arn:aws:s3:::amzn-s3-demo-bucket"
   	            },
   	            {
   	                "Effect": "Allow",
   	                "Action": [
   	                    "s3:GetObject",
   	                    "s3:PutObject",
   	                    "s3:ListMultipartUploadParts",
   	                    "s3:AbortMultipartUpload"
   	                ],
   	                "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/key_prefix/*"
   	            }
   	        ]
   	    }'
   ```

   对于：Windows

   确保将行尾更改为您的界面支持的行尾（`^` 而不是 `\`）。另外，在 Windows 中，您必须使用 `\` 来转义所有双引号。为了避免需要转义 JSON 中的引号，您可以将其保存到文件中并将该文件作为参数传入。

   首先，创建包含以下权限策略的 `policy.json` 文件：

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

****  

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

------

   然后使用以下命令创建策略：

   ```
   aws iam create-policy ^
        --policy-name rds-s3-integration-policy ^
        --policy-document file://file_path/assume_role_policy.json
   ```

1. 创建策略之后，请记下策略的 Amazon Resource Name (ARN)。后续步骤需要该 ARN。

**创建 IAM 角色**
+ 以下 AWS CLI 命令创建 `rds-s3-integration-role` IAM 角色来实现此目的。  
**Example**  

  对于 Linux、macOS 或 Unix：

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

  对于：Windows

  确保将行尾更改为您的界面支持的行尾（`^` 而不是 `\`）。另外，在 Windows 中，您必须使用 `\` 来转义所有双引号。为了避免需要转义 JSON 中的引号，您可以将其保存到文件中并将该文件作为参数传入。

  首先，创建包含以下策略的 `assume_role_policy.json` 文件：

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Principal": {
                  "Service": [
                      "rds.amazonaws.com"
                  ]
              },
              "Action": "sts:AssumeRole"
          }
      ]
  }
  ```

------

  然后使用以下命令创建 IAM 角色：

  ```
  aws iam create-role ^
       --role-name rds-s3-integration-role ^
       --assume-role-policy-document file://file_path/assume_role_policy.json
  ```  
**Example 使用全局条件上下文键创建 IAM 角色**  

  我们建议在基于资源的策略中使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 和 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 全局条件上下文键，以此限制服务对特定资源的权限。这是防范[混淆代理问题](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)最有效的方法。

  您可以使用这两个全局条件上下文键并让 `aws:SourceArn` 值包含账户 ID。在这种情况下，当 `aws:SourceAccount` 值和 `aws:SourceArn` 值中的账户使用相同策略语句时，确保二者使用相同的账户 ID。
  + 如果您想对单个资源进行跨服务访问，请使用 `aws:SourceArn`。
  + 如果您想允许该账户中的任何资源与跨服务使用操作相关联，请使用 `aws:SourceAccount`。

  在此策略中，请务必使用 `aws:SourceArn` 全局条件上下文键和访问角色资源的完整 Amazon Resource Name (ARN)。对于 S3 集成，请确保包含数据库实例 ARN，如以下示例所示。

  对于 Linux、macOS 或 Unix：

  ```
  aws iam create-role \
  	   --role-name rds-s3-integration-role \
  	   --assume-role-policy-document '{
  	     "Version": "2012-10-17",		 	 	 
  	     "Statement": [
  	       {
  	         "Effect": "Allow",
  	         "Principal": {
  	            "Service": "rds.amazonaws.com"
  	          },
  	         "Action": "sts:AssumeRole",
                  "Condition": {
                      "StringEquals": {
                          "aws:SourceArn":"arn:aws:rds:Region:my_account_ID:db:db_instance_identifier"
                      }
                  }
  	       }
  	     ]
  	   }'
  ```

  对于：Windows

  将全局条件上下文键添加至 `assume_role_policy.json`。

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Principal": {
                  "Service": [
                      "rds.amazonaws.com"
                  ]
              },
              "Action": "sts:AssumeRole",
              "Condition": {
                  "StringEquals": {
                      "aws:SourceArn":"arn:aws:rds:Region:my_account_ID:db:db_instance_identifier"
                  }
              }
          }
      ]
  }
  ```

------

**将 IAM 策略附加到 IAM 角色**
+ 以下 AWS CLI 命令将策略附加到名为 `rds-s3-integration-role` 的角色。将 `your-policy-arn` 替换为您在上一步中记下的策略 ARN。  
**Example**  

  对于 Linux、macOS 或 Unix：

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

  对于：Windows

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

# 启用 RDS for SQL Server 与 S3 的集成
<a name="Appendix.SQLServer.Options.S3-integration.enabling"></a>

在以下部分中，您可以找到如何启用 Amazon S3 与 Amazon RDS for SQL Server 的集成。要使用 S3 集成，您的数据库实例必须与您先前创建的 IAM 角色相关联，然后才能使用 `S3_INTEGRATION` feature-name 参数。

**注意**  
要将 IAM 角色添加到数据库实例，数据库实例的状态必须为 **available**。

## 控制台
<a name="Appendix.SQLServer.Options.S3-integration.enabling.console"></a>

**将您的 IAM 角色与数据库实例关联**

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

1. 选择 RDS for SQL Server 数据库实例名称以显示其详细信息。

1. 在 **Connectivity & security (连接性和安全性)** 选项卡上的 **Manage IAM roles (管理 IAM 角色)** 部分中，为 **Add IAM roles to this instance (向此实例添加 IAM 角色)** 选择要添加的 IAM 角色。

1. 对于 **Feature (功能)**，选择 **S3\$1INTEGRATION**。  
![\[添加 S3_INTEGRATION 角色\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/ora-s3-integration-role.png)

1. 选择 **Add role (添加角色)**。

## AWS CLI
<a name="Appendix.SQLServer.Options.S3-integration.enabling.cli"></a>

**将 IAM 角色添加到 RDS for SQL Server 数据库实例**
+ 以下 AWS CLI 命令将您的 IAM 角色添加到名为 `mydbinstance` 的 RDS for SQL Server 数据库实例中。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds add-role-to-db-instance \
  	   --db-instance-identifier mydbinstance \
  	   --feature-name S3_INTEGRATION \
  	   --role-arn your-role-arn
  ```

  对于 Windows：

  ```
  aws rds add-role-to-db-instance ^
  	   --db-instance-identifier mydbinstance ^
  	   --feature-name S3_INTEGRATION ^
  	   --role-arn your-role-arn
  ```

  将 `your-role-arn` 替换为您在上一步中记下的角色 ARN。必须为 `S3_INTEGRATION` 选项指定 `--feature-name`。

# 在 RDS for SQL Server 和 Amazon S3 之间传输文件
<a name="Appendix.SQLServer.Options.S3-integration.using"></a>

您可以使用 Amazon RDS 存储过程在 Amazon S3 和 RDS 数据库实例之间下载和上传文件。您还可以使用 Amazon RDS 存储过程来列出和删除 RDS 实例上的文件。

您从 S3 下载和上传到 S3 的文件存储在 `D:\S3` 文件夹中。这是可用于访问文件的唯一文件夹。您可以将文件组织到子文件夹中，这些子文件夹是您在下载过程中包含目标文件夹时为您创建的。

某些存储过程要求您向 &S3 存储桶和文件提供 Amazon Resource Name (ARN)。您的 ARN 的格式为 `arn:aws:s3:::amzn-s3-demo-bucket/file_name`。Amazon S3 不需要在 ARN 中使用账号或AWS区域。

S3 集成任务按顺序运行，并且与本机备份和还原任务共用同一队列。在此队列中，任何时候最多只能有两个正在进行的任务。任务可能需要长达五分钟时间才能开始处理。

## 将文件从 Amazon S3 存储桶下载到 SQL Server 数据库实例
<a name="Appendix.SQLServer.Options.S3-integration.using.download"></a>

要将文件从 S3 存储桶下载到 RDS for SQL Server 数据库实例，请使用具有以下参数的 Amazon RDS 存储过程 `msdb.dbo.rds_download_from_s3`。


| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `@s3_arn_of_file`  |  NVARCHAR  |  –  |  必需  |  要下载的文件的 S3 ARN，例如：`arn:aws:s3:::amzn-s3-demo-bucket/mydata.csv`  | 
|  `@rds_file_path`  |  NVARCHAR  |  –  |  可选  |  RDS 实例的文件路径。如果未指定，则文件路径为 `D:\S3\<filename in s3>`。RDS 支持绝对路径和相对路径。如果要创建子文件夹，请将其包含在文件路径中。  | 
|  `@overwrite_file`  |  INT  |  0  |  可选  | 覆盖现有文件： 0 = 不覆盖 1 = 覆盖 | 

您可以下载不带文件扩展名的文件和具有以下文件扩展名的文件：.bcp、.csv、.dat、.fmt、.info、.lst、.tbl、.txt 和 .xml。

**注意**  
启用 SQL Server Integration Services 时，支持下载具有 .ispac 文件扩展名的文件。有关启用 SSIS 的更多信息，请参阅[SQL Server Integration Services](Appendix.SQLServer.Options.SSIS.md)。  
启用 SQL Server Analysis Services 时，支持下载具有以下文件扩展名的文件：.abf、.asdatabase、.configsettings、.deploymentoptions、.deploymenttargets 和 .xmla。有关启用 SSAS 的更多信息，请参阅[SQL Server Analysis Services](Appendix.SQLServer.Options.SSAS.md)。

以下示例显示了从 S3 下载文件的存储过程。

```
exec msdb.dbo.rds_download_from_s3
	    @s3_arn_of_file='arn:aws:s3:::amzn-s3-demo-bucket/bulk_data.csv',
	    @rds_file_path='D:\S3\seed_data\data.csv',
	    @overwrite_file=1;
```

示例 `rds_download_from_s3` 操作在 `seed_data` 中创建一个名为 `D:\S3\` 的文件夹（如果该文件夹尚不存在）。然后，该示例将源文件 `bulk_data.csv` 从 S3 下载到数据库实例上名为 `data.csv` 的新文件。如果以前存在此文件，则会覆盖它，因为 `@overwrite_file` 参数设置为 `1`。

## 将文件从 SQL Server 数据库实例上传到 Amazon S3 存储桶
<a name="Appendix.SQLServer.Options.S3-integration.using.upload"></a>

要将文件从 RDS for SQL Server 数据库实例上传到 S3 存储桶，请使用具有以下参数的 Amazon RDS 存储过程 `msdb.dbo.rds_upload_to_s3`。


| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `@s3_arn_of_file`  |  NVARCHAR  |  –  |  必需  |  要在 S3 中创建的文件的 S3 ARN，例如：`arn:aws:s3:::amzn-s3-demo-bucket/mydata.csv`  | 
|  `@rds_file_path`  |  NVARCHAR  |  –  |  必需  | 要上传到 S3 的文件的文件路径。支持绝对路径和相对路径。 | 
|  `@overwrite_file`  |  INT  |  –  |  可选  |  覆盖现有文件： 0 = 不覆盖 1 = 覆盖  | 

以下示例将名为 `data.csv` 的文件从 `D:\S3\seed_data\` 中的指定位置上传到 ARN 指定的 S3 存储桶中的 `new_data.csv` 文件。

```
exec msdb.dbo.rds_upload_to_s3 
		@rds_file_path='D:\S3\seed_data\data.csv',
		@s3_arn_of_file='arn:aws:s3:::amzn-s3-demo-bucket/new_data.csv',
		@overwrite_file=1;
```

如果 S3 中以前存在此文件，则会覆盖它，因为 @overwrite\$1file 参数设置为 `1`。

# 列出 RDS 数据库实例上的文件
<a name="Appendix.SQLServer.Options.S3-integration.using.listing-files"></a>

要列出数据库实例上可用的文件，请同时使用存储过程和函数。首先，运行以下存储过程来从 `D:\S3\` 中的文件收集文件详细信息。

```
exec msdb.dbo.rds_gather_file_details;
```

此存储过程返回任务的 ID。像其他任务一样，此存储过程异步运行。一旦任务的状态为 `SUCCESS`，您就可以在 `rds_fn_list_file_details` 函数中使用任务 ID 来列出 D:\$1S3\$1 中的现有文件和目录，如下所示。

```
SELECT * FROM msdb.dbo.rds_fn_list_file_details(TASK_ID);
```

`rds_fn_list_file_details` 函数将返回具有以下列的表格。


| 输出参数 | 描述 | 
| --- | --- | 
| filepath | 文件的绝对路径（例如，D:\$1S3\$1mydata.csv） | 
| size\$1in\$1bytes | 文件大小（以字节为单位） | 
| last\$1modified\$1utc | 上次修改日期和时间（采用 UTC 格式） | 
| is\$1directory | 指示项目是否为目录的选项 (true/false) | 

# 删除 RDS 数据库实例上的文件
<a name="Appendix.SQLServer.Options.S3-integration.using.deleting-files"></a>

要删除数据库实例上可用的文件，请使用具有以下参数的 Amazon RDS 存储过程 `msdb.dbo.rds_delete_from_filesystem`。


| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `@rds_file_path`  |  NVARCHAR  |  –  |  必需  | 要删除的文件的文件路径。支持绝对路径和相对路径。 | 
|  `@force_delete`  |  INT  | 0 |  可选  |  要删除目录，必须包含此标志并将其设置为 `1`。 `1` = 删除目录 如果要删除文件，则忽略此参数。  | 

要删除目录，`@rds_file_path` 必须以反斜杠 (`\`) 结尾，并且 `@force_delete` 必须设置为 `1`。

以下示例将删除 `D:\S3\delete_me.txt` 文件。

```
exec msdb.dbo.rds_delete_from_filesystem
    @rds_file_path='D:\S3\delete_me.txt';
```

以下示例将删除 `D:\S3\example_folder\` 目录。

```
exec msdb.dbo.rds_delete_from_filesystem
    @rds_file_path='D:\S3\example_folder\',
    @force_delete=1;
```

# 监控文件传输任务的状态
<a name="Appendix.SQLServer.Options.S3-integration.using.monitortasks"></a>

要跟踪 S3 集成任务的状态，请调用 `rds_fn_task_status` 函数。它获取两个参数。第一个参数应该始终为 `NULL`，因为它不适用于 S3 集成。第二个参数接受任务 ID。

要查看所有任务的列表，请将第一个参数设置为 `NULL`，将第二个参数设置为 `0`，如以下示例所示。

```
SELECT * FROM msdb.dbo.rds_fn_task_status(NULL,0);
```

要获取特定任务，请将第一个参数设置为 `NULL`，将第二个参数设置为任务 ID，如以下示例所示。

```
SELECT * FROM msdb.dbo.rds_fn_task_status(NULL,42);
```

`rds_fn_task_status` 函数将返回以下信息。


|  输出参数  |  描述  | 
| --- | --- | 
|  `task_id`  |  任务的 ID。  | 
|  `task_type`  |  对于 S3 集成，任务可以具有以下任务类型： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/Appendix.SQLServer.Options.S3-integration.using.monitortasks.html)  | 
|  `database_name`  | 不适用于 S3 集成任务。 | 
|  `% complete`  |  用百分比表示的任务进度。  | 
|  `duration(mins)`  |  在任务上花费的时间 (以分钟为单位)。  | 
|  `lifecycle`  |  任务的状态。有以下可能状态： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/Appendix.SQLServer.Options.S3-integration.using.monitortasks.html)  | 
|  `task_info`  |  有关任务的其他信息。如果在处理过程中发生错误，则此列包含有关错误的信息。  | 
|  `last_updated`  |  上次更新任务状态的日期和时间。  | 
|  `created_at`  |  任务的创建日期和时间。  | 
|  `S3_object_arn`  |  从中下载或上传到其中的 S3 对象的 ARN。  | 
|  `overwrite_S3_backup_file`  |  不适用于 S3 集成任务。  | 
|  `KMS_master_key_arn`  |  不适用于 S3 集成任务。  | 
|  `filepath`  |  RDS 数据库实例上的文件路径。  | 
|  `overwrite_file`  |  指示是否覆盖现有文件的选项。  | 
|  `task_metadata`  |  不适用于 S3 集成任务。  | 

# 取消任务
<a name="Appendix.SQLServer.Options.S3-integration.canceltasks"></a>

要取消 S3 集成任务，请使用带有 `msdb.dbo.rds_cancel_task` 参数的 `task_id` 存储过程。无法取消正在进行的删除和列出任务。以下示例显示了取消任务的请求。

```
exec msdb.dbo.rds_cancel_task @task_id = 1234;
```

要获取所有任务及其任务 ID 的概述，请使用`rds_fn_task_status`中介绍的 [监控文件传输任务的状态](Appendix.SQLServer.Options.S3-integration.using.monitortasks.md) 函数。

## S3 集成的多可用区限制
<a name="S3-MAZ"></a>

在多可用区实例上，故障转移之后将删除备用副本上 `D:\S3` 文件夹中的文件。故障转移可以是预先计划的，例如在数据库实例修改（如更改实例类或升级引擎版本）期间。或者，故障转移可能是未计划的，在主实例停机时进行。

**注意**  
我们不建议将 `D:\S3` 文件夹用于文件存储。最佳做法是将创建的文件上传到 Amazon S3 以使其持久，并在需要导入数据时下载文件。

要确定上次故障转移时间，您可以使用 `msdb.dbo.rds_failover_time` 存储过程。有关更多信息，请参阅“[确定 Amazon RDS for SQL Server 的上次失效转移时间](Appendix.SQLServer.CommonDBATasks.LastFailover.md)”。

**Example 最近无故障转移示例**  
此示例显示错误日志中最近没有故障转移的输出。自 2020-04-29 23:59:00.01 以来，没有发生故障转移。  
因此，在该时间之后下载的所有文件，如未使用 `rds_delete_from_filesystem` 存储过程删除，则仍可在当前主机上访问。在该时间之前下载的文件可能也可用。  


| errorlog\$1available\$1from | recent\$1failover\$1time | 
| --- | --- | 
|  2020-04-29 23:59:00.0100000  |  null  | 

**Example 最近故障转移示例**  
此示例显示错误日志中最近有故障转移的输出。最近一次故障转移的时间是在 2020-05-05 18:57:51.89。  
在该时间之后下载的所有文件，如未使用 `rds_delete_from_filesystem` 存储过程删除，则仍可在当前主机上访问。  


| errorlog\$1available\$1from | recent\$1failover\$1time | 
| --- | --- | 
|  2020-04-29 23:59:00.0100000  |  2020-05-05 18:57:51.8900000  | 

# 禁用 RDS for SQL Server 与 S3 的集成
<a name="Appendix.SQLServer.Options.S3-integration.disabling"></a>

在下面，您可以找到如何禁用 Amazon S3 与 Amazon RDS for SQL Server 的集成。禁用 S3 集成时，不会删除 `D:\S3\` 中的文件。

**注意**  
要从数据库实例中删除 IAM 角色，数据库实例的状态必须为 `available`。

## 控制台
<a name="Appendix.SQLServer.Options.S3-integration.disabling.console"></a>

**从数据库实例中取消关联您的 IAM 角色**

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

1. 选择 RDS for SQL Server 数据库实例名称以显示其详细信息。

1. 在 **Connectivity & security (连接性和安全性)** 选项卡上的 **Manage IAM roles (管理 IAM 角色)** 部分中，选择要删除的 IAM 角色。

1. 选择**删除**。

## AWS CLI
<a name="Appendix.SQLServer.Options.S3-integration.disabling.cli"></a>

**从 RDS for SQL Server 数据库实例中删除 IAM 角色**
+ 以下 AWS CLI 命令从名为 `mydbinstance` 的 RDS for SQL Server 数据库实例中删除 IAM 角色。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds remove-role-from-db-instance \
  	   --db-instance-identifier mydbinstance \
  	   --feature-name S3_INTEGRATION \
  	   --role-arn your-role-arn
  ```

  对于 Windows：

  ```
  aws rds remove-role-from-db-instance ^
  	   --db-instance-identifier mydbinstance ^
  	   --feature-name S3_INTEGRATION ^
  	   --role-arn your-role-arn
  ```

  使用 `your-role-arn` 选项的适当 IAM 角色 ARN 替换 `--feature-name`。