You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Redshift创建外部Schema时报错Database my_db not found的问题排查咨询

问题分析与解决方案

你遇到的Database my_db not found错误,核心原因是混淆了Redshift本地数据库和Redshift Spectrum依赖的外部元数据存储(比如AWS Glue Data Catalog)的数据库概念,具体拆解如下:

为什么会报错?

你在Redshift里执行CREATE DATABASE my_db;创建的是Redshift集群内部的本地数据库,但紧接着创建外部Schema时,FROM DATABASE 'my_db'这个参数指向的是外部元数据存储(如Glue Data Catalog)中的数据库——这两个是完全独立的存储体系,所以Redshift Spectrum找不到你指定的my_db。

正确的操作步骤

1. 先准备外部元数据存储中的数据库

Redshift Spectrum依赖外部元数据存储(默认是AWS Glue Data Catalog,也可以是Hive Metastore)来管理外部表的元数据,你需要先在这里创建对应的数据库:

  • 如果用AWS Glue,可以通过AWS控制台、Glue API,或者直接在Redshift中执行命令创建(前提是你的IAM角色有Glue权限):
    CREATE EXTERNAL DATABASE my_glue_db 
    FROM DATA CATALOG 
    DATABASE 'my_glue_db' 
    IAM_ROLE 'arn:aws:iam::123456789:role/RedshiftSpectrum';
    
    这里的my_glue_db就是Glue Data Catalog中要创建的数据库名称。

2. 创建指向外部元数据的外部Schema

现在创建外部Schema时,要引用Glue(或其他外部元存储)中的数据库,而非Redshift本地库:

CREATE EXTERNAL SCHEMA ext_my_db 
FROM DATABASE 'my_glue_db' 
IAM_ROLE 'arn:aws:iam::123456789:role/RedshiftSpectrum';

3. 创建外部表

这一步你的命令本身没问题,但要确保S3路径's3://my_bucket/etc/'存在,且IAM角色有该路径的访问权限:

CREATE EXTERNAL TABLE ext_my_db.test (
  "int" bigint
) LOCATION 's3://my_bucket/etc/';

关键检查点

  • IAM角色权限:确保你的RedshiftSpectrum角色同时具备:
    • 信任Redshift服务的权限(角色的信任策略中包含Redshift服务主体)
    • 访问Glue Data Catalog的权限(如glue:GetDatabase、glue:GetTable、glue:CreateTable等)
    • 访问目标S3桶的权限(如s3:ListBucket、s3:GetObject)
  • 元数据数据库名称:Glue中的数据库名称大小写敏感,要确保和CREATE EXTERNAL SCHEMA中引用的完全一致
  • 无需提前创建Redshift本地库:如果只是用Spectrum查询外部数据,不需要先在Redshift中创建本地数据库my_db,除非你要把外部Schema关联到Redshift本地库下(这不是Spectrum的常规用法)

内容的提问来源于stack exchange,提问作者pymat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 17:32:34