为 Snowflake 管理的 Apache Iceberg™ 表配置复制

使用此功能,您可以将 Snowflake 管理的 Apache Iceberg™ 表 从源账户复制到同一组织中的一个或多个目标账户。

Iceberg 表的复制工作方式与常规 Snowflake 表的复制类似。当您将 Iceberg 表的父数据库添加到故障转移组或复制组时,Snowflake 会复制 Iceberg 表。

但是,Snowflake 管理的 Iceberg 表依赖于外部卷,外部卷是账户级对象,需要额外配置才能连接到外部云存储。在复制 Iceberg 表之前,必须为外部卷配置复制。

选择加入 Snowflake 管理的 Iceberg 表复制的公开预览版

要选择加入此公开预览版,您必须同时选择加入源账户和目标账户。

  1. 要选择加入源账户,请在为账户 启用预览功能 后,使用 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;
    
    Copy
  2. 对目标账户重复上一步。

启用复制

具有 ORGADMIN 角色的用户必须为组织中的每个源账户和目标账户启用复制:

USE ROLE ORGADMIN;
SELECT SYSTEM$GLOBAL_ACCOUNT_SET_PARAMETER(
    '<organization_name>.<account_name>',
    'ENABLE_ACCOUNT_DATABASE_REPLICATION',
    'true');
Copy

有关更多信息,请参阅 先决条件:为组织中的账户启用复制

有关复制的更多信息,请参阅 跨多个账户的复制和故障转移简介

使用故障转移组复制外部卷

这些步骤提供了一个示例工作流程,用于使用故障转移组将外部卷和依赖于该外部卷的 Iceberg 表复制到目标账户。

重要

当源账户中的故障转移组包含外部卷时,Snowflake 会在刷新操作期间从目标账户中删除 目标 账户中预先存在的任何外部卷。

例如:

  • 源账户有一个名为 ext_vol_1 的外部卷。

  • 目标账户有名为 ext_vol_2ext_vol_3 的两个外部卷。

在刷新操作期间,Snowflake 会在目标账户上创建或同步 ext_vol_1 的副本,但会从目标账户中删除 ext_vol_2ext_vol_3

备注

如果您还没有外部卷,您可以创建一个具有所需存储位置的外部卷,包括与目标账户 同一区域 的位置。为每个位置配置存储访问权限后,您可以创建和复制引用外部卷的 Iceberg 表。

要创建外部卷,请参阅 配置外部卷

  1. 在源账户中,更新外部卷,以添加与目标账户 位于同一区域 的存储位置。

    例如:

    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'
     );
    
    Copy

    重要

    如果您没有为 S3 存储指定自己的 STORAGE_AWS_EXTERNAL_ID,则必须在添加新存储位置后调用 DESCRIBE EXTERNAL VOLUME,以检索 Snowflake 生成的外部 ID。您需要外部 ID,以在下一步中配置对 S3 的访问权限。

    Snowflake 将此新位置设置为辅助外部卷的 活动存储位置

  2. 在源账户中,创建一个 Snowflake 管理的 Iceberg 表,该表使用您通过附加存储位置更新的外部卷。

    例如:

    CREATE ICEBERG TABLE my_iceberg_table (amount int)
      CATALOG = 'SNOWFLAKE'
      EXTERNAL_VOLUME = 'exvol1'
      BASE_LOCATION = 'my_iceberg_table';
    
    Copy
  3. 在源账户中,请按照以下步骤检索 目标账户Snowflake 服务主体 信息:

    1. 使用 SHOW REPLICATION ACCOUNTS 命令,检索目标账户的名称 (account_name)。

      SHOW REPLICATION ACCOUNTS LIKE 'my_target_account%';
      
      Copy
    2. 调用 SYSTEM$DESC_ICEBERG_ACCESS_IDENTITY 系统函数。请 准确 指定目标存储位置的云服务提供商以及目标账户的名称,其格式必须与 SHOW REPLICATION ACCOUNTS 输出中 account_name 列显示的内容完全一致。

      例如:

      SELECT SYSTEM$DESC_ICEBERG_ACCESS_IDENTITY('S3', 'MY_TARGET_ACCOUNT_1');
      
      Copy
  4. 配置 Snowflake 对与目标账户关联的存储位置的访问权限。使用您在目标账户中检索到的服务主体信息,按照云提供商的说明进行操作:

  5. 在源账户中,使用 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;
    
    Copy

    备注

    如果您收到 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;
    
    Copy
  6. 在目标账户中,创建故障转移组作为源账户 (my_source_account) 中故障转移组的副本:

    CREATE FAILOVER GROUP my_iceberg_fg
      AS REPLICA OF myorg.my_source_account.my_iceberg_fg;
    
    Copy

    如果您已经有一个辅助组来复制源账户中的组,请跳过此步骤。

  7. 在目标账户中,运行刷新命令。

    ALTER FAILOVER GROUP my_iceberg_fg REFRESH;
    
    Copy

    只要复制包含 Snowflake 管理的 Iceberg 表的数据库,并且为目标账户配置了对云存储的访问权限,Snowflake 就会复制目标账户中的表。

    备注

    如果 Snowflake 无法访问为目标账户配置的存储位置,刷新操作将失败。如果发生这种情况,请仔细检查您的访问控制设置,或尝试 验证存储访问

