Snowflake数据保护与管理全解析
1. 数据保留期变更
若要更改数据库、模式或表的数据保留期,可使用
ALTER
命令搭配
DATA_RETENTION_TIME_IN_DAYS
关键字。例如,将
SALES
数据库的保留期更改为30天,可执行以下命令:
alter database SALES set DATA_RETENTION_TIME_IN_DAYS = 30;
当更改账户、数据库或模式的数据保留期时,除非子对象已明确设置保留期,否则对象层次结构中较低级别的所有子对象将继承该保留期。当时间旅行的数据保留期到期后,数据将被转移到故障安全(Failsafe)模式。这一过程由Snowflake通过后台进程完成,可能需要一些时间。在所有数据转移到故障安全模式之前,数据仍可能在时间旅行中可用。
当父对象和子对象定义了不同的数据保留期时,在删除对象时会影响保留期的处理。例如,删除数据库时,子对象也会被删除,无论它们的保留期设置是否不同。同样,删除模式时,表也会被删除。Snowflake建议先删除子对象,这样可以单独遵循子对象的保留期,然后再删除父对象。
2. 查询历史数据
为支持时间旅行功能,Snowflake提供了
AT | BEFORE
子句作为SQL扩展,可用于
SELECT
和
CLONE
语句。该子句使用以下参数之一来限制查询返回的历史数据:
-
TIMESTAMP
-
OFFSET
:由当前时间戳的秒数差值定义
-
STATEMENT
:由语句的查询ID定义
UNDROP
命令可用于恢复已删除的表、模式和数据库,它会从时间旅行中检索对象。
以下是具体操作示例:
1. 创建数据库和模式:
create schema SALESDATA DATA_RETENTION_TIME_IN_DAYS = 1;
可根据Snowflake版本,将
DATA_RETENTION_TIME_IN_DAYS
参数值设置为最多90天。为进行时间旅行练习,建议将该值至少设置为1天。
2. 创建表:
create table NATION as
select * from SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.NATION;
- 查询表中法国的记录:
select * from NATION where n_name = 'FRANCE';
查询结果如下表所示:
| P_NATIONKEY | N_NAME | N_REGIONKEY | N_COMMENT |
| — | — | — | — |
| 6 | FRANCE | 3 | Fulfill final requests… |
4. 更新法国记录的注释:
update NATION
set n_comment = 'Comment for France'
where n_name = 'FRANCE';
更新后再次查询法国记录:
select * from NATION where n_name = 'FRANCE';
更新后的查询结果如下表:
| P_NATIONKEY | N_NAME | N_REGIONKEY | N_COMMENT |
| — | — | — | — |
| 6 | FRANCE | 3 | Comment for France |
5. 查询更新前的历史数据:
使用
BEFORE
选项和语句参数:
select *
from NATION before(statement => '01a7-xxxx-yyyy-a166')
where n_name = 'FRANCE';
请确保在
statement
参数中使用自己通过
Copy Query ID
选项获取的查询ID。
使用
AT
选项和偏移参数查询60秒前的表数据:
select *
from NATION at(offset => -60)
where n_name = 'FRANCE';
使用
AT
选项和时间戳参数查询指定时间的表数据:
select *
from NATION at(timestamp => '2022-04-15 11:30:00'::timestamp)
where n_name = 'FRANCE';
需注意,使用时间戳参数时,要确保正确识别时区并转换为时间戳数据类型。如果
AT | BEFORE
选项中指定的时间戳、偏移量或语句参数的值超出了表的数据保留期,查询将失败并返回错误。
3. 克隆历史对象
Snowflake的数据库、模式和表可以使用
CLONE
关键字与相应的
CREATE
语句命令进行克隆。
AT | BEFORE
子句可用于指定克隆的历史时间点。
例如,克隆
NATION
表创建
NATION_HISTORICAL
表:
create table NATION_HISTORICAL
clone NATION at(timestamp => '2022-04-15 11:30:00'::timestamp);
克隆
SALESDATA
模式创建
SALESDATA_HISTORICAL
模式:
create schema SALES.SALESDATA_HISTORICAL
clone SALES.SALESDATA at(offset => -3600);
同样,也可以使用时间旅行历史中的某个时间点克隆数据库。
在以下情况下,克隆数据库或模式会失败:
- 克隆的时间点超出了要克隆对象的数据保留时间。
- 克隆的时间点早于对象创建的时间戳。
4. 删除和恢复对象
为恢复已删除的对象,Snowflake利用时间旅行功能保留对象,数据保留期用于确定对象在时间旅行中保留的时长。
删除表、模式或数据库,可使用相应的
DROP
命令。例如,删除之前创建的
NATION
表:
drop table NATION;
使用
SHOW
命令和
HISTORY
关键字查看已删除的表、模式和数据库。例如,查看
SALES
数据库和
SALESDATA
模式中已删除的表:
show tables history in SALES.SALESDATA;
该命令将返回
SALES
数据库的
SALESDATA
模式中所有当前表以及已删除表的列表。可通过输出中的
DROPPED_ON
列判断表是否已删除,该列在表被删除时有值,否则为
NULL
。
查看已删除的模式或数据库,可分别使用以下命令:
show schemas history in SALES;
show databases history;
与
SHOW TABLES
输出类似,
DROPPED_ON
列包含对象被删除的日期和时间。如果对象被多次删除,每次删除都会在输出中以单独的行显示。
当对象的保留期到期且不再在时间旅行中可用时,
SHOW HISTORY
命令的输出将不再包含该对象。
使用
UNDROP
命令可恢复仍在时间旅行中可用的已删除对象。例如,恢复之前删除的
NATION
表:
undrop table NATION;
恢复模式或数据库,可分别使用以下命令:
undrop schema SALESDATA;
undrop database SALES;
恢复对象时,不能将其重命名,只能以原对象名称恢复。如果删除对象后,创建了与已删除对象同名的新对象,则无法恢复之前删除的对象,必须先删除同名的新对象,然后再恢复已删除的对象。恢复对象需要具备以下权限:
- 对象的
OWNERSHIP
权限
- 在恢复对象所在的数据库或模式中的
CREATE
权限
只能在当前数据库或模式中恢复对象。
5. 故障安全(Failsafe)
故障安全模式用于在系统故障、安全漏洞或其他意外事件发生时保护历史数据。它并非时间旅行的扩展,因为用户无法访问,只有Snowflake可在极端情况下使用它来恢复数据。
时间旅行保留期结束后,数据将被转移到故障安全模式,额外保留7天,在此期间Snowflake可恢复数据。7天的故障安全期不可由用户配置或延长。
账户管理员可通过Snowsight用户界面查看账户的数据存储总量,包括时间旅行和故障安全中的数据。操作步骤如下:
1. 确保当前角色选择为
ACCOUNTADMIN
。
2. 点击左侧菜单中的
Admin
选项,选择
Usage
。
3. 在弹出窗口中,点击
All Usage Types
下拉列表,选择
Storage
。
6. 时间旅行和故障安全的成本
存储在时间旅行和故障安全中的历史数据会产生存储成本,Snowflake按24小时时间段计算该成本。为减少存储量,Snowflake仅存储在时间旅行和故障安全中已更改或删除的数据。只有已删除的表会完整保留,以便在需要时恢复。
与永久表相比,临时表和临时模式表可降低时间旅行和故障安全的存储成本。临时模式表的数据保留时间设置为1天时,当天会产生与时间旅行相关的数据存储成本。临时表的数据保留期设置为1天时,仅在表存在期间产生相关存储成本。需注意,临时表和临时模式表没有故障安全期。
在管理时间旅行和故障安全成本方面,Snowflake提供了以下选择表类型的指导:
- 临时表仅在创建它们的会话中存在。删除表或会话结束后,临时表不会保留在时间旅行或故障安全中,因此无法恢复。
- 临时模式表可定义时间旅行保留期,并可在此期间从时间旅行中恢复。由于没有故障安全期,时间旅行期到期后无法恢复。用于ETL过程存储中间结果的表可定义为临时模式表。
- 用户需要的表,如数据仓库的事实表和维度表,应始终通过时间旅行和故障安全进行保护,以防意外事件,因此应创建为永久表。
7. 数据加密
当Snowflake托管在AWS的安全虚拟专用云(VPC)或Azure的虚拟网络(VNet)中时,端到端加密(E2EE)可确保数据在传输到Snowflake和从Snowflake传输时不被第三方读取。在使用外部或内部阶段加载和卸载数据时,均支持E2EE。
加载数据时的情况如下:
- 从外部阶段加载:Snowflake建议使用客户端加密对云存储提供商的云存储中的数据文件进行加密。如果数据未加密,Snowflake会在将其加载到表之前对其进行加密。
- 从内部阶段加载:数据文件在加载到内部阶段之前会由Snowflake客户端自动加密,加载到阶段后也会保持加密状态。
卸载数据时的情况如下:
- 卸载到外部阶段:结果可选择使用客户端加密。
- 卸载到内部阶段:结果会由Snowflake自动加密。
8. 客户端加密
客户端加密意味着数据在加载到云存储之前就已加密。加密数据文件时,用户将用于加密的主密钥与Snowflake共享,然后用随机加密密钥对云存储中的每个文件进行加密,该随机密钥再用主密钥加密。加密文件和加密随机密钥都会上传到云存储。由于数据始终处于加密状态,云存储服务或其他第三方无法查看实际数据。
从对象存储加载客户端加密数据时,创建外部阶段时使用
MASTER_KEY
参数。该参数需要一个128位或256位的高级加密标准(AES)密钥,以Base64编码。例如,创建指向AWS存储位置并使用客户端加密的外部阶段:
create stage ENCRYPTED_EXTERNAL_STAGE
url = 's3://bucket/datafiles/'
credentials = (aws_key_id = 'xxx' aws_secret_key = 'xxx')
encryption = (master_key = 'xxx... = ');
在实际使用时,需替换为自己的AWS凭证和主密钥信息。创建外部阶段后,可使用
COPY
命令将数据加载到Snowflake表中。卸载数据时,数据文件会复制到外部阶段,并使用阶段中定义的主密钥进行加密,用户可使用支持客户端加密的客户端下载加密数据文件。
9. 密钥轮换
Snowflake中存储的所有数据默认使用强加密标准进行加密。用于加密数据的密钥会定期轮换,数据也会定期重新加密。
Snowflake以分层模型管理每个账户的密钥,该模型由四个级别组成:
- 根密钥
- 账户主密钥
- 表主密钥
- 文件密钥
这种分层密钥模型限制了每个密钥保护的数据量和使用时间。在该模型中,表主密钥加密单个表,文件密钥加密单个文件。密钥轮换确保密钥仅在有限时间内有效。
Snowflake会轮换超过30天的密钥,将其停用并创建新密钥。密钥激活时用于加密数据,停用后仅用于解密数据。当不再需要解密数据时,停用的密钥将被销毁。
10. 定期重新密钥
定期重新密钥功能仅在Snowflake企业版或更高版本中可用。与密钥轮换不同,密钥轮换中停用的密钥仍用于解密数据,而定期重新密钥可确保密钥定期销毁,所有由被销毁密钥加密的数据将使用新密钥重新加密。
在账户中启用定期重新密钥时,Snowflake会为超过1年的每个密钥创建新的加密密钥,重新加密之前密钥保护的数据,并销毁之前的密钥。由于数据使用新密钥重新加密,后续将使用该新密钥解密数据。
具有
ACCOUNTADMIN
角色的用户可使用
ALTER ACCOUNT
命令和
PERIODIC_DATA_REKEYING
关键字启用重新密钥功能:
alter account set PERIODIC_DATA_REKEYING = true;
定期重新密钥是Snowflake的后台进程,不会影响任何用户工作负载,即使在数据重新密钥时也是如此。
11. 客户管理密钥
Snowflake客户可在其Snowflake账户所在的云提供商中管理自己的客户管理密钥。每个云提供商都提供了自己的密钥管理服务:
- AWS:AWS密钥管理服务(KMS)
- Google Cloud:云密钥管理服务(Cloud KMS)
- Microsoft Azure:Azure密钥保管库
Snowflake提供了名为Tri-Secret Secure的功能,可通过将客户管理密钥与Snowflake管理的密钥组合创建复合主密钥。
客户选择维护客户管理密钥的原因包括:
- 访问控制:客户对其主密钥拥有完全控制权,如果密钥不与Snowflake共享,则无法访问数据。
- 禁用访问:客户可随时禁用对其主密钥的访问,从而禁用对Snowflake中数据的访问。这在安全事件发生时,需要立即禁用数据访问时特别有用。
Snowflake建议不要定期轮换客户管理密钥,因为密钥更改时可能无法解密数据。使用客户管理密钥时,必须根据与机密性、完整性和可用性相关的最佳实践保护密钥。如果客户管理密钥因任何原因对Snowflake无效或不可用,所有数据操作将暂停,直到密钥再次可用。Snowflake允许因常见问题(如网络通信故障)导致的最长10分钟的临时密钥不可用情况。10分钟后,Snowflake认为密钥不可用并停止数据操作,提供密钥后操作将恢复。
12. Tri-Secret Secure
Tri-Secret Secure功能在Snowflake业务关键版及更高版本中可用。其目的是通过将Snowflake维护的密钥与客户管理的密钥组合创建复合主密钥,保护Snowflake中的数据。该密钥位于密钥层次结构的顶层,不用于加密数据。
Tri-Secret Secure确保只有当客户管理密钥对Snowflake可用时,才能解密数据。要在账户中启用Snowflake Tri-Secret Secure,必须联系Snowflake支持。
13. 克隆
Snowflake的零复制克隆功能允许创建对象的副本,而无需实际创建对象的物理副本,因为两个对象最初共享相同的底层存储。
克隆表时,克隆表与原始表共享所有微分区,这意味着克隆表不会产生额外的存储成本。初始克隆后,原始表和克隆表遵循不同的数据生命周期,可独立在克隆表或原始表中插入、删除或更新数据。克隆表中的数据发生更改时,会创建仅由克隆表拥有的新微分区,这些新微分区会产生额外成本,因为它们不与原始表共享。
克隆可以无限次进行,没有创建克隆的数量或迭代次数限制。克隆主要用于创建数据库、模式和表的零复制克隆,也可用于创建克隆对象中包含的其他模式对象,如外部阶段、文件格式和序列的克隆。
克隆数据库或模式时,授予的权限继承规则如下:
- 克隆对象继承源对象中所有子对象克隆上授予的所有权限。
- 数据库或模式本身的克隆不继承源数据库或模式上授予的权限。
克隆命令不会将源对象上的授予权限复制到克隆对象,但支持
COPY GRANTS
子句的
CREATE
命令(如
CREATE TABLE
或
CREATE VIEW
)允许将授予权限复制到对象克隆。例如,克隆
NATION
表并复制授予权限创建
NATION_CLONED
表:
create table NATION_CLONED clone NATION COPY GRANTS;
克隆父容器时,关于克隆容器内子对象类型的一些注意事项如下:
- 对象参数:克隆对象继承源对象上设置的对象参数。
- 默认序列:克隆使用序列生成唯一值的表列时,如果包含表和序列的数据库或模式被克隆,克隆表将引用克隆的序列,否则引用源序列。
- 外键约束:克隆具有引用另一个表中主键的外键约束的表时,如果包含两个表的数据库或模式被克隆,具有外键的克隆表将引用克隆表中的主键,否则引用原始表中的主键。
- 聚类键:克隆具有聚类键的表时,新表将使用相同的聚类键创建。克隆后自动聚类将暂停,需要手动恢复。
- 外部阶段:外部命名阶段可以克隆。
- 内部阶段:内部命名阶段不能克隆。
- 管道:引用内部阶段的管道不能克隆。引用外部阶段的管道会被克隆,但克隆后需要手动恢复。
Snowflake数据保护与管理全解析
14. 总结与操作建议
为了更清晰地展示Snowflake数据保护与管理的关键要点,以下是一个总结表格:
| 功能 | 描述 | 操作命令示例 | 注意事项 |
| — | — | — | — |
| 数据保留期变更 | 更改数据库、模式或表的数据保留期 |
alter database SALES set DATA_RETENTION_TIME_IN_DAYS = 30;
| 子对象可能继承保留期,删除对象时建议先删子对象 |
| 查询历史数据 | 使用
AT | BEFORE
子句查询历史数据 |
select * from NATION before(statement => '01a7-xxxx-yyyy-a166') where n_name = 'FRANCE';
| 注意参数值不能超出数据保留期 |
| 克隆历史对象 | 使用
CLONE
关键字克隆对象 |
create table NATION_HISTORICAL clone NATION at(timestamp => '2022-04-15 11:30:00'::timestamp);
| 克隆时间点有要求,可能失败 |
| 删除和恢复对象 | 使用
DROP
删除对象,
UNDROP
恢复对象 |
drop table NATION; undrop table NATION;
| 恢复时不能重命名,需特定权限 |
| 故障安全(Failsafe) | 保护历史数据,用户不可访问 | 无直接操作命令,数据自动转移 | 7天保留期不可配置 |
| 时间旅行和故障安全成本 | 存储历史数据产生成本 | 无直接操作命令,按24小时计算 | 可选择合适表类型降低成本 |
| 数据加密 | 端到端加密确保数据安全 | 无直接操作命令,加载卸载自动处理 | 不同阶段加密方式不同 |
| 客户端加密 | 数据加载前加密 |
create stage ENCRYPTED_EXTERNAL_STAGE url = 's3://bucket/datafiles/' credentials = (aws_key_id = 'xxx' aws_secret_key = 'xxx') encryption = (master_key = 'xxx... = ');
| 需提供正确主密钥 |
| 密钥轮换 | 定期轮换加密密钥 | 无直接操作命令,Snowflake自动处理 | 超过30天的密钥会轮换 |
| 定期重新密钥 | 仅企业版及以上可用,定期销毁密钥 |
alter account set PERIODIC_DATA_REKEYING = true;
| 后台进程不影响用户工作负载 |
| 客户管理密钥 | 客户管理自己的密钥 | 无直接操作命令,使用云提供商服务 | 建议不常轮换,确保密钥可用性 |
| Tri - Secret Secure | 组合密钥保护数据 | 联系Snowflake支持启用 | 仅业务关键版及以上可用 |
| 克隆 | 零复制克隆对象 |
create table NATION_CLONED clone NATION COPY GRANTS;
| 权限继承有规则,子对象克隆有注意事项 |
以下是一个mermaid格式的流程图,展示了数据从创建到可能的删除、恢复以及加密保护的整个生命周期:
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(创建对象):::process --> B(数据操作):::process
B --> C{是否删除对象}:::process
C -->|是| D(对象进入时间旅行):::process
D --> E{时间旅行保留期结束}:::process
E -->|是| F(数据进入故障安全):::process
F --> G(故障安全7天结束):::process
G --> H(数据永久删除):::process
C -->|否| I(继续数据操作):::process
D --> J{是否恢复对象}:::process
J -->|是| K(使用UNDROP恢复):::process
K --> B
A --> L(数据加密):::process
L --> M(端到端加密):::process
M --> N(客户端加密):::process
M --> O(密钥轮换):::process
M --> P(定期重新密钥):::process
O --> Q(分层密钥管理):::process
操作建议
- 数据保留期管理 :根据业务需求合理设置数据保留期,对于重要数据可适当延长保留期。删除对象时,按照先子后父的顺序操作,避免数据意外丢失。
- 历史数据查询 :在进行历史数据查询时,准确记录查询ID和时间戳,确保查询参数在数据保留期内。
-
克隆操作
:克隆对象前,确认克隆时间点符合要求,避免克隆失败。对于需要保留权限的对象,使用
COPY GRANTS子句。 - 成本控制 :根据数据的重要性和使用频率,选择合适的表类型(临时表、临时模式表或永久表)来降低存储成本。
- 加密与密钥管理 :遵循最佳实践保护客户管理密钥,确保其可用性。对于企业版及以上用户,可考虑启用定期重新密钥功能,增强数据安全性。
通过以上对Snowflake数据保护与管理的全面解析,我们可以更好地利用Snowflake的各项功能,保障数据的安全性、可用性和可管理性,同时有效控制成本。在实际应用中,根据具体业务场景灵活运用这些功能和操作建议,将有助于提升数据管理的效率和质量。
超级会员免费看
24

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



