如何排查将 Amazon RDS for Oracle 与 Amazon S3 集成时出现的问题?

2 分钟阅读
0

我想排查将 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 目录。
  • 对于用户创建的目录,执行上传和下载的用户必须对该目录具有所需的读写权限。有关详细信息,请参阅如何管理我的 Amazon RDS for Oracle 数据库实例中的用户权限和角色?
  • 如果要在子目录中复制数据,则在使用 rdsadmin 软件包时要明确指定子目录的名称。无法使用 S3_INTEGRATION 选项复制子目录。

解决方法

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

检查您的数据库实例是否具有 AWS Identity and Access Management(IAM)角色,且该角色具有从 S3 上传和下载的最低权限:

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

您也可以使用 AWS 命令行界面(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 角色,请创建一个 IAM policy。向该策略授权,允许其将文件从 S3 桶传输到 Amazon RDS。创建 IAM policy 时,请务必为桶添加桶级别权限,为对象添加对象级别权限。

如果您在桶权限方面仍然存在问题,请修改 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 policy:

{
  "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_INTEGRATION 选项的选项组相关联

检查您的 RDS 数据库实例是否有附加的选项组:

  1. 打开 Amazon RDS 控制台
  2. 在导航窗格中,选择数据库
  3. 选择您要查看的数据库实例。
  4. 选择配置选项卡。
  5. 请注意选项组参数。

如果此选项组未处于同步状态,而您在这时添加 S3_INTEGRATION 选项,那么该选项将无法成功添加。因此,请确保选项组处于同步状态。

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

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

如果选项组未处于同步状态,请选择数据库的日志和事件选项卡,然后向下滚动到近期事件部分。找出阻止选项组同步的组件,然后将其从数据库中删除。

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

**注意:**如果未将 S3_INTEGRATION 选项添加到您的数据库实例,则会收到错误 ORA-00904: "RDSADMIN"."RDSADMIN_S3_TASKS"."UPLOAD_TO_S3":标识符无效"。此错误表示未在数据库实例上创建所需的上传和下载过程。

向 Amazon RDS 添加 S3_INTEGRATION 选项不会导致停机。如果要使用立即应用选项,请确保没有待处理的维护操作。如果有任何待处理的操作,则这些操作将通过 Amazon 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. 在导航窗格中,选择数据库
  3. 选择要查看其日志的数据库实例。
  4. 选择日志和事件选项卡。
  5. 日志部分下,在搜索筛选条件中输入该程序返回的任务 ID。
  6. 选择返回的文件。
  7. 选择监视以查看日志。
    -或-
    选择下载以下载日志。

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

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

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

相关信息

Amazon S3 集成

为什么我的 Amazon RDS for Oracle 数据库实例使用的存储超出预期?

AWS 官方
AWS 官方已更新 7 个月前