使用复制组复制外部卷

这些步骤提供了一个示例工作流程,用于使用复制组将外部卷和依赖于该外部卷的 Iceberg 表复制到目标账户。

重要

当源账户中的复制组包含外部卷时,Snowflake 会在刷新操作期间从目标账户中删除 目标 账户中预先存在的任何外部卷。

例如:

  • 源账户有一个名为 ext_vol_1 的外部卷。

  • 目标账户有名为 ext_vol_2ext_vol_3 的两个外部卷。

在刷新操作期间,Snowflake 会在目标账户上创建或同步 ext_vol_1 的副本,但会从目标账户中删除 ext_vol_2ext_vol_3

备注

如果您还没有外部卷,您可以创建一个具有所需存储位置的外部卷,包括与目标账户 同一区域 的位置。为每个位置配置存储访问权限后,您可以创建和复制引用外部卷的 Iceberg 表。

要创建外部卷,请参阅 配置外部卷

  1. 在源账户中,更新外部卷,以添加与目标账户 位于同一区域 的存储位置。

    例如:

    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'
     );
    
    Copy

    重要

    如果您没有为 S3 存储指定自己的 STORAGE_AWS_EXTERNAL_ID,则必须在添加新存储位置后调用 DESCRIBE EXTERNAL VOLUME,以检索 Snowflake 生成的外部 ID。您需要外部 ID,以在下一步中配置对 S3 的访问权限。

    Snowflake 将此新位置设置为辅助外部卷的 活动存储位置

  2. 在源账户中,创建一个 Snowflake 管理的 Iceberg 表,该表使用您通过附加存储位置更新的外部卷。

    例如:

    CREATE ICEBERG TABLE my_iceberg_table (amount int)
      CATALOG = 'SNOWFLAKE'
      EXTERNAL_VOLUME = 'exvol1'
      BASE_LOCATION = 'my_iceberg_table';
    
    Copy
  3. 在源账户中,请按照以下步骤检索 目标账户Snowflake 服务主体 信息:

    1. 使用 SHOW REPLICATION ACCOUNTS 命令,检索目标账户的名称 (account_name)。

      SHOW REPLICATION ACCOUNTS LIKE 'my_target_account%';
      
      Copy
    2. 调用 SYSTEM$DESC_ICEBERG_ACCESS_IDENTITY 系统函数。请 准确 指定目标存储位置的云服务提供商以及目标账户的名称,其格式必须与 SHOW REPLICATION ACCOUNTS 输出中 account_name 列显示的内容完全一致。

      例如:

      SELECT SYSTEM$DESC_ICEBERG_ACCESS_IDENTITY('S3', 'MY_TARGET_ACCOUNT_1');
      
      Copy
  4. 配置 Snowflake 对与目标账户关联的存储位置的访问权限。使用您在目标账户中检索到的服务主体信息,按照云提供商的说明进行操作:

  5. 在源账户中,使用 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;
    
    Copy

    备注

    如果您收到 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;
    
    Copy
  6. 在目标账户中,创建复制组作为源账户 (my_source_account) 中复制组的副本:

    CREATE REPLICATION GROUP my_iceberg_rg
      AS REPLICA OF myorg.my_source_account.my_iceberg_rg;
    
    Copy

    如果您已经有一个辅助组来复制源账户中的组,请跳过此步骤。

  7. 在目标账户中,运行刷新命令。

    ALTER REPLICATION GROUP my_iceberg_rg REFRESH;
    
    Copy

    只要复制包含 Snowflake 管理的 Iceberg 表的数据库,并且为目标账户配置了对云存储的访问权限,Snowflake 就会复制目标账户中的表。

    备注

    如果 Snowflake 无法访问为目标账户配置的存储位置,刷新操作将失败。如果发生这种情况,请仔细检查您的访问控制设置,或尝试 验证存储访问

注意事项和限制

对 Iceberg 表使用复制时,请考虑以下几点:

  • Snowflake 目前仅支持复制 Snowflake 管理的表。

  • 不支持复制转换后的 Iceberg 表。在刷新操作期间,Snowflake 会跳过转换后的表。

  • 对于复制的表,必须配置对与目标账户位于 同一区域 的存储位置的访问权限。

  • 如果删除或更改主外部卷上用于复制的存储位置,刷新操作可能会失败。

  • 在将目标账户提升为源账户之前,目标账户中的辅助表处于只读状态。

  • Snowflake 维护辅助表的主 Iceberg 表的 目录层次结构

  • 使用此功能将产生数据复制费用。有关更多信息,请参阅 了解复制成本

  • 有关复制组和故障转移组的账户对象的注意事项,请参阅 账户对象

语言: 中文