将 Amazon RDS for SQL Server 数据库实例与 Amazon S3 集成 - Amazon Relational Database Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

将 Amazon RDS for SQL Server 数据库实例与 Amazon S3 集成

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

适用以下限制:

  • 在多可用区实例上进行故障转移后,将在备用副本上删除 D:\S3 文件夹中的文件。有关更多信息,请参阅 S3 集成的多可用区限制

  • 数据库实例和 S3 存储桶必须位于同一 AWS 区域。

  • S3 集成任务按顺序运行,并且与本机备份和还原任务共用同一队列。在此队列中,任何时候最多只能有两个正在进行的任务。

  • 您必须在已还原的实例上重新启用 S3 集成功能。该功能不会从源实例传播到已还原的实例。将在已还原的实例上清除 D:\S3 中的文件。

  • 下载到数据库实例的文件数不能超过 100 个。换句话说,D:\S3\ 中的文件数不能超过 100 个。

  • 只支持下载没有文件扩展名或具有以下文件扩展名的文件:.xml、.txt、.fmt、.lst、.dat、.csv、.info、.bcp 和 .tbl。

  • S3 存储桶必须与相关 AWS Identity and Access Management (IAM) 角色具有同一所有者。另外,存储桶不能向公众开放。

  • 上传的文件大小限制为每个文件 50GB。

有关使用 Amazon S3 中的文件的更多信息,请参阅 Amazon Simple Storage Service 入门

将 RDS SQL Server 与 S3 集成的先决条件

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

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

  1. IAM 管理控制台中,选择导航窗格中的策略

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

  3. 对于 Service (服务),输入 S3,然后选择 S3 服务。

  4. 对于操作,选择以下各项以授予数据库实例所需的访问权限:

    • ListAllMyBuckets – 必需

    • ListBucket – 必需

    • GetBucketACL – 必需

    • GetBucketLocation – 必需

    • GetObject – 将文件从 S3 下载到 D:\S3\ 所必需

    • PutObject – 将文件从 D:\S3\ 上传到 S3 所必需

    • ListMultipartUploadParts – 将文件从 D:\S3\ 上传到 S3 所必需

    • AbortMultipartUpload – 将文件从 D:\S3\ 上传到 S3 所必需

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

    对于 bucket (存储桶),为要使用的存储桶添加 ARN。例如,如果您的存储桶名为 example-bucket,请将 ARN 设置为 arn:aws-cn:s3:::example-bucket

    对于 object (对象),为存储桶输入 ARN,然后选择以下各项之一:

    • 要授予对指定存储桶中所有文件的访问权限,请为 Bucket name (存储桶名称)Object name (对象名称) 选择 Any (任何)

    • 要授予对存储桶中特定文件或文件夹的访问权限,请提供您希望 SQL Server 访问的特定存储桶和对象的 ARN。

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

    前面是设置策略的简要指南。有关创建 IAM 策略的更多详细说明,请参阅 IAM 用户指南 中的创建 IAM 策略

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

  1. IAM 管理控制台中,选择导航窗格中的角色

  2. 创建新的 IAM 角色,然后选择控制台中显示的以下选项:

    • AWS 产品

    • RDS

    • RDS – Add Role to Database (将角色添加到数据库)

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

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

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

    前面是设置角色的简要指南。如果您需要有关创建角色的更多详细说明,请参阅 IAM 用户指南 中的 IAM 角色

