Amazon S3 集成 - Amazon Relational Database Service

Amazon S3 集成

您可以在 RDS for Oracle 数据库实例和 Amazon S3 存储桶之间传输文件。您可以使用 Amazon S3 与 Oracle Database 集成的功能,例如 Oracle Data Pump。例如,您可以将 Data Pump 文件从 Amazon S3 下载到 RDS for Oracle 数据库实例。有关更多信息,请参阅将数据导入到 Amazon RDS 上的 Oracle

注意

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

为与 Amazon S3 集成的 RDS for Oracle 配置 IAM 权限

若要让 RDS for Oracle 与 Amazon S3 集成,您的数据库实例必须可以访问 Amazon S3 存储桶。数据库实例使用的 Amazon VPC 不需要提供 Amazon S3 终端节点的访问权限。

RDS for Oracle 支持将文件从一个账户中的数据库实例上传到另一账户中的 Amazon S3 存储桶。如果需要其他步骤,将在以下各节中说明这些步骤。

步骤 1:为 Amazon RDS 角色创建 IAM 策略

在此步骤中,您将创建一个 AWS Identity and Access Management(IAM)策略,该策略具有将文件从您的 Amazon S3 存储桶传输到您的 RDS 数据库实例所需的权限。此步骤假定您已创建了 S3 桶。

创建策略前,请记下以下信息:

  • 存储桶的 Amazon 资源名称(ARN)。

  • 您的 AWS KMS 密钥的 ARN,如果您的存储桶使用 SSE-KMS 或 SSE-S3 加密

    注意

    RDS for Oracle 数据库实例无法访问使用 SSE-C 加密的 Amazon S3 桶。

有关更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的使用服务器端加密保护数据

创建 IAM policy 以允许 Amazon RDS 访问 Amazon S3 桶
  1. 打开 IAM 管理控制台

  2. Access management (访问管理) 下,选择 Policies (策略)

  3. 选择创建策略

  4. Visual editor (可视化编辑器) 选项卡上,选择 Choose a service (选择服务),然后选择 S3

  5. 对于 Actions (操作),选择 Expand all (全部展开),然后选择将文件从 Amazon S3 存储桶传输到 Amazon RDS 所需的存储桶权限和对象权限。例如,执行以下操作:

    • 展开 List (列表),然后选择 ListBucket

    • 展开 Read (读取),然后选择 GetObject

    • 展开 Write(写入),然后选择PutObjectDeleteObject

    • 展开 Permissions management(权限管理),然后选择PutObjectAcl。如果您计划将文件上传到其他账户拥有的存储桶,并且此账户需要完全控制存储桶内容,则需要此权限。

    对象权限是 Amazon S3 中的对象操作的权限。您必须为存储桶中的对象而不是存储桶本身授予这些权限。有关更多信息,请参阅对象操作权限

  6. 选择资源,然后执行以下操作:

    1. 选择特定

    2. 对于,选择添加 ARN。输入桶 ARN。桶名称会自动填入。然后,选择 Add (添加)

    3. 如果显示了对象资源,请选择添加 ARN 以手动添加资源,或者选择任意

      注意

      您可以将 Amazon 资源名称 (ARN) 设置为更具体的 ARN 值,以允许 Amazon RDS 仅访问 Amazon S3 存储桶中的特定文件或文件夹。有关如何为 Amazon S3 定义访问策略的更多信息,请参阅管理您的 Amazon S3 资源的访问权限

  7. (可选)选择 Add additional permissions (添加其他权限),向策略中添加资源。例如,执行以下操作:

    1. 如果您的存储桶使用自定义 KMS 密钥加密,请为该服务选择 KMS

    2. 对于手动操作,请选择以下选项:

      • Encrypt

      • 重新加密起点重新加密终点

      • Decrypt

      • DescribeKey

      • GenerateDataKey

    3. 对于资源,选择特定

    4. 对于密钥,选择添加 ARN。输入自定义密钥的 ARN 作为资源,然后选择添加

      有关更多信息,请参阅 Amazon Simple Storage Service 用户指南中的使用在 AWS Key Management Service (SSE-KMS) 中存储 KMS 密钥的服务器端加密保护数据

    5. 如果想要 Amazon RDS 访问其他存储桶,请为这些存储桶添加 ARN。您也可以根据需要授予访问 Amazon S3 中所有存储桶和对象的权限。

  8. 选择 Next: Tags (下一步: 标签),然后选择 Next: Review (下一步: 审核)

  9. 对于 Name (名称),请为您的 IAM 策略输入名称,例如 rds-s3-integration-policy。在创建 IAM 角色与您的数据库实例关联时,需要使用此名称。您也可以添加可选的 Description (描述) 值。

  10. 选择创建策略

