2026 年 6 月 30 日之后,Amazon Redshift 不再支持使用 Python UDF。我们将分阶段开始执行。有关 Python 生命周期终止和迁移选项详情的更多信息,请参阅 2025 年 6 月 30 日发布的博客文章
系统表与 S3 表类数据存储服务集成
使用系统表与 Amazon S3 表类数据存储服务
当您通过控制台、Redshift CLI 或 SDK 启用此功能后,Redshift 很快便会开始以固定频率将您所选系统表中的新行写入 S3 表类数据存储服务。您可以选择要发布哪些系统表;S3 表类数据存储服务将强制执行您所配置的保留期。
这支持以下使用案例:
-
满足合规性和审计要求。将查询、连接和更改历史记录保留数月或数年。
-
从一个位置监控您的实例集。整合来自您账户和区域中多个数据仓库的监控数据,并分析整个实例集的活动。
-
不再需要自定义提取、转换、加载(ETL)管道。停止构建和维护将系统表数据导出到 S3 以延长保留期的作业。
-
调查过往事件。查询超出 7 天集群内时段的历史数据,以进行根本原因分析、事件后审查,并监控工作负载随时间的演变及性能趋势。
此功能适用于 Amazon Redshift 预调配 RA3
工作原理
启用该功能并选择一个或多个受支持的系统表后,Redshift 会将这些系统表中新完成的记录写入 S3 表类数据存储服务。数据按固定频率分批传输。
系统表存在于您的 Amazon 账户中,但由服务管理:Amazon 拥有并运营数据传输和表管理,包括以下各项:
-
在您的账户中创建 S3 表存储桶、命名空间和 S3 表。
-
定义和演进表架构。
-
将数据以 Apache Iceberg 格式写入 S3 表中。
-
压缩数据并维护快照(由 S3 表类数据存储服务自动处理)。
无需构建或维护基础设施,也不会对您的工作负载产生任何影响。
您可以通过 S3 表类数据存储服务记录过期功能配置保留数据的时长。有关更多信息,请参阅 配置保留期。
由于表由 Amazon 管理,因此您无法修改或删除 Redshift 传输的行。传输的数据是不可变的。您只能控制对表的读取权限。有关更多信息,请参阅 数据治理。
只有已完成的活动才会传输到 S3 表类数据存储服务。数据仓库中的系统表可以显示正在进行的活动,但只复制已达到最终状态的记录。例如,将传输已完成、已中止或已取消的查询,但仍在运行的查询要等到达到最终状态后才会传输。
启用系统表与 S3 表类数据存储服务的集成
要启用系统表与 S3 表类数据存储服务的集成,请将现有 Redshift API 与新的日志目标类型 s3table 结合使用。启用后,Redshift 会在您的账户中创建一个名为 aws-redshift 的 S3 表存储桶。您可以使用与用于其它日志目标的相同操作来管理该功能:对于预调配集群,使用 enable-logging、disable-logging 和 describe-logging-status;对于 Redshift Serverless,使用 update-namespace 和 get-namespace。
权限
启用、修改或禁用该功能的主体必须具有以下权限:
-
redshift:EnableLogging(适用于预调配集群)或redshift-serverless:UpdateNamespace(适用于 Redshift Serverless)。 -
创建和配置 S3 表存储桶的权限。启用该功能的主体需要以下 S3 表类数据存储服务权限:
-
s3tables:CreateTableBucket -
s3tables:PutTableBucketEncryption -
s3tables:PutTableBucketPolicy
启用该功能后,Redshift 使用触发操作的主体的身份创建和配置 S3 表存储桶。
-
创建存储桶后,Redshift 利用 Redshift 与 S3 表类数据存储服务之间的服务信任关系,在该存储桶内创建命名空间和表。启用该功能的主体无需具备创建命名空间或表的权限。
部署选项
您可以通过以下两种模式之一配置传输。给定的数据仓库一次使用一种模式。
| 部署选项 | 说明 |
|---|---|
| 按仓库 | Redshift 将每个数据仓库的系统表数据写入其各自的一组 S3 表中。表中的每一行均来自单个数据仓库。适用于需要在仓库之间实现物理隔离的场景。 |
| 已合并 | Redshift 将同一账户和区域内多个数据仓库的系统表数据写入一组共享的 S3 表中。来自不同仓库的行通过 warehouse_namespace_arn 和 warehouse_name 列加以区分。适用于集中式、跨仓库分析。 |
部署模型决定了数据在 S3 表类数据存储服务中的组织方式。在按仓库模型中,S3 表类数据存储服务命名空间名称包含数据仓库的唯一标识符,因此,每个仓库的数据在物理上隔离到其自己的命名空间中。在合并模型中,S3 表类数据存储服务命名空间名称包含 Amazon 账号,而该账户和区域中所有仓库的数据统一存储在相同的命名空间和表中。
这两个选项均支持在单个 Amazon 账户和单个 Amazon 区域内使用。要分析跨区域或跨账户的数据,请在查询时合并每个区域或账户的表中的结果。要进行跨账户访问,您可以使用 Amazon Glue 数据目录共享。有关更多信息,请参阅《Amazon Glue 开发人员指南》中的授予跨账户访问权限。
注意
如果您将数据仓库从一种部署模式切换到另一种部署模式,则先前传输的数据将保留在其现有表中,并根据其配置的保留期进行保留。Redshift 开始向新目标传输新数据,而不会回填历史数据。
使用 控制台
配置系统表与 S3 表类数据存储服务的集成
-
打开 Redshift 控制台,在导航窗格中的 Amazon Redshift 或 Amazon Redshift Serverless 下,选择系统表集成。您也可以从集群或命名空间详细信息页面进行配置,方法是选择集成选项卡,或者依次选择操作、集成、配置系统表集成。
-
选择创建系统表集成。
-
选择您的预调配集群或 Redshift Serverless 工作组。
-
选择要发布的系统表。选择单个
SYS_*视图,或选择选择所有支持的系统表以发布所有当前及未来支持的视图。如果选择全部,则将来添加的新视图将自动包含在内,无需更改配置。 -
选择部署模型:
-
每个数据仓库、每个系统表对应单独的 S3 表,用于将该仓库的数据保存在其自己的一组表中。
-
跨数据仓库的每个系统表的共享 S3 表,用于将账户中多个仓库的数据整合到共享的一组表中。
-
-
(可选)选择加密密钥。默认情况下,数据使用 Amazon S3 托管式密钥(SSE-S3)进行加密。要使用自己的 Amazon KMS 密钥,请在此处选择。如果您使用自己的 Amazon KMS 密钥,则密钥策略必须向 Redshift 和 S3 表类数据存储服务授予访问该密钥的权限。有关更多信息,请参阅 配置加密。
-
保存更改。Redshift 开始将选定的系统表发布到 S3 表类数据存储服务,并持续定期添加新记录。
要停止发布某个系统表,请返回设置并将其移除。已发布的数据将持续保留,直到您通过 S3 表类数据存储服务配置过期。
您可以从集群或命名空间详细信息页面查看集成的状态。展开查看 S3 表映射,以查看每个系统表与其对应的 S3 表名称及命名空间之间的映射关系。您也可以从 S3 表类数据存储服务控制台查看已发布的数据。
使用 Amazon CLI
以下参数用于配置 S3 表类数据存储服务发布:
| 参数 | 适用于 | 说明 |
|---|---|---|
--log-destination-type |
二者 | 设置为 s3table 以发布到 S3 表类数据存储服务。其它值为 s3 和 cloudwatch。 |
--log-exports |
已预置 | 要发布的系统表,以 SYS_* 视图名称列表的形式指定,或为 all。 |
--s3-table-names |
Serverless | 要发布的系统表,以 SYS_* 视图名称列表的形式指定,或为 all。 |
--s3-table-action |
Serverless | Enable 或 Disable S3 表类数据存储服务发布。 |
--s3-table-granularity |
二者 | 表范围。预调配:cluster(默认)或 account。无服务器:namespace(默认)或 account。 |
--s3-table-kms-key-id |
二者 | 用于加密的可选 Amazon KMS 密钥 ARN 或 ID。默认为 Amazon S3 托管式密钥(SSE-S3)。 |
预置集群
启用传输。--log-exports 接受 all 或以空格分隔的受支持系统表列表,--s3-table-granularity 接受 cluster(按仓库)或 account(已合并)。
aws redshift enable-logging \ --cluster-identifier my-redshift-cluster \ --log-destination-type s3table \ --log-exports all \ --s3-table-granularity account
要仅为特定系统表启用传输:
aws redshift enable-logging \ --cluster-identifier my-redshift-cluster \ --log-destination-type s3table \ --log-exports sys_query_history sys_query_text sys_userlog \ --s3-table-granularity cluster
检查传输状态。
aws redshift describe-logging-status \ --cluster-identifier my-redshift-cluster
禁用传输(适用于所有系统表),或对于特定表使用 --log-exports:
aws redshift disable-logging \ --cluster-identifier my-redshift-cluster \ --log-destination-type s3table \ --log-exports sys_stream_scan_states
Redshift Serverless
在 Redshift Serverless 中,您可以使用 update-namespace 为每个命名空间配置该功能。系统表名称通过 --s3-table-names(而非 --log-exports)传递。
启用传输。
aws redshift-serverless update-namespace \ --namespace-name my-namespace \ --log-destination-type s3table \ --s3-table-action Enable \ --s3-table-names all \ --s3-table-granularity namespace
对特定的系统表禁用传输(或 all):
aws redshift-serverless update-namespace \ --namespace-name my-namespace \ --log-destination-type s3table \ --s3-table-action Disable \ --s3-table-names sys_stream_scan_states
检查传输状态。
aws redshift-serverless get-namespace \ --namespace-name my-namespace
要在删除 S3 表存储桶或表后恢复传输,请再次运行 enable 命令。
向 Amazon Glue Data Catalog 注册
在使用 Redshift、Athena 或其它分析服务查询保留的数据之前,服务托管的 S3 表存储桶必须先与 Amazon Glue Data Catalog 集成。每个账户和区域只需执行此步骤一次。如果您已将 S3 表类数据存储服务与 Amazon Glue Data Catalog 集成,则无需执行任何其它操作。
有关集成说明,请参阅《Amazon Glue 开发人员指南》中的将 Amazon S3 表类数据存储服务与 Amazon Glue Data Catalog 集成。
配置加密
默认情况下,传输到 S3 表类数据存储服务的数据使用 Amazon S3 托管式密钥(SSE-S3)进行加密。要改用 Amazon KMS 客户自主管理型密钥,请在启用传输时使用 --s3-table-kms-key-id 指定其 ARN:
aws redshift enable-logging \ --cluster-identifier my-redshift-cluster \ --log-destination-type s3table \ --log-exports all \ --s3-table-granularity account \ --s3-table-kms-key-id arn:aws:kms:us-west-2:111122223333:key/key-id
如果您使用客户自主管理型密钥,则其密钥策略必须支持 Redshift 系统表集成服务主体在写入您的系统表时生成数据密钥,并可让 S3 表类数据存储服务维护服务主体在表维护(例如压缩)期间使用该密钥。将以下语句添加到密钥策略中,用您自己的值替换 REGION、ACCOUNT 和 KEY_ID。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnableRedshiftSystemTableKeyUsage", "Effect": "Allow", "Principal": { "Service": "systemtables.redshift.amazonaws.com" }, "Action": [ "kms:DescribeKey", "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "arn:aws:kms:REGION:ACCOUNT:key/KEY_ID", "Condition": { "StringEquals": { "aws:SourceAccount": "ACCOUNT" } } }, { "Sid": "EnableS3TableMaintenanceKeyUsage", "Effect": "Allow", "Principal": { "Service": "maintenance.s3tables.amazonaws.com" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "arn:aws:kms:REGION:ACCOUNT:key/KEY_ID", "Condition": { "StringLike": { "kms:EncryptionContext:aws:s3:arn": "arn:aws:s3tables:REGION:ACCOUNT:bucket/aws-redshift/*" } } } ] }
如果密钥策略未授予这些权限,则 Redshift 无法写入加密的 S3 表类数据存储服务,传输将失败。
支持的系统表
您可以选择以下任一 SYS_* 监控视图来与 S3 表类数据存储服务集成。要了解每个视图中各列的描述,请选择视图名称。
-
SYS_DATASHARE_WRITE_HISTORY
注意
以下视图需要补丁 P203 或更高版本:SYS_CHILD_QUERY_TEXT、SYS_COPY_REPLACEMENTS、SYS_EXTERNAL_QUERY_ERROR、SYS_PROCEDURE_MESSAGES、SYS_QUERY_DETAIL、SYS_QUERY_EXPLAIN、SYS_SPATIAL_SIMPLIFY 和 SYS_UNLOAD_DETAIL。如果在运行早于 P203 的补丁的数据仓库上启用这些视图,则这些表将使用正确的架构创建,但在数据仓库更新到 P203 或更高版本之前,表中不包含任何数据。
向每个表中添加的元数据列
每个 S3 表都包含源 SYS_* 视图中的所有列,以及 Redshift 添加的以下五个元数据列,用于标识每行的来源及其传输时间。
| 列 | 类型 | 说明 |
|---|---|---|
warehouse_account_id |
字符串 | 拥有源数据仓库的 Amazon 账户。 |
warehouse_region_name |
字符串 | 源数据仓库运行所在的 Amazon 区域。 |
warehouse_namespace_arn |
字符串 | 源数据仓库的命名空间的 ARN。这是一个稳定、唯一的标识符,在重命名和重新创建时不可变。 |
warehouse_name |
字符串 | 源数据仓库的用户可读名称(集群名称或工作组名称)。 |
s3_tables_ingestion_time |
timestamp(6),UTC | Redshift 将该行提交到 S3 表类数据存储服务的时间。这是传输时间,而非底层事件发生的时间。 |
配置保留期
Redshift 不会为其传输到 S3 表类数据存储服务的数据定义保留策略。您可以通过 S3 表类数据存储服务设置记录过期策略,来配置保留数据的时长。您可以指定天数(例如 5 天、100 天或 365 天),S3 表类数据存储服务将自动移除超过所配置的保留时长的数据。
如果您未配置过期策略,数据将无限期保留。
当您禁用集成或移除系统表时,Redshift 会停止写入新数据,但之前传输的数据仍保留在 S3 表类数据存储服务中,并且继续受您配置的任何过期策略约束。
有关更多信息,请参阅《Amazon S3 用户指南》中的为 S3 表存储桶配置记录过期。
数据治理
您可以控制对保留的系统表数据的访问权限;Redshift 不会代表您应用读取权限,也不会屏蔽数据。
-
访问控制。将 S3 表存储桶与 Amazon Glue Data Catalog 集成后,您可以使用 Amazon Identity and Access Management
(IAM)或 Amazon Lake Formation 来管理读取访问权限。在整合的部署中,您可以按每个仓库限定读取访问权限范围。 -
编目和发现。Amazon Glue Data Catalog 集成提供了一个中心位置,用于发现保留的表并应用细粒度权限(例如,使用 Lake Formation 进行表级、列级或行级访问控制)。
传输和生命周期行为
-
传输频率。数据按固定频率分批传输。
-
仅传输一次。每条记录传输一次;重新启用或重新添加系统表不会创建重复记录。
-
启用、禁用、重新启用。当该功能(或特定的系统表)处于禁用状态时,不会捕获该时间段内的数据。禁用会停止写入,但不会移除 S3 表类数据存储服务或之前传输的数据。重新启用将恢复后续的传输,而不会回填空缺期间的数据。
-
从您的选择中移除系统表。Redshift 将停止为该系统表传输新数据。之前传输的数据仍保留在 S3 表类数据存储服务中,并受您所配置的记录过期策略约束。重新添加系统表可在不重复数据的情况下恢复传输。
-
删除包含动态数据的数据仓库。如果您在传输过程中删除了数据仓库,且该数据仓库的加密密钥与用于 S3 表类数据存储服务的密钥不同,则 Redshift 可能会在删除后的短时间内继续使用数据仓库密钥上的 Amazon KMS 授权,以完成所有剩余数据的传输。
检查传输状态
您可以随时查看每个系统表的当前配置和最近的传输时间:
-
预调配集群。
describe-logging-status(或describe-cluster)返回每个系统表的活动系统表、S3 表类数据存储服务命名空间、粒度和上次摄取时间。 -
Redshift Serverless。
get-namespace在命名空间的 S3 表类数据存储服务发布状态中返回相同的信息。
Redshift Serverless
传输操作不会使工作组保持唤醒状态,也不会消耗您的计算资源。在工作组暂停之前,Redshift 会确保所有待处理的批次均已传输完毕。
最佳实践
-
评测您的数据敏感度。了解您的数据仓库中存储了何种数据,以及系统表中是否包含敏感信息。某些系统表(例如 SYS_QUERY_TEXT 和 SYS_PROCEDURE_MESSAGES)可以捕获查询和存储过程中的文本值。
-
选择部署模型。如果您的数据仓库存储了敏感信息,请考虑使用按仓库部署模型,以便对每个数据仓库的系统表数据保持物理隔离。如果您的数据不敏感,并且您希望在不合并多个表的结果的情况下运行跨仓库查询,请使用合并部署模型。
-
选择所需的系统表。查看支持的系统表列表,然后选择符合合规性、审计或可观测性要求的表。您无需启用所有系统表。
-
在启用该功能之前配置加密。如果要使用客户自主管理型 Amazon KMS 密钥,请在首次启用该功能时指定该密钥。创建 S3 表类数据存储服务后,您将无法更改密钥。要更改密钥,请禁用该功能,使用 S3 表类数据存储服务 API 删除 S3 表类数据存储服务(这将永久删除保留的数据),然后使用新密钥重新启用该功能。
-
根据业务需求设置保留期。根据您的合规性、审计或运营需求,直接在 S3 表类数据存储服务中在表级别配置记录过期策略。不同的表可能有不同的保留期。如果您未配置过期策略,数据将无限期保留。要监控系统表的存储使用情况,请参阅《Amazon S3 用户指南》中的 Amazon S3 表类数据存储服务 CloudWatch 指标。
计费
将系统表数据写入 S3 表类数据存储服务是免费的。您需要按照所用查询引擎的定价,为保留的数据支付标准 S3 表类数据存储服务的存储和维护费用,以及读取数据所用查询引擎的费用。有关更多信息,请参阅 Amazon S3 表类数据存储服务定价
注意事项和限制
-
在单个 Amazon 账户和单个 Amazon 区域内支持。要分析跨账户或跨区域的数据,请在查询时合并结果。
-
数据仓库一次只能使用一种部署模式(按仓库部署或合并部署)。
-
切换部署模式、禁用后重新启用,或移除后重新添加系统表,均不会回填历史数据。
-
已传输的数据是不可变的。您无法通过 Redshift 修改或删除单个行。
-
您可以删除此功能创建的 S3 表类数据存储服务,但这样做会永久移除这些表中所有保留的数据并停止传输。Redshift 不会自动重新创建已删除的表。要恢复传输,您必须重新启用该功能,该功能将创建新表并开始继续传输新数据。之前传输的数据不会还原。有关更多信息,请参阅《Amazon S3 用户指南》中的删除 S3 表。
-
传输是基于批次的(数据以固定频率写入)。
-
从 Redshift 进行查询要求将 S3 表存储桶与 Amazon Glue Data Catalog 集成。