向 Amazon RDS 授予对 Amazon S3 存储桶的访问权限

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

    包括适当的操作以授予数据库实例所需的访问权限:

    • ListAllMyBuckets – 必需

    • ListBucket – 必需

    • GetBucketACL – 必需

    • GetBucketLocation – 必需

    • GetObject – 将文件从 S3 下载到 D:\S3\ 所必需

    • PutObject – 将文件从 D:\S3\ 上传到 S3 所必需

    • ListMultipartUploadParts – 将文件从 D:\S3\ 上传到 S3 所必需

    • AbortMultipartUpload – 将文件从 D:\S3\ 上传到 S3 所必需

    以下 AWS CLI 命令使用这些选项创建名为 rds-s3-integration-policy 的 IAM 策略。它授予访问名为 your-s3-bucket-arn 的存储桶的权限。

    对于 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:::bucket_name" }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:ListMultipartUploadParts", "s3:AbortMultipartUpload" ], "Resource": "arn:aws:s3:::bucket_name/key_prefix/*" } ] }'

    对于 Windows:

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

    首先,创建包含以下权限策略的 policy.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:::bucket_name" }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:ListMultipartUploadParts", "s3:AbortMultipartUpload" ], "Resource": "arn:aws:s3:::bucket_name/key_prefix/*" } ] }

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

    aws iam create-policy ^ --policy-name rds-s3-integration-policy ^ --policy-document file://policy_file_path
  2. 创建策略之后,请记下策略的 Amazon 资源名称 (ARN)。后续步骤需要该 ARN。

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

    以下 AWS CLI 命令创建 rds-s3-integration-role 来实现此目的。

    对于 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 文件:

    { "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://assume_role_policy_file_path

    有关更多信息,请参阅 IAM 用户指南中的创建向 IAM 用户委派权限的角色

  4. 创建 IAM 角色之后,记下该角色的 ARN。后续步骤需要该 ARN。

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

    以下 AWS CLI 命令将策略附加到名为 rds-s3-integration-role 的角色。

    对于 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

    your-policy-arn 替换为您在上一步中记下的策略 ARN。

启用 RDS SQL Server 与 S3 的集成

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

注意

要将 IAM 角色添加到数据库实例,数据库实例的状态必须为 available

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

  1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台:https://console.amazonaws.cn/rds/

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

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

  4. 对于 Feature (功能),选择 S3_INTEGRATION

    
								添加 S3_INTEGRATION 角色
  5. 选择 Add role (添加角色)

将 IAM 角色添加到 RDS SQL Server 数据库实例

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

    对于 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。必须为 --feature-name 选项指定 S3_INTEGRATION

在 RDS SQL Server 和 S3 存储桶之间传输文件

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

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

某些存储过程要求您向 Amazon S3 存储桶和文件提供 Amazon 资源名称 (ARN)。您的 ARN 的格式为 arn:aws:s3:::bucket_name/file_name。Amazon S3 不需要在 ARN 中使用账号或 AWS 区域。

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

将文件从 Amazon S3 存储桶下载到 SQL Server 数据库实例

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

参数名称 数据类型 默认值 是否必需 描述

@s3_arn_of_file

NVARCHAR

必需

要下载的文件的 S3 ARN,例如:arn:aws:s3:::bucket_name/mydata.csv

@rds_file_path

NVARCHAR

可选

RDS 实例的文件路径。如果未指定,则文件路径为 D:\S3\<filename in s3>。RDS 支持绝对路径和相对路径。如果要创建子文件夹,请将其包含在文件路径中。

@overwrite_file

INT

0

可选

覆盖现有文件:

0 = 不覆盖

1 = 覆盖

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

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

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

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

将文件从 SQL Server 数据库实例上传到 Amazon S3 存储桶

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

参数名称 数据类型 默认值 是否必需 描述

@s3_arn_of_file

NVARCHAR

必需

要在 S3 中创建的文件的 S3 ARN,例如:arn:aws:s3:::bucket_name/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:::bucket_name/new_data.csv', @overwrite_file=1;

如果 S3 中以前存在此文件,则会覆盖它,因为 @overwrite_file 参数设置为 1

列出 RDS 数据库实例上的文件

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

exec msdb.dbo.rds_gather_file_details;

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

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

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

输出参数 描述
filepath 文件的绝对路径(例如,D:\S3\mydata.csv
size_in_bytes 文件大小(以字节为单位)
last_modified_utc 上次修改日期和时间(采用 UTC 格式)
is_directory 指示项目是否为目录的选项 (true/false)

删除 RDS 实例上的文件

要删除数据库实例上可用的文件,请使用具有以下参数的 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;

监控文件传输任务的状态

要跟踪 S3 集成任务的状态,请调用 rds_fn_task_status 函数。它获取两个参数。第一个参数应该始终为 NULL,因为它不适用于 S3 集成。第二个参数接受任务 ID。将第二个参数设置为 0 以获取所有任务的结果。

要查看所有任务的列表,请将第一个参数设置为 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 集成,任务可以具有以下任务类型:

  • DOWNLOAD_FROM_S3

  • UPLOAD_TO_S3

  • LIST_FILES_ON_DISK

  • DELETE_FILES_ON_DISK

database_name

不适用于 S3 集成任务。

% complete

用百分比表示的任务进度。

duration(mins)

在任务上花费的时间 (以分钟为单位)。

lifecycle

任务的状态。有以下可能状态:

  • CREATED – 调用 S3 集成存储过程之一后,将创建一个任务并将状态设置为 CREATED

  • IN_PROGRESS – 任务开始后,状态将设置为 IN_PROGRESS。要将状态从 CREATED 更改为 IN_PROGRESS 可能需要最多 5 分钟的时间。

  • SUCCESS – 任务完成后,状态将设置为 SUCCESS

  • ERROR – 如果任务失败,状态将设置为 ERROR。有关错误的更多信息,请参阅 task_info 列。

  • CANCEL_REQUESTED – 调用 rds_cancel_task 后,任务的状态将设置为 CANCEL_REQUESTED

  • CANCELLED – 在成功取消任务后,任务的状态将设置为 CANCELLED

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 集成任务。

取消任务

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

exec msdb.dbo.rds_cancel_task @task_id = 1234;

要获取所有任务及其任务 ID 的概述,请使用监控文件传输任务的状态中介绍的 rds_fn_task_status 函数。

S3 集成的多可用区限制

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

注意

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

要确定上次故障转移时间,您可以使用 msdb.dbo.rds_failover_time 存储过程。有关更多信息,请参阅确定上次故障转移时间

例 最近无故障转移示例

此示例显示错误日志中最近没有故障转移的输出。自 2020-04-29 23:59:00.01 以来,没有发生故障转移。

因此,在该时间之后下载的所有文件,如未使用 rds_delete_from_filesystem 存储过程删除,则仍可在当前主机上访问。在该时间之前下载的文件可能也可用。

errorlog_available_from recent_failover_time

2020-04-29 23:59:00.0100000

null

例 最近故障转移示例

此示例显示错误日志中最近有故障转移的输出。最近一次故障转移的时间是在 2020-05-05 18:57:51.89。

在该时间之后下载的所有文件,如未使用 rds_delete_from_filesystem 存储过程删除,则仍可在当前主机上访问。

errorlog_available_from recent_failover_time

2020-04-29 23:59:00.0100000

2020-05-05 18:57:51.8900000

禁用 RDS SQL Server 与 S3 的集成

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

注意

要从数据库实例中删除 IAM 角色,数据库实例的状态必须为 available

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

  1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台:https://console.amazonaws.cn/rds/

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

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

  4. 选择 Delete

从 RDS SQL Server 数据库实例中删除 IAM 角色

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

    对于 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

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