为 Snowflake 管理的 Apache Iceberg™ 表配置复制¶
使用此功能,您可以将 Snowflake 管理的 Apache Iceberg™ 表 从源账户复制到同一组织中的一个或多个目标账户。
Iceberg 表的复制工作方式与常规 Snowflake 表的复制类似。当您将 Iceberg 表的父数据库添加到故障转移组或复制组时,Snowflake 会复制 Iceberg 表。
但是,Snowflake 管理的 Iceberg 表依赖于外部卷,外部卷是账户级对象,需要额外配置才能连接到外部云存储。在复制 Iceberg 表之前,必须为外部卷配置复制。
选择加入 Snowflake 管理的 Iceberg 表复制的公开预览版¶
要选择加入此公开预览版,您必须同时选择加入源账户和目标账户。
要选择加入源账户,请在为账户 启用预览功能 后,使用 ALTER ACCOUNT 命令在账户级别启用以下参数:
ENABLE_ICEBERG_MANAGED_TABLE_REPLICATION
备注
您还可以在故障转移组级别启用此参数。
ENABLE_SELECTIVE_EXTERNAL_VOLUME_REPLICATION_PUPR
例如:
ALTER ACCOUNT SET ENABLE_ICEBERG_MANAGED_TABLE_REPLICATION = TRUE ENABLE_SELECTIVE_EXTERNAL_VOLUME_REPLICATION_PUPR = TRUE;
对目标账户重复上一步。
启用复制¶
具有 ORGADMIN 角色的用户必须为组织中的每个源账户和目标账户启用复制:
USE ROLE ORGADMIN;
SELECT SYSTEM$GLOBAL_ACCOUNT_SET_PARAMETER(
'<organization_name>.<account_name>',
'ENABLE_ACCOUNT_DATABASE_REPLICATION',
'true');
有关更多信息,请参阅 先决条件:为组织中的账户启用复制。
有关复制的更多信息,请参阅 跨多个账户的复制和故障转移简介。
使用故障转移组复制外部卷¶
这些步骤提供了一个示例工作流程,用于使用故障转移组将外部卷和依赖于该外部卷的 Iceberg 表复制到目标账户。
重要
当源账户中的故障转移组包含外部卷时,Snowflake 会在刷新操作期间从目标账户中删除 目标 账户中预先存在的任何外部卷。
例如:
源账户有一个名为
ext_vol_1的外部卷。目标账户有名为
ext_vol_2和ext_vol_3的两个外部卷。
在刷新操作期间,Snowflake 会在目标账户上创建或同步 ext_vol_1 的副本,但会从目标账户中删除 ext_vol_2 和 ext_vol_3。
备注
如果您还没有外部卷,您可以创建一个具有所需存储位置的外部卷,包括与目标账户 同一区域 的位置。为每个位置配置存储访问权限后,您可以创建和复制引用外部卷的 Iceberg 表。
要创建外部卷,请参阅 配置外部卷。
在源账户中,更新外部卷,以添加与目标账户 位于同一区域 的存储位置。
例如:
ALTER EXTERNAL VOLUME exvol1 ADD STORAGE_LOCATION = ( NAME = 'my-s3-us-central-2' STORAGE_PROVIDER = 'S3' STORAGE_BASE_URL = 's3://my_bucket_us_central-2/' STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::123456789012:role/myrole' STORAGE_AWS_EXTERNAL_ID = 'iceberg_table_external_id' );
重要
如果您没有为 S3 存储指定自己的
STORAGE_AWS_EXTERNAL_ID,则必须在添加新存储位置后调用 DESCRIBE EXTERNAL VOLUME,以检索 Snowflake 生成的外部 ID。您需要外部 ID,以在下一步中配置对 S3 的访问权限。Snowflake 将此新位置设置为辅助外部卷的 活动存储位置。
在源账户中,创建一个 Snowflake 管理的 Iceberg 表,该表使用您通过附加存储位置更新的外部卷。
例如:
CREATE ICEBERG TABLE my_iceberg_table (amount int) CATALOG = 'SNOWFLAKE' EXTERNAL_VOLUME = 'exvol1' BASE_LOCATION = 'my_iceberg_table';
在源账户中,请按照以下步骤检索 目标账户 的 Snowflake 服务主体 信息:
使用 SHOW REPLICATION ACCOUNTS 命令,检索目标账户的名称 (
account_name)。SHOW REPLICATION ACCOUNTS LIKE 'my_target_account%';
调用 SYSTEM$DESC_ICEBERG_ACCESS_IDENTITY 系统函数。请 准确 指定目标存储位置的云服务提供商以及目标账户的名称,其格式必须与 SHOW REPLICATION ACCOUNTS 输出中
account_name列显示的内容完全一致。例如:
SELECT SYSTEM$DESC_ICEBERG_ACCESS_IDENTITY('S3', 'MY_TARGET_ACCOUNT_1');
配置 Snowflake 对与目标账户关联的存储位置的访问权限。使用您在目标账户中检索到的服务主体信息,按照云提供商的说明进行操作:
为 Amazon S3 配置外部卷。使用与目标账户的存储位置关联的外部 ID。
为 Azure 配置外部卷。在 SYSTEM$DESC_ICEBERG_ACCESS_IDENTITY 返回的
AZURE_CONSENT_URL TEMPLATE中,将your_tenant_id替换为存储位置所属的租户的 ID。
在源账户中,使用 CREATE FAILOVER GROUP 命令创建故障转移组。在
OBJECT_TYPES列表中指定EXTERNAL VOLUMES。在ALLOWED_DATABASES列表中,包括包含要复制的 Iceberg 表的数据库。在ALLOWED_EXTERNAL_VOLUMES列表中,包含提供访问权限的外部卷,这些卷用于访问您要复制的 Iceberg 表。CREATE FAILOVER GROUP my_iceberg_fg OBJECT_TYPES = DATABASES, EXTERNAL VOLUMES ALLOWED_DATABASES = my_iceberg_database ALLOWED_EXTERNAL_VOLUMES = my_external_volume ALLOWED_ACCOUNTS = myorg.my_account_1;
备注
如果您收到 SQL 解析器错误,允许的外部卷列表可能太长。若收到此错误,请在 CREATE FAILOVER GROUP 语句中缩短此列表,然后使用 ALTER FAILOVER GROUP 命令向故障转移组添加其他允许的外部卷。
要更新现有组,请使用 ALTER FAILOVER GROUP 命令将
EXTERNAL VOLUMES添加到OBJECT_TYPES列表。请在OBJECT_TYPES列表中包含所有其他现有对象,避免在目标账户中删除这些对象。例如,将
EXTERNAL VOLUMES添加到已包含DATABASES的故障转移组:ALTER FAILOVER GROUP my_iceberg_rg SET OBJECT_TYPES = DATABASES, EXTERNAL VOLUMES ALLOWED_EXTERNAL_VOLUMES = my_external_volume;
在目标账户中,创建故障转移组作为源账户 (
my_source_account) 中故障转移组的副本:CREATE FAILOVER GROUP my_iceberg_fg AS REPLICA OF myorg.my_source_account.my_iceberg_fg;
如果您已经有一个辅助组来复制源账户中的组,请跳过此步骤。
在目标账户中,运行刷新命令。
ALTER FAILOVER GROUP my_iceberg_fg REFRESH;
只要复制包含 Snowflake 管理的 Iceberg 表的数据库,并且为目标账户配置了对云存储的访问权限,Snowflake 就会复制目标账户中的表。
备注
如果 Snowflake 无法访问为目标账户配置的存储位置,刷新操作将失败。如果发生这种情况,请仔细检查您的访问控制设置,或尝试 验证存储访问。
使用复制组复制外部卷¶
这些步骤提供了一个示例工作流程,用于使用复制组将外部卷和依赖于该外部卷的 Iceberg 表复制到目标账户。
重要
当源账户中的复制组包含外部卷时,Snowflake 会在刷新操作期间从目标账户中删除 目标 账户中预先存在的任何外部卷。
例如:
源账户有一个名为
ext_vol_1的外部卷。目标账户有名为
ext_vol_2和ext_vol_3的两个外部卷。
在刷新操作期间,Snowflake 会在目标账户上创建或同步 ext_vol_1 的副本,但会从目标账户中删除 ext_vol_2 和 ext_vol_3。
备注
如果您还没有外部卷,您可以创建一个具有所需存储位置的外部卷,包括与目标账户 同一区域 的位置。为每个位置配置存储访问权限后,您可以创建和复制引用外部卷的 Iceberg 表。
要创建外部卷,请参阅 配置外部卷。
在源账户中,更新外部卷,以添加与目标账户 位于同一区域 的存储位置。
例如:
ALTER EXTERNAL VOLUME exvol1 ADD STORAGE_LOCATION = ( NAME = 'my-s3-us-central-2' STORAGE_PROVIDER = 'S3' STORAGE_BASE_URL = 's3://my_bucket_us_central-2/' STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::123456789012:role/myrole' STORAGE_AWS_EXTERNAL_ID = 'iceberg_table_external_id' );
重要
如果您没有为 S3 存储指定自己的
STORAGE_AWS_EXTERNAL_ID,则必须在添加新存储位置后调用 DESCRIBE EXTERNAL VOLUME,以检索 Snowflake 生成的外部 ID。您需要外部 ID,以在下一步中配置对 S3 的访问权限。Snowflake 将此新位置设置为辅助外部卷的 活动存储位置。
在源账户中,创建一个 Snowflake 管理的 Iceberg 表,该表使用您通过附加存储位置更新的外部卷。
例如:
CREATE ICEBERG TABLE my_iceberg_table (amount int) CATALOG = 'SNOWFLAKE' EXTERNAL_VOLUME = 'exvol1' BASE_LOCATION = 'my_iceberg_table';
在源账户中,请按照以下步骤检索 目标账户 的 Snowflake 服务主体 信息:
使用 SHOW REPLICATION ACCOUNTS 命令,检索目标账户的名称 (
account_name)。SHOW REPLICATION ACCOUNTS LIKE 'my_target_account%';
调用 SYSTEM$DESC_ICEBERG_ACCESS_IDENTITY 系统函数。请 准确 指定目标存储位置的云服务提供商以及目标账户的名称,其格式必须与 SHOW REPLICATION ACCOUNTS 输出中
account_name列显示的内容完全一致。例如:
SELECT SYSTEM$DESC_ICEBERG_ACCESS_IDENTITY('S3', 'MY_TARGET_ACCOUNT_1');
配置 Snowflake 对与目标账户关联的存储位置的访问权限。使用您在目标账户中检索到的服务主体信息,按照云提供商的说明进行操作:
为 Amazon S3 配置外部卷。使用与目标账户的存储位置关联的外部 ID。
为 Azure 配置外部卷。在 SYSTEM$DESC_ICEBERG_ACCESS_IDENTITY 返回的
AZURE_CONSENT_URL TEMPLATE中,将your_tenant_id替换为存储位置所属的租户的 ID。
在源账户中,使用 CREATE REPLICATION GROUP 命令创建复制组。在
OBJECT_TYPES列表中指定EXTERNAL VOLUMES。在ALLOWED_DATABASES列表中,包括包含要复制的 Iceberg 表的数据库。在ALLOWED_EXTERNAL_VOLUMES列表中,包含提供访问权限的外部卷,这些卷用于访问您要复制的 Iceberg 表。CREATE REPLICATION GROUP my_iceberg_rg OBJECT_TYPES = DATABASES, EXTERNAL VOLUMES ALLOWED_DATABASES = my_iceberg_database ALLOWED_EXTERNAL_VOLUMES = my_external_volume ALLOWED_ACCOUNTS = myorg.my_account_1;
备注
如果您收到 SQL 解析器错误,允许的外部卷列表可能太长。若收到此错误,请在 CREATE REPLICATION GROUP 语句中缩短此列表,然后使用 ALTER REPLICATION GROUP 命令向复制组添加其他允许的外部卷。
要更新现有组,请使用 ALTER REPLICATION GROUP 命令将
EXTERNAL VOLUMES添加到OBJECT_TYPES列表。请在OBJECT_TYPES列表中包含所有其他现有对象,避免在目标账户中删除这些对象。例如,将
EXTERNAL VOLUMES添加到已包含DATABASES的复制组:ALTER REPLICATION GROUP my_iceberg_rg SET OBJECT_TYPES = DATABASES, EXTERNAL VOLUMES ALLOWED_EXTERNAL_VOLUMES = my_external_volume;
在目标账户中,创建复制组作为源账户 (
my_source_account) 中复制组的副本:CREATE REPLICATION GROUP my_iceberg_rg AS REPLICA OF myorg.my_source_account.my_iceberg_rg;
如果您已经有一个辅助组来复制源账户中的组,请跳过此步骤。
在目标账户中,运行刷新命令。
ALTER REPLICATION GROUP my_iceberg_rg REFRESH;
只要复制包含 Snowflake 管理的 Iceberg 表的数据库,并且为目标账户配置了对云存储的访问权限,Snowflake 就会复制目标账户中的表。
备注
如果 Snowflake 无法访问为目标账户配置的存储位置,刷新操作将失败。如果发生这种情况,请仔细检查您的访问控制设置,或尝试 验证存储访问。
注意事项和限制¶
对 Iceberg 表使用复制时,请考虑以下几点: