如何在我将 Amazon RDS for Oracle 与 Amazon S3 集成时排查问题?

上次更新日期:2021 年 10 月 29 日

在将 Amazon Relational Database Service (Amazon RDS) for Oracle 与 Amazon Simple Storage Service (Amazon S3) 集成时,我想要排查问题和错误。

简短描述

当您在 Amazon RDS for Oracle 数据库实例与 Amazon S3 存储桶之间传输文件时,请确保以下几点:

  • 数据库实例和 S3 存储桶位于同一 AWS 区域中。
  • 数据库实例具有对 S3 存储桶所需的访问权限。
  • 数据库实例与包含 S3_INTEGRATION 选项的选项组关联。
  • 您只能从 Oracle 目录对象上载文件。此目录可能是用户创建的目录或 DATA_PUMP_DIR 目录。
  • 如果您使用的是用户创建的目录,则执行上载和下载的用户必须具有对该目录的必要读写权限。有关更多信息,请参阅向用户授予对源数据库的权限
  • 如果要在子目录中复制数据,请在使用 rdsadmin 软件包时明确指定子目录的名称。您无法使用 S3_INTEGRATION 选项复制子目录。

解决方法

确保数据库实例具有对 S3 存储桶所需的访问权限

要检查您的数据库实例是否拥有具有从 S3 上载和下载的最低权限的 AWS Identity and Access Management (IAM) 角色,请执行以下操作:

  1. 打开 Amazon RDS 控制台
  2. 在导航窗格中,选择 Databases(数据库)。
  3. 选择您要检查的数据库实例。
  4. 选择 Connectivity & security(连接与安全)选项卡。
  5. 向下滚动到 Manage IAM roles(管理 IAM 角色)部分,以检查您是否拥有具有以下权限的活动 IAM 角色:
    S3:ListBucket
    S3:PutObject
    S3:GetObject

您还可以使用 AWS Command Line Interface (AWS CLI) 命令 describe-db-instances 来检查数据库实例是否拥有具有以下最低权限的 IAM 角色:

aws rds describe-db-instances \
--db-instance-identifier example-db-instance \
--query 'DBInstances[*].[AssociatedRoles[*]]'
注意:如果在运行 AWS CLI 命令时遇到错误, 请确保您使用的是最新版本的 AWS CLI

检查 IAM 角色是否存在后,根据您的发现执行以下任一操作:

  • 如果 IAM 角色存在,但没有这些最低权限,请修改该角色以包含这些权限。
  • 如果您没有具有所需权限的 IAM 角色,请创建一个具有将文件从 S3 存储桶传输到 Amazon RDS 所需的权限的 IAM 策略。有关更多信息,请参阅 Amazon RDS for Oracle 与 Amazon S3 集成的先决条件。创建 IAM 策略时,请务必向存储桶添加存储桶级别的权限,向对象添加对象级别权限。

如果存储桶权限问题仍然存在,请修改 IAM 角色以授予对 S3 存储桶的完全访问权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::example-bucket/*",
                "arn:aws:s3:::example-bucket"
            ]
        }
    ]
}

重要提示:修改 IAM 角色以仅授予完全访问权限,从而测试问题是否因 IAM 权限而导致。问题解决后,根据需要调整自定义权限。

要将文件上传到 S3 中的指定文件夹,请使用 rdsadmin.rdsadmin_s3_tasks.upload_to_s3 程序中的 p_s3_prefix 参数。在上载文件之前,请确保您拥有所需的权限。

例如,要将文件上载到 S3 存储桶 example-bucketexample-folder 文件夹中,请附加以下 IAM 策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::example-bucket/example-folder/*"
            ]
        }
    ]
}

确保数据库实例与包含 S3_INTERNATION 选项的选项组关联

要检查您的 RDS 数据库实例是否附加了选项组,请执行以下操作:

  1. 打开 Amazon RDS 控制台
  2. 在导航窗格中,选择 Databases(数据库)。
  3. 选择您要检查的数据库实例。
  4. 选择 Configuration(配置)选项卡。
  5. 记下 Option groups(选项组)参数。

如果此选项组不处于有效状态,而您正在尝试添加 S3_INTEGRATION 选项,则无法成功添加该选项。因此,请确保选项组处于有效状态。

要检查此选项组是否处于有效状态,请运行以下 AWS CLI 命令:

aws rds describe-db-instances \
--db-instance-identifier example-db-instance \
--query 'DBInstances[*].[OptionGroupMemberships[*]]'

如果选项组未处于有效状态,请选择数据库的 Logs & events(日志与事件)选项卡,然后向下滚动到 Recent events(最近发生的事件)部分。确定使选项组无效的组件,然后从数据库中删除此组件。

如果选项组处于有效状态,则检查选项组中是否包含 S3_INTEGRATION 选项。有关更多信息,请参阅列出选项组的选项和选项设置。如果选项组中未包含 S3_INTEGRATION 选项,则添加该选项。有关更多信息,请参阅添加 Amazon S3 集成选项

注意:如果 S3_INTEGRATION 选项未添加到数据库实例中,则会收到错误 ORA-00904: "RDSADMIN"."RDSADMIN_S3_TASKS"."UPLOAD_TO_S3": invalid identifier”。此错误表示没有在数据库实例上创建上载和下载所需的过程。

向 Amazon RDS 添加 S3_INTEGRATION 选项不会导致停机。如果您计划使用 Apply Immediately(立即应用)选项,请确保没有待执行的维护操作。如果有任何待处理的操作,这些操作将与 S3 集成一起应用。有关更多信息,请参阅维护数据库实例

确保仅从用户创建的 Oracle 目录对象或 DATA_PUMP_DIR 目录上载/下载文件

您无法直接在数据库实例中访问 S3 文件。要访问这些文件,必须将文件复制到 RDS 主机中的目录中才能访问它。要将文件从数据库实例上载/下载到 S3 存储桶,请执行以下操作:

  1. 要将 Amazon RDS 中的导出文件复制到 S3,请务必在 DATA_DUMP_DIR 或自定义目录中使用 expdp 命令或 dbms_datapump API 创建转储文件。然后,使用 rdsadmin.rdsadmin_s3_tasks.upload_to_s3 程序将文件上载到 S3 中。有关此程序的参数以及用于上载文件的示例查询的信息,请参阅将文件从 Oracle 数据库实例上载到 Amazon S3 存储桶
  2. 使用 rdsadmin. rdsadmin_s3_tasks.download_from_s3 程序将文件从 S3 存储桶下载到 DATA_PUMP_DIR 文件夹或任何用户创建的目录。有关此过程的参数和下载文件的示例查询的信息,请参阅将文件从 Amazon S3 存储桶下载到 Oracle 数据库实例

要监控文件传输的状态,请查看运行上载或下载 rdsadmin 软件包的程序时生成的日志。要查看这些日志,请执行以下操作:

  1. 打开 Amazon RDS 控制台
  2. 在导航窗格中,选择 Databases(数据库)。
  3. 选择要查看其日志的数据库实例。
  4. 选择 Logs & events(日志与事件)选项卡。
  5. Logs(日志)部分下,在搜索筛选条件中输入程序返回的任务 ID。
  6. 选择返回的文件。
  7. 选择 Watch(监视)以查看日志。
    -或者-
    选择 Download(下载)以下载日志。

您还可以运行以下命令来读取上载/下载过程中生成的日志文件:

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

注意:请务必将 task-id 替换为程序返回的任务 ID。