为 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');
有关更多信息,请参阅 先决条件:为组织中的账户启用复制。
有关复制的更多信息,请参阅 跨多个账户的复制和故障转移简介。
使用故障转移组复制外部卷¶
These steps provide a sample workflow for replicating an external volume and the Iceberg tables that depend on it to a target account by using a failover group.
备注
If you don't already have an external volume, you can create one with the storage locations that you want, including a location in the same region as your target account. After configuring storage access for each location, you can create and replicate an Iceberg table that references the external volume.
要创建外部卷,请参阅 配置外部卷。
在源账户中,更新外部卷,以添加与目标账户 位于同一区域 的存储位置。
例如:
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 无法访问为目标账户配置的存储位置,刷新操作将失败。如果发生这种情况,请仔细检查您的访问控制设置,或尝试 验证存储访问。
使用复制组复制外部卷¶
These steps provide a sample workflow for replicating an external volume and the Iceberg tables that depend on it to a target account by using a replication group.
备注
If you don't already have an external volume, you can create one with the storage locations that you want, including a location in the same region as your target account. After configuring storage access for each location, you can create and replicate an Iceberg table that references the external volume.
要创建外部卷,请参阅 配置外部卷。
在源账户中,更新外部卷,以添加与目标账户 位于同一区域 的存储位置。
例如:
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 表使用复制时,请考虑以下几点: