为 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

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

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

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

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.

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

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

使用复制组复制外部卷

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.

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

  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 表的 目录层次结构

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

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

语言: 中文