创建向 Amazon RDS 授予对 Amazon S3 存储桶的访问权限的 AWS Identity and Access Management(IAM)策略。创建策略后,请记下策略的 ARN。后续步骤需要该 ARN。

根据所需的访问类型,在策略中包括适合的操作:

  • GetObject – 从 Amazon S3 存储桶向 Amazon RDS 传输文件所必需的。

  • ListBucket – 从 Amazon S3 存储桶向 Amazon RDS 传输文件所必需的。

  • PutObject – 从 Amazon RDS 向 Amazon 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": [ { "Sid": "s3integration", "Action": [ "s3:GetObject", "s3:ListBucket", "s3:PutObject" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::your-s3-bucket-arn", "arn:aws:s3:::your-s3-bucket-arn/*" ] } ] }'

以下示例包含自定义 KMS 密钥的权限。

aws iam create-policy \ --policy-name rds-s3-integration-policy \ --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Sid": "s3integration", "Action": [ "s3:GetObject", "s3:ListBucket", "s3:PutObject", "kms:Decrypt", "kms:Encrypt", "kms:ReEncrypt", "kms:GenerateDataKey", "kms:DescribeKey", ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::your-s3-bucket-arn", "arn:aws:s3:::your-s3-bucket-arn/*", "arn:aws:kms:::your-kms-arn" ] } ] }'

对于 Windows:

aws iam create-policy ^ --policy-name rds-s3-integration-policy ^ --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Sid": "s3integration", "Action": [ "s3:GetObject", "s3:ListBucket", "s3:PutObject" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::your-s3-bucket-arn", "arn:aws:s3:::your-s3-bucket-arn/*" ] } ] }'

以下示例包含自定义 KMS 密钥的权限。

aws iam create-policy ^ --policy-name rds-s3-integration-policy ^ --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Sid": "s3integration", "Action": [ "s3:GetObject", "s3:ListBucket", "s3:PutObject", "kms:Decrypt", "kms:Encrypt", "kms:ReEncrypt", "kms:GenerateDataKey", "kms:DescribeKey", ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::your-s3-bucket-arn", "arn:aws:s3:::your-s3-bucket-arn/*", "arn:aws:kms:::your-kms-arn" ] } ] }'

步骤 2:(可选)为 Amazon S3 存储桶创建 IAM 策略

只有在以下情况下才需要此步骤:

  • 您计划从一个账户(账户 A)将文件上传到 Amazon S3 存储桶,然后从另一个账户(账户 B)访问它们。

  • 账户 B 拥有该存储桶。

  • 账户 B 需要完全控制加载到存储桶中的对象。

如果上述条件不适用于您,请跳至步骤 3:为您的数据库实例创建 IAM 角色并附加策略

要创建存储桶策略,请确保您具备以下各项:

  • 账户 A 的账户 ID

  • 账户 A 的用户名

  • 账户 B 中 Amazon S3 存储桶的 ARN 值

