Snowflake:数据克隆、复制与共享全解析
一、零拷贝克隆
1.1 流(Streams)克隆
当流被克隆时,它会从克隆的那一刻开始累积变更数据。克隆之前流中跟踪的任何未消费记录将被忽略。
1.2 任务(Tasks)克隆
任务被克隆后会立即暂停,必须手动恢复。
1.3 克隆时的注意事项
Snowflake 建议在克隆过程中不要对源对象执行 DML 语句。因为 Snowflake 尝试克隆表数据在克隆操作开始时的状态,它依赖时间旅行数据来重建该时间点的数据。
- 如果在克隆过程中,由于 DML 操作导致源表数据发生变化,并且表的
DATA_RETENTION_TIME_IN_DAYS
参数设置为 0,克隆操作将失败,因为没有时间旅行数据可供 Snowflake 重建克隆操作开始时的数据。
- 如果不能保证在克隆期间没有 DML 操作,那么将所有要克隆的表的
DATA_RETENTION_TIME_IN_DAYS
参数设置为 1,以便克隆过程有时间旅行数据可用。
二、数据库复制
2.1 复制概述
Snowflake 的复制功能可用于在同一组织的 Snowflake 账户之间复制数据库。数据库可以复制到不同的区域,甚至不同的云提供商。
- 要复制的一个或多个数据库称为主数据库,可以是永久的或临时的。
- 每个主数据库可以复制到一个或多个账户,在主数据库复制到的账户中会创建该数据库的副本,称为从数据库。主数据库中的数据可以更改,而从数据库是只读的。
2.2 复制的特点
- 数据库复制需要在账户之间物理复制数据,这意味着数据在最初复制后可能会过时。为了使从数据库中的复制数据与主数据库保持同步,通常会设置定期复制任务。
- 为了在复制数据到另一个账户时保护数据传输安全,Snowflake 使用随机加密密钥对数据进行加密。
2.3 可复制的数据库对象
| 可复制对象 | 说明 |
|---|---|
| 永久和临时表 | 存储数据的基本结构 |
| 表上的聚类 | 优化数据存储和查询性能 |
| 表约束 | 确保数据的完整性 |
| 序列 | 生成唯一的数字序列 |
| 视图 | 虚拟表,基于查询结果 |
| 物化视图 | 预计算的视图,提高查询性能 |
| 安全视图 | 提供数据安全访问控制 |
| 文件格式 | 定义数据的存储格式 |
| 存储过程 | 一组预定义的 SQL 语句 |
| UDFs(SQL、JavaScript、Python) | 用户自定义函数 |
| 掩码策略,包括基于标签的掩码策略 | 保护敏感数据 |
| 标签 | 用于数据分类和管理 |
2.4 复制限制
- 权限方面 :当数据库复制到从数据库时,授予数据库对象的权限不会被复制。
-
参数方面
:
- 账户参数不复制。
- 数据库参数不复制。
- 显式设置在对象上的表和模式参数会被复制。
-
其他限制
:
- 当主数据库是关键业务版或更高版本时,不支持复制到较低版本。
- 包含外部表的数据库不能复制。
- 从共享创建的数据库不能复制。
2.5 数据库复制的计费
数据库复制会产生以下费用:
-
数据传输费用
:云提供商对区域之间的数据传输收费。
-
计算资源费用
:复制使用 Snowflake 提供的计算资源。
-
存储费用
:目标账户需要为从数据库中的数据支付存储费用。
当复制操作因任何原因(如网络中断)失败时,下一次刷新可以重用前一次刷新中已复制的数据,但仅限于 14 天内。
2.6 查看数据传输使用情况
可以通过执行 SQL 命令查看数据传输使用情况和相关的信用费用:
- 查询 Snowflake 信息模式中的
REPLICATION_USAGE_HISTORY
表函数,该函数返回过去 14 天的复制使用活动。例如,查看过去 10 天的数据传输使用情况:
select *
from table(information_schema.REPLICATION_USAGE_HISTORY(
date_range_start => dateadd(d, -10, current_date),
date_range_end => current_date));
-
查询账户使用情况中的
REPLICATION_USAGE_HISTORY视图,该视图返回过去 365 天的复制使用活动。例如:
select * from snowflake.account_usage.REPLICATION_USAGE_HISTORY;
这两个查询返回的结果类似,会显示每次数据传输的开始时间和结束时间,以及数据库名称、传输的字节数和使用的信用。
2.7 数据库复制的设置步骤
-
组织管理员或具有
ORGADMIN角色的用户必须为源账户和目标账户启用复制。通过执行SYSTEM$GLOBAL_ACCOUNT_SET_PARAMETER函数,将ENABLE_ACCOUNT_DATABASE_REPLICATION参数设置为TRUE。 - 注意,数据库复制只进行一次。为了实现复制数据库的定期更新,必须设置一个 Snowflake 任务,定期刷新复制的数据库。
-
Snowflake 目前仅支持数据库级别的复制,不支持模式或表级别的复制。如果要复制数据库中的部分对象,可以按以下步骤操作:
- 克隆要复制的对象到同一账户的新数据库中。
- 在源对象上创建流来跟踪更改,并创建任务以保持克隆数据的同步。
- 将克隆的数据库复制到组织内不同区域的另一个账户。
- 创建一个任务,定期刷新复制数据库中的数据。
graph LR
A[启用账户复制] --> B[设置定期刷新任务]
B --> C{是否部分复制}
C -- 是 --> D[克隆对象到新数据库]
D --> E[创建流和任务]
E --> F[复制克隆数据库]
F --> G[创建刷新任务]
C -- 否 --> H[直接复制数据库]
H --> B
三、数据共享
3.1 安全数据共享概述
安全数据共享是一项强大的功能,可让用户在不同的 Snowflake 账户之间共享对象。数据共享无需在账户间进行物理复制,这意味着不会消耗额外的存储空间,并且能够快速设置。
-
共享对象的类型
:可以共享的数据库对象包括表、外部表、安全视图、安全物化视图和安全 UDF。
-
数据提供者与消费者
:创建共享的账户称为数据提供者,使用共享的账户称为数据消费者。共享的数据存储在提供者账户中,消费者只能查询数据,不能修改。
-
成本与操作
:消费者只需为查询共享数据所使用的计算资源付费。所有与数据共享相关的操作都可以在 Snowflake 的服务层和元数据中完成。
3.2 共享对象的设置步骤
- 创建共享 :提供者基于账户中的数据库创建共享,并通过授予访问权限将选定的对象添加到共享中。这些对象可以来自创建共享的 Snowflake 账户内的多个数据库。
- 添加消费者账户 :创建共享后,将一个或多个要共享对象的账户添加到共享中。
- 消费者创建数据库 :提供者设置共享并添加至少一个消费者账户后,消费者可以从共享中创建只读数据库。从消费者的角度来看,共享就像他们账户中的另一个数据库,查询能力和访问权限由 Snowflake 的基于角色的访问控制进行管理。
3.3 Snowflake 共享对象
Snowflake 共享对象具有以下特点:
-
包含的权限
:包括授予对要共享的数据库和模式的访问权限,以及对选定共享对象的访问权限。
-
管理与可用性
:共享由提供者账户创建和管理。设置共享后,共享中的所有对象对消费者账户中的用户可用。提供者可以向共享中添加新对象,这些对象将立即对消费者账户中的用户可用。
-
权限撤销与限制
:提供者可以撤销任何已添加到共享对象的消费者的访问权限。提供者创建共享的数量、添加到共享的账户数量以及消费者账户配置共享的数量均无限制,但每个共享在消费者账户中只能设置一个数据库。
3.4 读者账户
即使消费者没有 Snowflake 账户,也可以通过创建读者账户来实现数据共享。
-
创建读者账户
:提供者创建共享后,可以创建属于自己的读者账户。读者账户可以像消费者账户一样从共享中创建数据库,但只能配置由创建该读者账户的提供者共享的共享。
-
账户配置
:读者账户创建时只有一个用户,该用户是账户管理员,仅用于账户配置和监控,不应与查询数据的用户共享。为了让其他用户访问读者账户,账户管理员必须创建用户、自定义角色(如果需要)和用于执行查询的虚拟仓库。
3.5 直接共享
3.5.1 共享限制
直接共享仅支持在同一区域的 Snowflake 账户之间进行。如果需要在不同区域的账户之间共享数据,则需要使用数据库复制。
3.5.2 创建直接共享的步骤
-
准备工作
:使用
ACCOUNTADMIN角色或具有CREATE SHARES全局权限的角色。需要有一个可用的数据库,并至少创建一个要共享数据库的额外账户。 -
创建数据库和表
:例如,创建一个名为
SUPPLIERS的数据库、一个名为SUPPLIERS_DATA的模式和两个表:
create database SUPPLIERS;
create schema SUPPLIERS_DATA;
create table SUPPLIER as
select * from SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.SUPPLIER;
create table REGION as
select * from SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.REGION;
- 创建共享并授予权限 :可以使用 SQL 命令或 Snowsight 用户界面完成。使用 SQL 命令的示例如下:
create share SUPPLIERS_SHARE;
grant usage on database SUPPLIERS
to share SUPPLIERS_SHARE;
grant usage on schema SUPPLIERS.SUPPLIERS_DATA
to share SUPPLIERS_SHARE;
grant select on table SUPPLIERS.SUPPLIERS_DATA.SUPPLIER
to share SUPPLIERS_SHARE;
grant select on table SUPPLIERS.SUPPLIERS_DATA.REGION
to share SUPPLIERS_SHARE;
-
添加消费者账户
:使用
ALTER SHARE命令将一个或多个消费者账户添加到共享中。例如:
alter share SUPPLIERS_SHARE add accounts = BH09635;
3.5.3 查看共享信息的命令
-
查看所有共享
:使用
SHOW SHARES命令,输出将列出所有入站和出站共享及其属性。
show shares;
-
查看单个共享的详细信息
:使用
DESC命令,输出将列出指定共享中包含的数据库、模式和表。
desc share SUPPLIERS_SHARE;
-
查看共享的授予权限
:使用
SHOW GRANTS命令,输出将列出分配给指定共享的授予权限,如数据库和模式的USAGE权限以及表的SELECT权限。
show grants to share SUPPLIERS_SHARE;
3.5.4 消费直接共享
-
使用 Snowsight 用户界面
:登录到消费者账户,使用 Snowsight 用户界面查看与该账户共享的数据库。在相应窗口中提供数据库名称,并选择访问该数据库的角色(除
ACCOUNTADMIN外),点击“获取数据”按钮,将从直接共享中创建数据库对象。 - 使用 SQL 命令 :在消费者账户中执行以下命令:
create database SUPPLIERS_SHARE
from share AZXZRCJ.GO10133.SUPPLIERS_SHARE;
grant imported privileges on database SUPPLIERS_SHARE
to role PUBLIC;
3.5.5 创建读者账户
如果要与非 Snowflake 客户的用户共享
SUPPLIERS
数据库,可以在 Snowsight 用户界面中创建读者账户。在“新读者账户”窗口中,提供读者账户名称、可选注释、用户名和初始密码,点击“创建账户”按钮。创建读者账户后,将其添加到之前创建的
SUPPLIERS_SHARE
直接共享中,然后使用创建账户时指定的凭据登录到新的读者账户。读者可以像消费者账户一样从
SUPPLIERS_SHARE
直接共享中创建数据库。
3.6 读者账户的配置
读者账户创建后,需要进行以下配置:
| 配置项 | 说明 |
| — | — |
| 用户创建 | 账户管理员创建用于查询数据的用户 |
| 角色创建 | 创建自定义角色,控制用户在读者账户中的活动和可访问的对象。可以使用角色授予用户查询数据的访问控制权限、对用于查询的虚拟仓库的权限,以及执行需要特定权限的任务的额外权限 |
| 虚拟仓库创建 | 创建用于执行查询的虚拟仓库 |
graph LR
A[创建共享] --> B[添加消费者账户]
B --> C{是否为读者账户}
C -- 是 --> D[创建读者账户]
D --> E[添加到共享]
E --> F[读者创建数据库]
C -- 否 --> G[消费者创建数据库]
G --> H[查询共享数据]
F --> H
综上所述,Snowflake 的数据克隆、复制和共享功能为用户提供了强大而灵活的数据管理和使用方式。通过合理利用这些功能,可以提高数据的安全性、可用性和共享效率,满足不同场景下的数据处理需求。
超级会员免费看
1134

被折叠的 条评论
为什么被折叠?



