暂存区、管道和加载历史记录复制¶
本主题介绍了有关对数据管道对象和相关元数据的复制支持的信息,包括暂存区、存储集成、管道和加载历史记录。您可以复制这些对象,为跨 :doc:` 区域 </user-guide/intro-regions>` 和跨 云平台 的引入和 ETL 管道配置故障转移。
在开始之前,建议您熟悉 Snowflake 对复制和故障转移/故障恢复的支持。有关更多信息,请参阅 跨多个账户的复制和故障转移简介。
要求¶
重要
如果您计划使用的目标账户中的数据库 已经 包含暂存区和管道,我们建议您在启用复制之前联系支持部门。当源账户中的复制或故障转移组包含该数据库时,任何已存在的暂存区和管道都将从数据库中删除。
要复制使用存储集成的任何外部暂存区,必须将复制或故障转移组配置为复制 STORAGE INTEGRATIONS
。否则,将在没有关联的存储集成的情况下复制外部暂存区。
可以使用 ALTER REPLICATION GROUP 或 ALTER FAILOVER GROUP 语句修改现有组的这些属性。
如果在 ALTER 语句的 OBJECT_TYPES
列表中添加 INTEGRATIONS
,请在列表中包含所有其他现有对象,避免在目标账户中删除这些对象。将 STORAGE INTEGRATIONS
添加到 ALLOWED_INTEGRATION_TYPES
列表中时,同样适用。
例如:
ALTER FAILOVER GROUP my_failover_group SET
OBJECT_TYPES = ROLES, INTEGRATIONS
ALLOWED_INTEGRATION_TYPES = API INTEGRATIONS, STORAGE INTEGRATIONS;
备注
您的云存储提供商可能会限制商业云和政府云区域之间的数据管道对象复制。为避免政府云数据复制限制,请在政府云区域可访问的任何区域中配置故障转移资源。有关政府云限制的更多信息,请查看云存储提供商的文档。
复制和暂存区¶
本节介绍了 Snowflake 当前针对不同类型暂存区支持的复制功能级别。
内部暂存区的复制¶
下表描述了每种类型的内部暂存区的复制工作方式。
类型 |
复制支持说明 |
---|---|
表暂存区 |
为复制的数据库中的表创建空的表暂存区。不会复制表暂存区上的文件。 |
用户暂存区 |
用户和用户暂存区复制需要 Business Critical Edition(或更高版本)。 为复制的用户创建空的用户暂存区。不会复制用户暂存区上的文件。 |
命名暂存区 |
复制数据库时,也将复制命名内部暂存区。 暂存区必须启用目录表,才能复制该暂存区上的文件。 |
外部暂存区的复制¶
备注
Snowflake 不会复制外部暂存区上的文件。对于主数据库和辅助数据库中的外部暂存区,云存储 URL 指向相同位置。
下表描述了每种类型的外部暂存区的复制工作方式。
类型 |
复制支持说明 |
---|---|
没有凭据的命名暂存区(公共存储位置) |
复制数据库时,也将复制命名外部暂存区。外部暂存区上的文件不会复制。 |
具有凭据的命名暂存区(专用存储位置) |
复制的暂存区包括云提供商凭据,例如密钥或访问令牌。 |
具有存储集成的命名暂存区(专用存储位置) |
存储集成复制需要 Business Critical Edition(或更高版本)。 复制或故障转移组必须将 您还必须采取措施,在目标账户中配置云存储的信任关系。有关更多信息,请参阅 配置辅助存储集成的云存储访问权限。 |
备注
要将辅助暂存区或管道与跟主对象关联的云存储位置之外的位置相关联,请联系支持团队。例如,您可以选择另一个区域中的位置。
注意事项¶
以下约束适用于暂存区对象:
Snowflake 目前支持将暂存区复制作为基于组的复制(复制组和故障转移组)的一部分。数据库复制不支持暂存区复制。
可以复制一个外部暂存区。但是,系统不会复制外部暂存区上的文件。
可以复制一个内部暂存区。要复制内部暂存区上的文件,必须在该暂存区上启用目录表。Snowflake 只复制目录表映射的文件。
当您复制具有目录表的内部暂存区时,不能在主暂存区或辅助暂存区上禁用该目录表。目录表包含有关复制的文件和使用 COPY 语句加载的文件的重要信息。
如果内部暂存区上的目录表包含大于 5GB 的文件,则刷新操作将失败。要解决此限制,请将所有大于 5GB 的文件移至其他暂存区。
您无法在主要暂存区或辅助暂存区,或以前已复制的任何暂存区上禁用目录表。在将包含暂存区的数据库添加到复制或故障转移组 之前,请执行以下步骤。
在主要暂存区 禁用目录表。
将大于 5GB 的文件移动到未启用目录表的另一个暂存区。
将文件移动到另一个暂存区后,请在主要暂存区上重新启用目录表。
系统不会复制用户暂存区和表暂存区上的文件。
对于使用存储集成的已命名外部暂存区,您必须在故障转移之前在目标账户中为辅助存储集成配置信任关系。有关更多信息,请参阅 配置辅助存储集成的云存储访问权限。
如果您复制具有目录表的外部暂存区,并且已为源目录表配置了 自动刷新,则必须在故障转移之前为 辅助 目录表配置自动刷新。有关更多信息,请参阅 配置目录表在辅助暂存区的自动刷新。
如果已复制暂存区上的目录表与该暂存区上的已复制文件不一致,则复制命令的执行时间可能会比预期的长。若要使目录表保持一致,请使用 ALTER STAGE ...REFRESH</sql-reference/sql/alter-stage> ` 语句。要检查目录表的一致性状态,请使用 :doc:/sql-reference/functions/system_get_directory_table_status` 函数。
复制和管道¶
本节介绍了当前针对不同类型管道支持的复制功能级别。
Snowflake 支持复制以下内容:
管道对象,包括自动引入和从外部暂存区加载数据的 REST 端点管道。
管道级参数。
对管道对象授予的权限。
备注
要将辅助暂存区或管道与跟主对象关联的云存储位置之外的位置相关联,请联系支持团队。例如,您可以选择另一个区域中的位置。
辅助数据库中的管道¶
辅助数据库中的管道处于 READ_ONLY
执行状态,会接收通知,但在将辅助数据库提升为主数据库之前不会加载数据。提升辅助数据库后,管道将转换为 FAILING_OVER
执行状态。故障转移完成后,管道应处于 RUNNING
执行状态,并开始加载自上次刷新时间(即,上次更新以前的主数据库的时间)以来可用的任何数据。
自动引入管道的复制¶
在发生故障转移时,复制的自动引入管道将成为新的主管道,并且可以执行以下操作:
加载任何尚未加载的数据。这包括自新近提升的主数据库上次刷新以来的任何新数据。
当暂存区有新文件要加载时,继续接收通知,并从这些文件加载数据。
备注
要接收通知,必须 在故障转移之前 在目标账户中配置辅助自动引入管道。有关更多信息,请参阅 配置辅助自动引入管道的通知。
REST 端点管道的复制¶
对于使用 Snowpipe REST API 加载数据的管道,Snowflake 会将管道及其加载历史记录元数据复制到您指定的每个目标账户。您无需对目标账户执行其他配置步骤。有关加载历史记录元数据的详细列表,请参阅 加载元数据。
若要在发生故障转移时继续加载数据,请通过新提升的源账户调用 REST API。
注意事项¶
以下约束适用于管道对象:
Snowflake 目前支持将管道复制作为基于组的复制(复制组和故障转移组)的一部分。数据库复制不支持管道复制。
仅在管道与其目标表属于同一复制组时,Snowflake 才会复制管道的复制历史记录。
不支持复制通知集成。
Snowflake 仅在最新的表截断后复制加载历史记录。
要接收通知,必须 在故障转移之前 在目标账户中配置辅助自动引入管道。有关更多信息,请参阅 配置辅助自动引入管道的通知。
使用 SYSTEM$PIPE_STATUS 函数,解决故障转移后未处于预期执行状态的任何管道。
示例 1:复制命名内部暂存区¶
该示例演示了内部暂存区的复制工作方式。具体而言,该示例显示了目录表如何在复制前后成为暂存区元数据的单一事实来源。
该示例的第一部分在 源 账户中完成以下任务。
创建一个名为
my_int_stage
且启用了目录表的内部暂存区,以便复制暂存区上的文件。然后将名为my_table
的表中的数据复制到暂存区上的文件中。备注
该示例在将
file1
和file2
加载到暂存区后刷新目录表,以使表元数据与目录表暂存区定义中的最新文件集同步。但是,加载file3
后不会发生刷新操作。CREATE OR REPLACE STAGE my_stage DIRECTORY = (ENABLE = TRUE); COPY INTO @my_stage/folder1/file1 from my_table; COPY INTO @my_stage/folder2/file2 from my_table; ALTER STAGE my_stage REFRESH; COPY INTO @my_stage/folder3/file3 from my_table;
创建故障转移组:
CREATE FAILOVER GROUP my_stage_failover_group OBJECT_TYPES = DATABASES ALLOWED_DATABASES = my_database_1 ALLOWED_ACCOUNTS = myorg.my_account_2;
该示例的第二部分在 目标 账户中完成复制和故障转移过程:
创建故障转移组作为源账户中故障转移组的副本,刷新新故障转移组中的对象,并将目标账户提升为源账户。
CREATE FAILOVER GROUP my_stage_failover_group AS REPLICA OF myorg.my_account_1.my_stage_failover_group; ALTER FAILOVER GROUP my_stage_failover_group REFRESH; ALTER FAILOVER GROUP my_stage_failover_group PRIMARY;
接下来,刷新复制的暂存区上的目录表,并将
my_stage
上的目录表跟踪的所有文件复制到名为my_table
的表中。备注
COPY INTO 语句将
file1
和file2
加载到表中,但不会加载file3
。这是因为,在源账户中添加file3
后,目录表未刷新。ALTER STAGE my_stage REFRESH; COPY INTO my_table FROM @my_stage;
示例 2:复制外部暂存区和存储集成¶
此示例提供了一个示例工作流,用于将外部暂存区和存储集成复制到目标账户。
该示例假定您已完成以下操作:配置了对 Amazon S3 桶的安全访问。
该示例的第一部分在 源 账户中完成以下任务。
在数据库
my_database_2
中为 Amazon S3 桶创建存储集成。CREATE STORAGE INTEGRATION my_storage_int TYPE = external_stage STORAGE_PROVIDER = 's3' STORAGE_ALLOWED_LOCATIONS = ('s3://mybucket/path') STORAGE_BLOCKED_LOCATIONS = ('s3://mybucket/blockedpath') ENABLED = true;
使用存储集成
my_storage_int
在数据库my_database_2
中创建外部暂存区。CREATE STAGE my_ext_stage URL = 's3://mybucket/path' STORAGE_INTEGRATION = my_storage_int
创建故障转移组并包含数据库
my_database_2
和存储集成对象。CREATE FAILOVER GROUP my_external_stage_fg OBJECT_TYPES = databases, integrations ALLOWED_INTEGRATION_TYPES = storage integrations ALLOWED_DATABASES = my_database_2 ALLOWED_ACCOUNTS = myorg.my_account_2;
该示例的第二部分在 目标 账户中完成复制和故障转移过程:
创建故障转移组,并将其用作源账户中故障转移组的副本,然后刷新。
CREATE FAILOVER GROUP my_external_stage_fg AS REPLICA OF myorg.my_account_1.my_external_stage_fg; ALTER FAILOVER GROUP my_external_stage_fg REFRESH;
将存储集成复制到目标账户后,您必须执行其他步骤来更新云提供商权限,以授予复制集成对云存储的访问权限。有关更多信息,请参阅 配置辅助存储集成的云存储访问权限。
示例 3:复制自动引入管道¶
该示例提供了一个用于复制管道的示例工作流程,该管道使用 Amazon Simple Notification Service (SNS) 主题和 Amazon Simple Queue Service (SQS) 来自动执行 Snowpipe。
该示例假定您已完成以下任务:
为 Amazon S3 创建并配置了存储集成。例如,我们使用一个名为
my_s3_storage_int
的存储集成。创建了一个引用存储集成的外部暂存区。例如,我们使用一个名为
my_s3_stage
的暂存区。有关说明,请参阅 CREATE STAGE。
从 源 账户中的以下任务开始。
使用 CREATE PIPE 命令创建启用了自动引入的管道,将数据从外部暂存区加载到名为
mytable
的表中。CREATE PIPE snowpipe_db.public.mypipe AUTO_INGEST=TRUE AWS_SNS_TOPIC='<topic_arn>' AS COPY INTO snowpipe_db.public.mytable FROM @snowpipe_db.public.my_s3_stage FILE_FORMAT = (TYPE = 'JSON');
使用 ALTER PIPE 语句刷新管道,从暂存区中加载过去 7 天的数据。
ALTER PIPE mypipe REFRESH;
最后,使用 CREATE FAILOVER GROUP 创建允许复制存储集成的故障转移组。
CREATE FAILOVER GROUP my_pipe_failover_group OBJECT_TYPES = DATABASES, INTEGRATIONS ALLOWED_INTEGRATION_TYPES = STORAGE INTEGRATIONS ALLOWED_DATABASES = snowpipe_db ALLOWED_ACCOUNTS = myorg.my_account_2;
该示例的第二部分在 目标 账户中完成复制和故障转移过程:
创建故障转移组,并将其用作源账户中故障转移组的副本。
CREATE FAILOVER GROUP my_pipe_failover_group AS REPLICA OF myorg.my_account_1.my_pipe_failover_group;
执行 DESCRIBE INTEGRATION 语句,检索辅助部署上 Snowflake 账户的 AWS IAM 用户的 ARN。
使用 ARN 授予 IAM 用户访问 S3 桶的权限。请参阅第 5 步:授予 IAM 用户访问桶对象的权限。
DESC INTEGRATION my_s3_storage_int;
调用 SYSTEM$GET_AWS_SNS_IAM_POLICY 系统函数生成 IAM 策略,授予新的 SQS 队列订阅 SNS 主题的权限。当您从源账户复制故障转移组时,Snowflake 便在目标账户中创建了新的 SQS 队列。
SELECT SYSTEM$GET_AWS_SNS_IAM_POLICY('<topic_arn>');
topic_arn
是您在源账户中为原始管道创建的 SNS 主题的 Amazon 资源名称 (ARN)。刷新新故障转移组中的对象。
ALTER FAILOVER GROUP my_pipe_failover_group REFRESH;
最后,使用 ALTER FAILOVER GROUP 命令将目标账户提升为源账户。
ALTER FAILOVER GROUP my_pipe_failover_group PRIMARY;
mypipe
管道将开始加载自上次在源账户中刷新故障转移组以来的任何可用数据。要验证复制的管道是否正常工作,请从管道的 COPY 语句中查询表。
SELECT * FROM mytable;
迁移到 Amazon Simple Notification Service (SNS)¶
本节介绍如何从直接将 Amazon S3 事件通知发送到 Amazon Simple Queue Service (SQS) 队列,迁移到使用 Amazon Simple Notification Service (SNS) 主题,此迁移适用于以下情况:
复制目录表或管道时,Snowflake 会在目标账户中创建一个新的 SQS 队列以处理自动化。您可以配置单个 SNS 主题,将事件通知从 S3 桶传送到多个账户的所有 SQS 队列。通过将 S3 事件通知广播到每个 SQS 队列,可以降低故障转移后丢失通知和数据的风险。
先决条件¶
要进行迁移,您必须满足以下条件:
您已为 S3 桶设置了一个或多个事件通知。有关说明,请参阅适用于您用例的主题:
您已在目标账户中创建了复制组或故障转移组,该账户包括一个带有目录表或管道的暂存区。
迁移到 SNS 主题¶
在 AWS 账户中创建 SNS 主题。有关说明,请参阅 AWS SNS 文档中的 创建 Amazon SNS 主题 (https://docs.aws.amazon.com/sns/latest/dg/sns-create-topic.html)。
将 S3 事件通知的目标目的地(例如,其他 SQS 队列或 AWS Lambda 工作负载)订阅到 SNS 主题。SNS 将您的桶的事件通知发布给该主题的所有订阅者。有关说明,请参阅 AWS SNS 文档 (https://docs.aws.amazon.com/sns/latest/dg/sns-create-subscribe-endpoint-to-topic.html)。
使用以下权限更新主题的访问策略:
允许 Snowflake IAM 用户订阅您主题的 目标 账户中的 SQS 队列。
允许 Amazon S3 将事件通知从桶发布到 SNS 主题。
有关说明,请参阅 第 1 步:将 Snowflake SQS 队列订阅至 SNS 主题。
在目标 Snowflake 账户中,调用 SYSTEM$CONVERT_PIPES_SQS_TO_SNS 函数。该函数将 目标 账户中的 SQS 队列订阅到您的 SNS 主题,而不会中断元数据同步或引入工作。
指定 S3 桶名称和 SNS 主题 ARN。
SELECT SYSTEM$CONVERT_PIPES_SQS_TO_SNS('s3_mybucket', 'arn:aws:sns:us-west-2:001234567890:MySNSTopic')
更新 S3 事件通知以使用 SNS 主题作为目标。有关说明,请参阅 Amazon S3 用户指南 (https://docs.aws.amazon.com/AmazonS3/latest/userguide/enable-event-notifications.html)。
完成这些步骤后,SQS 队列会自动解除与您的 S3 事件通知的绑定。使用指定 S3 桶的所有目录表和管道都将开始使用 SNS 作为通知的来源。