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
相关产品推荐
相关产品推荐