创建或编辑存储桶策略
  1. 登录到 AWS Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. Buckets (存储桶) 列表中,请选择要为其创建或编辑存储桶策略的存储桶的名称。

  3. 选择权限

  4. Bucket policy (存储桶策略) 下,请选择 Edit (编辑)。这将打开编辑存储桶策略页面。

  5. Edit bucket policy(编辑存储桶策略)页面上,探索《Amazon S3 用户指南》中的 Policy examples(策略示例),选择 Policy generator(策略生成器)自动生成策略,或者在 Policy(策略)部分编辑 JSON。

    如果选择 Policy generator(策略生成器)则 AWS 策略生成器将在新的窗口中打开。

    1. AWS 策略生成器页面,在 Select Type of Policy(选择策略类型)中,请选择 S3 存储桶Policy(S3 存储桶策略)。

    2. 通过在提供的字段中输入信息来添加语句,然后选择 Add Statement(添加语句)。对所有您想添加的语句重复执行此操作。有关这些字段的更多信息,请参阅 IAM 用户指南中的 IAM JSON 策略元素参考

      注意

      为方便起见,Edit bucket policy(编辑存储桶策略)页面会在 Policy(策略)文本字段上方显示当前存储桶的 Bucket ARN (Amazon 资源名称)。您可以复制此 ARN,以便在 AWS 策略生成器页面上的语句中使用。

    3. 添加完语句后,请选择生成策略

    4. 复制生成的策略文本,请选择 Close(关闭),然后返回到 Amazon S3 控制台中的 Edit bucket policy(编辑存储桶策略)页面。

  6. Policy(策略)框中,编辑现有策略或从策略生成器粘贴存储桶策略。确保在保存策略之前解决安全警告、错误、一般警告和建议。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "Example permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::account-A-ID:account-A-user" }, "Action": [ "s3:PutObject", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::account-B-bucket-arn", "arn:aws:s3:::account-B-bucket-arn/*" ] } ] }
  7. 请选择 Save changes(保存更改),此操作将让您返回到存储桶权限页面。

步骤 3:为您的数据库实例创建 IAM 角色并附加策略

此步骤假定您已在步骤 1:为 Amazon RDS 角色创建 IAM 策略中创建了 IAM 策略。在此步骤中,您将为 RDS for Oracle 数据库实例创建一个角色,然后将策略附加到该角色。

创建 IAM 角色以允许 Amazon RDS 访问 Amazon S3 桶
  1. 打开 IAM 管理控制台

  2. 在导航窗格中,选择角色

  3. 选择 Create role(创建角色)。

  4. 选择 AWS 服务

  5. 对于其他 AWS 服务的使用案例:,选择 RDS,然后选择 RDS – 向数据库添加角色。然后选择下一步

  6. 对于权限策略下面的搜索,请输入您在步骤 1:为 Amazon RDS 角色创建 IAM 策略中创建的 IAM policy 的名称,然后当策略在列表中显示时选择该策略。然后选择下一步

  7. 对于角色名称,输入 IAM 角色的名称,例如 rds-s3-integration-role。您也可以添加可选的描述值。

  8. 选择 Create role(创建角色)。

创建一个角色并向该角色附加策略
  1. 创建一个让 Amazon RDS 可代表您访问 Amazon S3 存储桶的 IAM 角色。

    我们建议在基于资源的信任关系中使用 aws:SourceArnaws:SourceAccount 全局条件上下文键,以此限制服务对特定资源的权限。这是防范混淆代理问题最有效的方法。

    您可以使用这两个全局条件上下文键并让 aws:SourceArn 值包含账户 ID。在这种情况下,当 aws:SourceAccount 值和 aws:SourceArn 值中的账户使用相同策略语句时,确保二者使用相同的账户 ID。

    • 如果您想对单个资源进行跨服务访问,请使用 aws:SourceArn

    • 如果您想允许该账户中的任何资源与跨服务使用操作相关联,请使用 aws:SourceAccount

    在信任关系中,请务必使用 aws:SourceArn 全局条件上下文键和访问角色资源的完整 Amazon Resource Name (ARN)。

    以下 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", "Condition": { "StringEquals": { "aws:SourceAccount": my_account_ID, "aws:SourceArn": "arn:aws:rds:Region:my_account_ID:db:dbname" } } } ] }'

    对于 Windows:

    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:SourceAccount": my_account_ID, "aws:SourceArn": "arn:aws:rds:Region:my_account_ID:db:dbname" } } } ] }'

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

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

  3. 将您创建的策略附在您创建的角色上。

    以下 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。

步骤 4:将您的 IAM 角色与 RDS for Oracle 数据库实例关联

配置进行 Amazon S3 集成的权限的最后一步是将您的 IAM 角色与数据库实例相关联。请注意以下要求:

  • 您必须具有访问 IAM 角色的权限,并向此角色附加所需的 Amazon S3 权限策略。

  • 您一次只能将一个 IAM 角色与 RDS for Oracle 数据库实例关联。

  • 数据库实例必须处于可用状态。

将您的 IAM 角色与 RDS for Oracle 数据库实例关联
  1. 登录 AWS Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

  2. 从导航窗格中选择 Databases (数据库)

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

  4. Connectivity & security(连接性和安全性)选项卡上,向下滚动到页面底部的 Manage IAM roles(管理 IAM 角色)部分。

  5. 对于向此实例添加 IAM 角色,选择您在步骤 3:为您的数据库实例创建 IAM 角色并附加策略中创建的角色。

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

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

以下 AWS CLI 命令将角色添加到名为 mydbinstance 的 Oracle 数据库实例。

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

添加 Amazon S3 集成选项

要将 Amazon RDS for Oracle 与 Amazon S3 集成,您的数据库实例必须与包括 S3_INTEGRATION 选项的选项组关联。

为 Amazon S3 集成配置选项组
  1. 创建新选项组或识别现有选项组,然后您可以将 S3_INTEGRATION 选项添加到其中。

    有关创建选项组的信息,请参阅 创建选项组

  2. S3_INTEGRATION 选项添加到该选项组。

    有关向选项组添加选项的信息,请参阅 将选项添加到选项组

  3. 创建新的 RDS for Oracle 数据库实例并将选项组与其关联,或者修改要将选项组与其关联的 RDS for Oracle 数据库实例。

    有关创建数据库实例的信息,请参阅创建 Amazon RDS 数据库实例

    有关修改 数据库实例的信息,请参阅。修改 Amazon RDS 数据库实例

为 Amazon S3 集成配置选项组
  1. 创建新选项组或识别现有选项组,然后您可以将 S3_INTEGRATION 选项添加到其中。

    有关创建选项组的信息,请参阅 创建选项组

  2. S3_INTEGRATION 选项添加到该选项组。

    例如,以下 AWS CLI 命令将 S3_INTEGRATION 选项添加到名为 myoptiongroup 的选项组。

    对于 Linux、macOS 或 Unix:

    aws rds add-option-to-option-group \ --option-group-name myoptiongroup \ --options OptionName=S3_INTEGRATION,OptionVersion=1.0

    对于 Windows:

    aws rds add-option-to-option-group ^ --option-group-name myoptiongroup ^ --options OptionName=S3_INTEGRATION,OptionVersion=1.0
  3. 创建新的 RDS for Oracle 数据库实例并将选项组与其关联,或者修改要将选项组与其关联的 RDS for Oracle 数据库实例。

    有关创建数据库实例的信息,请参阅创建 Amazon RDS 数据库实例

    有关修改 RDS for Oracle 数据库实例的信息,请参阅修改 Amazon RDS 数据库实例

在 Amazon RDS for Oracle 和 Amazon S3 存储桶之间传输文件

要在 RDS for Oracle 数据库实例和 Amazon S3 桶之间传输文件,您可以使用 Amazon RDS 软件包 rdsadmin_s3_tasks。您可以在上传文件时使用 GZIP 压缩文件,并在下载时解压缩它们。

文件传输功能的要求和限制

在您的数据库实例和 Amazon S3 存储桶之间传输文件之前,请注意以下事项:

  • rdsadmin_s3_tasks 软件包传输位于单个目录中的文件。您不能在传输中包括子目录。

  • Amazon S3 存储桶中的最大对象大小为 5 TB。

  • rdsadmin_s3_tasks 创建的任务以异步方式运行。

  • 您可以从 Data Pump 目录(例如 DATA_PUMP_DIR)或用户创建的任何目录上传文件。您不能从 Oracle 后台进程使用的目录(例如 adumpbdumptrace 目录)上传文件。

  • 对于 download_from_s3,每次过程调用的下载限制为 2000 个文件。如果您需要从 Amazon S3 下载超过 2000 个文件,请将您的下载分成多个单独的操作,每个过程调用不超过 2000 个文件。

  • 如果您的下载文件夹中存在文件,并且您尝试下载同名的文件,download_from_s3 将跳过下载。要从下载目录中移除文件,请使用 PL/SQL 过程 UTL_FILE.FREMOVE

将文件从 RDS for Oracle 数据库实例上传到 Amazon S3 存储桶

要将文件从数据库实例上传到 Amazon S3 存储桶,请使用 rdsadmin.rdsadmin_s3_tasks.upload_to_s3 过程。例如,您可以上传 Oracle Recovery Manager(RMAN)备份文件或 Oracle Data Pump 文件。有关使用对象的更多信息,请参阅 Amazon Simple Storage Service 用户指南。有关执行 RMAN 备份的更多信息,请参阅 执行 Oracle 数据库实例的常见 RMAN 任务

rdsadmin.rdsadmin_s3_tasks.upload_to_s3 过程具有以下参数。

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

p_bucket_name

VARCHAR2

必需

要将文件上传到其中的 Amazon S3 存储桶的名称。

p_directory_name

VARCHAR2

必需

要从其中上传文件的 Oracle 目录对象的名称。该目录可以是用户创建的任何目录对象或 Data Pump 目录,例如 DATA_PUMP_DIR。您不能从后台进程使用的目录(例如 adumpbdumptrace)上传文件。

注意

您只可以从指定目录上传文件。您不能上传指定目录的子目录中的文件。

p_s3_prefix

VARCHAR2

必需

待上传文件的 Amazon S3 文件名前缀。如果前缀为空,则将所有文件上传到指定 Amazon S3 存储桶的最顶层,且不为文件名添加前缀。

例如,如果前缀为 folder_1/oradb,则文件上传到 folder_1。在这个例子中,oradb 前缀添加到每个文件。

p_prefix

VARCHAR2

必需

一个文件名前缀,文件名必须与其匹配才会上传。如果前缀为空,则将所有文件上传到指定目录。

p_compression_level

NUMBER

0

可选

GZIP 压缩级别。有效值范围为 09

  • 0 – 不压缩

  • 1 – 最快压缩

  • 9 – 最高压缩比

p_bucket_owner_full_control

VARCHAR2

可选

存储桶的访问控制设置。有效值仅为 null 和 FULL_CONTROL。仅当您从一个账户(账户 A)将文件上传到另一账户(账户 B)拥有的存储桶,并且账户 B 需要完全控制这些文件时,才需要此设置。

rdsadmin.rdsadmin_s3_tasks.upload_to_s3 过程的返回值是任务 ID。

下面的示例将 DATA_PUMP_DIR 目录中的所有文件上传到名为 mys3bucket 的 Amazon S3 存储桶。文件不会被压缩。

SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3( p_bucket_name => 'mys3bucket', p_prefix => '', p_s3_prefix => '', p_directory_name => 'DATA_PUMP_DIR') AS TASK_ID FROM DUAL;

下面的示例将 db 目录中前缀为 DATA_PUMP_DIR 的所有文件上传到名为 mys3bucket 的 Amazon S3 存储桶。Amazon RDS 将最高级别的 GZIP 压缩应用于这些文件。

SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3( p_bucket_name => 'mys3bucket', p_prefix => 'db', p_s3_prefix => '', p_directory_name => 'DATA_PUMP_DIR', p_compression_level => 9) AS TASK_ID FROM DUAL;

下面的示例将 DATA_PUMP_DIR 目录中的所有文件上传到名为 mys3bucket 的 Amazon S3 存储桶。文件上传到 dbfiles 文件夹。在此示例中,GZIP 压缩级别为 1,这是速度最快的压缩级别。

SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3( p_bucket_name => 'mys3bucket', p_prefix => '', p_s3_prefix => 'dbfiles/', p_directory_name => 'DATA_PUMP_DIR', p_compression_level => 1) AS TASK_ID FROM DUAL;

下面的示例将 DATA_PUMP_DIR 目录中的所有文件上传到名为 mys3bucket 的 Amazon S3 存储桶。文件上传到 dbfiles 文件夹,且 ora 添加到每个文件名的开头。不应用压缩。

SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3( p_bucket_name => 'mys3bucket', p_prefix => '', p_s3_prefix => 'dbfiles/ora', p_directory_name => 'DATA_PUMP_DIR') AS TASK_ID FROM DUAL;

以下示例假定该命令在账户 A 中运行,但账户 B 需要完全控制存储桶内容。命令 rdsadmin_s3_tasks.upload_to_s3s3bucketOwnedByAccountB 目录中的所有文件传输到名为 DATA_PUMP_DIR 的存储桶。访问控制设置为 FULL_CONTROL,以便账户 B 可以访问存储桶中的文件。GZIP 压缩级别为 6,它可平衡速度和文件大小。

SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3( p_bucket_name => 's3bucketOwnedByAccountB', p_prefix => '', p_s3_prefix => '', p_directory_name => 'DATA_PUMP_DIR', p_bucket_owner_full_control => 'FULL_CONTROL', p_compression_level => 6) AS TASK_ID FROM DUAL;

在每个示例中,SELECT 语句返回 VARCHAR2 数据类型的任务 ID。

您可以通过显示任务的输出文件来查看结果。

SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-task-id.log'));

task-id 替换为由此过程返回的任务 ID。

注意

任务以异步方式执行。

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

要将文件从 Amazon S3 桶下载到 RDS for Oracle 实例,请使用 Amazon RDS 过程 rdsadmin.rdsadmin_s3_tasks.download_from_s3

download_from_s3 过程具有以下参数。

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

p_bucket_name

VARCHAR2

必需

要从中下载文件的 Amazon S3 存储桶的名称。

p_directory_name

VARCHAR2

必需

要将文件下载到其中的 Oracle 目录对象的名称。该目录可以是用户创建的任何目录对象或 Data Pump 目录,例如 DATA_PUMP_DIR

p_error_on_zero_downloads

VARCHAR2

FALSE

可选

一个标志,用于确定当 Amazon S3 桶中没有与前缀匹配的对象时,任务是否引发错误。如果此参数未设置或设置为 FALSE(原定设置),则任务会输出一条消息,指出未找到任何对象,但不会引发异常或失败。如果此参数为 TRUE,则任务会引发异常并失败。

可能无法通过匹配测试的前缀规范的示例包括前缀中的空格(如在 ' import/test9.log' 中)和大小写不匹配(如在 test9.logtest9.LOG 中)。

p_s3_prefix

VARCHAR2

必需

一个文件名前缀,文件名必须与其匹配才会下载。使用空前缀将下载指定 Amazon S3 存储桶中的所有顶级文件,但不包括存储桶中文件夹内的文件。

该过程仅从匹配前缀的第一级文件夹下载 Amazon S3 对象。匹配指定前缀的嵌套目录结构不会下载。

例如,假定 Amazon S3 存储桶拥有文件夹结构 folder_1/folder_2/folder_3。您可以指定 'folder_1/folder_2/' 前缀。在这种情况下,只会下载 folder_2 中的文件,不会下载 folder_1folder_3 中的文件。

如果您改为指定 'folder_1/folder_2' 前缀,则将下载 folder_1 中与 'folder_2' 前缀匹配的所有文件,不下载 folder_2 中的文件。

p_decompression_format

VARCHAR2

可选

解压缩格式。不解压缩时有效值为 NONE;解压缩时有效值为 GZIP

rdsadmin.rdsadmin_s3_tasks.download_from_s3 过程的返回值是任务 ID。

下面的示例将名为 mys3bucket 的 Amazon S3 桶中的所有文件下载到 DATA_PUMP_DIR 目录。这些文件没有被压缩,因此不会应用解压缩。

SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3( p_bucket_name => 'mys3bucket', p_directory_name => 'DATA_PUMP_DIR') AS TASK_ID FROM DUAL;

下面的示例将名为 db 的 Amazon S3 存储桶中前缀为 mys3bucket 的所有文件下载到 DATA_PUMP_DIR 目录。这些文件是用 GZIP 压缩的,因此将应用解压缩。参数 p_error_on_zero_downloads 开启前缀错误检查,因此,如果前缀与桶中的任何文件都不匹配,则任务会引发异常并失败。

SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3( p_bucket_name => 'mys3bucket', p_s3_prefix => 'db', p_directory_name => 'DATA_PUMP_DIR', p_decompression_format => 'GZIP', p_error_on_zero_downloads => 'TRUE') AS TASK_ID FROM DUAL;

下面的示例将名为 myfolder/ 的 Amazon S3 存储桶中的 mys3bucket 文件夹中的所有文件下载到 DATA_PUMP_DIR 目录。使用 p_s3_prefix 参数来指定 Amazon S3 文件夹。上传的文件使用 GZIP 压缩,但在下载期间不会解压缩。

SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3( p_bucket_name => 'mys3bucket', p_s3_prefix => 'myfolder/', p_directory_name => 'DATA_PUMP_DIR', p_decompression_format => 'NONE') AS TASK_ID FROM DUAL;

以下示例会将名为 mys3bucket 的 Amazon S3 存储桶中的所有文件 mydumpfile.dmp 下载到 DATA_PUMP_DIR 目录。不应用解压缩。

SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3( p_bucket_name => 'mys3bucket', p_s3_prefix => 'mydumpfile.dmp', p_directory_name => 'DATA_PUMP_DIR') AS TASK_ID FROM DUAL;

在每个示例中,SELECT 语句返回 VARCHAR2 数据类型的任务 ID。

您可以通过显示任务的输出文件来查看结果。

SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-task-id.log'));

task-id 替换为由此过程返回的任务 ID。

注意

任务以异步方式执行。

您可以使用 UTL_FILE.FREMOVE Oracle 过程从目录中删除文件。有关更多信息,请参阅 Oracle 文档中的 FREMOVE 过程

监控文件传输的状态

文件传输任务开始和结束时会发布 Amazon RDS 事件。事件消息包含文件传输的任务 ID。有关查看事件的信息,请参阅 查看 Amazon RDS 事件

您可以查看 bdump 文件中的持续任务的状态。bdump 文件位于 /rdsdbdata/log/trace 目录下。每个 bdump 文件名称格式如下。

dbtask-task-id.log

task-id 替换为您想要监控的任务的 ID。

注意

任务以异步方式执行。

您可以使用 rdsadmin.rds_file_util.read_text_file 存储过程查看 bdump 文件的内容。例如,以下查询将返回 dbtask-1234567890123-1234.log bdump 文件的内容。

SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-1234567890123-1234.log'));

以下示例显示传输失败的日志文件。

TASK_ID -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1234567890123-1234 TEXT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 2023-04-17 18:21:33.993 UTC [INFO ] File #1: Uploading the file /rdsdbdata/datapump/A123B4CDEF567890G1234567890H1234/sample.dmp to Amazon S3 with bucket name mys3bucket and key sample.dmp. 2023-04-17 18:21:34.188 UTC [ERROR] RDS doesn't have permission to write to Amazon S3 bucket name mys3bucket and key sample.dmp. 2023-04-17 18:21:34.189 UTC [INFO ] The task failed.

排查 Amazon S3 集成问题

有关问题排查提示,请参阅 AWS re:Post 文章如何排查将 Amazon RDS for Oracle 与 Amazon S3 集成时出现的问题?

删除 Amazon S3 集成选项

您可以从数据库实例中删除 Amazon S3 集成选项。

要从数据库实例中删除 Amazon S3 集成选项,请执行下列操作之一:

  • 要从多个数据库实例中删除 Amazon S3 集成选项,请从数据库实例所属的选项组中删除 S3_INTEGRATION 选项。此更改会影响使用该选项组的所有数据库实例。有关更多信息,请参阅从选项组中删除选项

  • 要从单个数据库实例中删除 Amazon S3 集成选项,请修改该实例,并指定不包含 S3_INTEGRATION 选项的另一个选项组。您可以指定默认(空)选项组,或指定其他自定义选项组。有关更多信息,请参阅 修改 Amazon RDS 数据库实例