备份和不可变存储的快照

快照可帮助组织保护关键数据免遭修改或删除。

快照代表 Snowflake 对象的离散备份。您可以选择备份对象、备份频率、保留备份的时长以及是否添加保留锁定,这样它们就不会被过早删除。

快照用例

以下用例是快照的典型应用:

法规合规性:

带保留锁定的快照可帮助组织、金融机构和相关行业满足要求记录以不可变格式保留的法规。

重要

公共预览功能未经任何特定法规认证。Snowflake 打算在该功能正式发布时获得合规性认证。

恢复:

快照可帮助组织创建离散备份,以保护和恢复业务关键数据,以防意外修改或删除。

网络弹性:

带保留锁定的快照是整体网络弹性战略的一部分。它们帮助组织在网络攻击(尤其是勒索软件攻击)期间保护业务关键数据。保留锁定确保攻击者无法删除此类数据,即使他们使用 ACCOUNTADMIN 或 ORGADMIN 角色获得账户访问权限。

关键概念

本部分概述 Snowflake 中快照的关键概念。

快照

快照 代表对象的时间点备份。

  • 对象可以是单个表、架构或整个数据库。

  • 特定的快照可以通过 Snowflake 生成的唯一 ID 来识别。

  • 快照无法修改。但是,可以删除,并且可以修改快照的有效期(除非应用 保留锁定)。

在日常操作期间,您很少与单个快照进行交互。相反,您可以管理包含它们的 快照集。例如,您可以通过运行 SHOW SNAPSHOTS IN SNAPSHOT SET 命令来获得快照列表。您可以通过运行 ALTER SNAPSHOT SET 命令来创建新快照。

小技巧

Snowflake 在其他上下文中使用 快照 一词,例如块存储量或复制刷新期间传输的数据量。当需要将快照功能与其他类型的快照区分开时,我们指的是 WORM 快照,这意味着一次写入,多次读取。特别是,CREATE SNAPSHOT、ALTER SNAPSHOT、DROP SNAPSHOT、SHOW SNAPSHOTS 和 DESCRIBE SNAPSHOTS 语句都适用于其他类型的快照。

快照集

快照集 是架构级对象,包含特定数据库、架构或表的一组快照。Snowflake 提供 SQL 命令,用于对快照集进行 CREATE、ALTER、DROP、SHOW 和 DESCRIBE 操作。

您可以为同一个对象设置多个快照集。在公共预览期间,同一对象的快照集数量受到限制。有关更多信息,请参阅 公共预览期间快照的限制

集合内快照的生命周期由可选的 快照策略 决定,您可以将其附加到快照集。您还可以在快照集中手动添加或删除快照。您删除快照的能力受其他因素的影响,尤其是 保留锁定法律保留

快照策略

快照策略 是架构级对象,包含定义快照集内快照生命周期的设置。这些设置包括时间表、到期时间和保留锁定。

  • 时间表 决定何时创建快照。时间表可以定义为以分钟为单位的时间间隔,也可以定义为 cron 表达式。例如,如果将时间表设置为一小时,则每 60 分钟拍摄一次对象快照。

  • 到期期限 是快照的有效时长。快照到期后,Snowflake 会自动将其删除,除非对该特定快照进行了法律保留。

    小技巧

    如果快照集没有保留锁定且特定快照未应用法律保留,则可以在有效期结束之前手动删除快照。您可以手动逐一删除快照,始终从没有法律保留的最早快照开始。

每个快照策略都必须具有一个或两个计划和有效期属性。例如,您可以创建具有时间表和有效期的策略,并让 Snowflake 处理应用该策略的所有快照集中快照的创建和移除。或者,如果您想自己管理旧快照的移除,则可以创建有时间表且没有有效期的策略。或者,您可以创建有有效期但没有时间表的策略,然后自己管理快照创建。您无法创建没有时间表和有效期的策略。

如果将快照策略与快照集相关联,则可以在创建快照集时进行关联,也可以稍后应用该策略。或者,您可以拥有一个没有关联快照策略的快照集。在这种情况下,您可以手动控制何时拍摄新快照和使旧快照过期。

您可以将快照策略应用于多个快照集。如果您修改快照策略,Snowflake 会将变更应用到该策略所关联的所有快照集。

保留锁定

保留锁定 可保护快照在规定的有效期内不被删除。您可以使用带保留锁定的快照进行备份,以实现合规性和网络弹性。以下限制适用于具有保留锁定的快照集:

  • 任何角色(包括 ACCOUNTADMIN 角色)都无法删除快照。

  • 您无法缩短快照的有效期,但可以延长该期限。

  • 如果快照集中有任何未到期的快照,您无法删除该快照集。

  • 如果架构包含的快照集有任何未到期的快照,您无法删除该架构。

  • 如果数据库包含的快照集有任何未到期的快照,您无法删除该数据库。

  • 如果账户包含的数据库具有含任何未到期的快照的快照集,您无法删除该账户。

重要

对快照集应用带保留锁定的快照策略是 不可逆操作。由于监管合规性所需的强保障要求,对快照集设置保留锁定后,您将无法撤销该锁定。Snowflake 支持部门也无法撤销此类保留锁定。在对具有较长有效期的快照集设置保留锁定前,请谨慎规划,以避免产生不可删除的快照集及其所含模式和数据库的意外存储费用。

如果删除了 Snowflake 组织,该组织将不再是 Snowflake 客户。此种情况下,Snowflake 会删除所有快照(包括带保留锁定的快照)。删除 Snowflake 组织需要 Snowflake 支持部门介入。管理员不可能意外执行此操作。

快照生命周期概述

下图显示了 Snowflake 对象、快照、快照集和快照策略之间的关系。该图涉及最简单的快照:单个表的快照。每项备份操作都会生成一个新快照。该特定对象的所有快照都组合在一个快照集中。快照集中快照的自动添加和移除受快照策略的约束。要从快照中恢复信息,您可以使用 CREATE 命令从特定快照中创建新对象。

快照关键概念

快照的工作原理

快照是 Snowflake 对象的 零复制 备份,类似于 克隆。快照在创建时不会复制表数据。快照机制会备份表数据,而不会产生数据复制的额外成本或时间。

Snowflake 将数据存储在不可变的文件中,并维护从快照指向表底层数据文件的指针。随着表的演变和修改,只要有引用该文件的未到期快照,Snowflake 就会确保每个数据文件免遭删除。

快照的限制

Snowflake 对快照强制执行以下限制:

  • 您无法修改快照策略的保留锁定。

  • 当策略有保留锁定时,您可以延长到期期限,但不能缩短到期期限。

  • 定时快照的最小计划间隔为 1 小时(60 分钟)。

公共预览期间快照的限制

当快照功能正式发布时,以下限制可能会发生变化:

  • 当您为快照设置定期计划时,Snowflake 会根据计划快照的频率规定最长保留期。在快照策略中,EXPIRE_AFTER_DAYS 属性根据关联的 SCHEDULE 属性受到限制,如下所示:

    • 频率为 60 到 119 分钟的快照策略的最大 EXPIRE_AFTER_DAYS 值为 90。

    • 频率为 120 分钟到 23 小时 59 分钟的快照策略的最大 EXPIRE_AFTER_DAYS 值为 180。

    • 频率为 24 小时或更长时间的快照策略的最大 EXPIRE_AFTER_DAYS 值为 366。

    • 没有计划的快照策略的最大 EXPIRE_AFTER_DAYS 值为 3653。

  • 您最多可以为特定数据库创建两个数据库快照集。同样,您最多可以为特定架构创建两个架构快照集,为特定表创建两个表快照集。一个对象可能仍出现在两个以上的快照集中。例如,一个表可能有一个或两个关联的表快照集。同一个表也可能包含在一个或两个架构快照集中,以及一个或两个数据库快照集中。

  • 将快照策略应用于快照集后,您无法从该快照集中移除该策略。

快照与其他灾难恢复和业务连续性功能的比较

快照具有以下优势,这些优势与其他业务连续性和灾难恢复功能(例如复制和 Time Travel)不同:

  • 您可以为快照启用长期保留。长期保留有助于恢复、合规和网络弹性,以抵御勒索软件或内部攻击等威胁。

  • 保留锁定确保任何用户(包括账户管理员)都无法删除快照。

  • 您可以将快照安排在与其他数据传输操作(例如复制刷新)不同的时间范围内。

  • 您可以对单个表对象或容器对象(例如整个架构或数据库)进行快照拍摄和恢复。

  • 通过使用包含保留锁定的快照策略,您可以防止备份后缩短备份的保留时间。这与 Time Travel 功能不同,在 Time Travel 功能中,您可以将保留间隔缩短到零。

  • 与 Time Travel 和故障安全不同,快照可以保存来自更多类型对象的数据,而不仅仅是表和表数据。

  • 备份的速度和存储效率类似于用于克隆的零复制机制。

  • 与使用克隆实现自己的备份机制相比,将同一对象的所有快照组合到快照集中的方式使管理更加简单。例如,您不必管理大量对象,不必设计命名架构来跟踪克隆对象,也不必实施计划机制来删除旧克隆。此外,与克隆对象不同,快照在创建后无法修改。

  • 每个快照代表截至指定时间点的单个表、架构或数据库。快照不包含账户级对象,例如用户或角色。某些类型的表和其他数据库级对象不包含在架构和数据库快照中。有关更多信息,请参阅 快照对象

  • 与快照相关的对象与关联的数据库、架构或表存储在同一个云服务提供商 (CSP) 区域中。对于业务连续性和灾难恢复场景,您通常将快照与 Snowflake 账户复制相结合。这样,所有快照集和快照策略都可以复制到不同的区域或不同的 CSP,即使出现影响原始区域或 CSP 的停机也能恢复。

  • 无法克隆快照集和快照策略。如果您克隆包含此类对象的架构或数据库,则它们不会包含在克隆的架构或数据库中。

快照对象

您可以为表、架构和数据库创建快照集。

从表到其他对象的引用

对象(例如视图或函数)可以引用快照中架构或数据库之外的对象。为确保此类引用在您从快照恢复后继续运行,请使用以下策略之一:

  • 如果表及其引用的其他对象都在同一个架构或同一个数据库中,则为整个架构或数据库创建快照集。这样,当您从快照恢复时,Snowflake 可以一次恢复所有相互连接的对象。

  • 如果快照集中的对象引用未包含在快照集中的对象,请注意,恢复快照时,恢复对象的引用指向来自其他数据库或架构的原始对象。如果您在拍摄快照后删除了这些其他对象或更改了其属性,则在访问恢复的对象时可能会遇到错误。

  • 对于账户级对象,来自恢复对象的任何引用 始终 指向原始账户级对象。那是因为账户级对象不是任何快照的一部分。例如,架构快照可能包含一个涉及安全集成的密钥。安全集成是账户级对象,不能包含在任何快照中。

数据库和架构快照中的对象类型

下表列出了数据库或架构快照中包含的对象:

对象

包含在快照中

备注

永久表

表的 Time Travel 信息不作为快照的一部分存储。

瞬态表

恢复这些表后,它们仍然是临时表。恢复瞬态架构和瞬态数据库后,它们也会保留瞬态属性。

临时表

临时表受会话范围限制,不包含在快照中。

动态表

动态表有自己的快照数据定义语言 (DDL) 语法。您可以运行 CREATE SNAPSHOT SET FOR DYNAMIC TABLE 和 CREATE DYNAMIC TABLE FROM SNAPSHOT SET 命令。当您从快照恢复动态表时,Snowflake 会在首次刷新新表时 自动初始化 新表。

外部表

混合表

Apache Iceberg™ 表

表约束条件

事件表

序列

视图

物化视图

安全视图

文件格式

内部暂存区

外部暂存区

临时暂存区

目录表

管道

存储过程

SQL、Javascript、Python、Java 和 Scala 过程都受支持。

用户定义的函数 (UDFs)

SQL、Javascript、Python、Java 和 Scala 函数都受支持。标量 UDFs 和用户定义的表函数 (UDTFs) 都包含在快照中。Java UDFs 在快照中与在 :ref:`label-limitations_on_cloning_java_udfs`中具有相同的要求。

任务

任务包含在快照中。从快照恢复的任务已暂停,必须恢复。

数据指标函数 (DMFs)

策略

架构或数据库快照中包含以下类型的策略:

  • 列级安全性(掩码)

  • 行访问策略

  • 基于标签的掩码策略

如果快照中包含的任何表应用了任何其他类型的策略,例如聚合策略或投影策略,则快照创建会失败。

权限

如果您删除某个角色,则关联的所有权授权将转移到执行 DROP ROLE 命令的角色。在这种情况下,所有权以外的授权将被删除。因此,恢复对象的授权可能与创建快照时存在的授权不同。

数据库角色

Object Tagging

警报

网络规则

Github 存储库

模型

模型监视器

数据集

笔记本

联系人

Cortex Search Service

Dbt 项目

镜像仓库

列表

组织列表

管道

策略(聚合)

策略(身份验证)

策略(功能)

策略(联接)

策略(包)

策略(密码)

策略(隐私)

策略(投影)

策略(会话)

预置吞吐量

语义视图

服务

Streamlit

Snowflake 如何将对象与其快照集相关联

当您为数据库、架构或表创建快照集时,Snowflake 会将快照集与该数据库、架构或表的内部 ID 关联。如果您删除原始对象,则无法再向该快照集添加任何快照。即使您重新创建同名对象,或者将其替换为从快照恢复的对象,此行为也适用。

如果您改为重命名原始对象,则可以通过向同一快照集添加更多快照来继续对其进行更多备份。在这种情况下,SHOW SNAPSHOT SETS 的输出会更改以反映重命名对象的 OBJECT_NAME 值。

如果您想备份某个表,但您频繁删除并重新创建该表(可能通过 CREATE OR REPLACE 语句),请将其包含在包含该表的架构或数据库的快照集中。这样,无论表有何更改,您都可以继续使用相同的快照集。

当您从快照恢复表时,恢复的表以不同于原始表的名称开头。假设您想要将原始表的内容完全替换为快照数据,并继续使用相同的快照集对同一表进行更多备份。在这种情况下,使用 TRUNCATE 或 DELETE 语句移除原始表的内容,并使用 INSERT ... SELECT 语句从恢复的表中复制数据。不要删除原始表,也不要将恢复的表重命名为原始表的名称。

快照和加密

快照集中的数据受与其他 Snowflake 对象和表数据相同的端到端加密保护。有关 Snowflake 加密的更多信息,请参阅 了解 Snowflake 中的端到端加密

密钥轮换也适用于快照中的数据。

快照和数据沿袭

Snowflake 不使用数据库、架构和表快照保留 数据沿袭 元数据。从快照恢复对象后,您无法使用 Snowsight 查看恢复的数据的沿袭信息。

快照成本

下表描述了快照的费用。

成本组成部分

描述

在公共预览期间计费

快照计算

Snowflake 管理的计算服务生成计划的快照创建和到期。

恢复计算

Snowflake 管理的仓库用于从快照中恢复对象。

快照存储

Snowflake 管理的云对象存储,用于存储快照数据。

按快照的保留字节计费,类似于为克隆保留的字节。

您可以使用 RETAINED_FOR_CLONE_BYTES 列在 TABLE_STORAGE_METRICS 视图中监控快照存储成本,也可以在 SNAPSHOT_STORAGE_USAGE 视图中监控。

访问控制权限

下表列出了权限以及被授予管理和使用快照权限的对象类型。

权限

对象类型

描述

CREATE SNAPSHOT POLICY

架构

授予在架构中创建快照策略的能力。授予此权限的角色还必须对架构具有 USAGE 权限。

CREATE SNAPSHOT SET

架构

授予在架构中创建快照集的能力。授予此权限的角色还必须对架构具有 USAGE 权限。实际创建快照集还需要对快照集目标对象具备相应权限:表快照需要 SELECT 权限,架构快照或数据库快照需要 USAGE 权限。

APPLY

快照策略

授予应用特定快照策略的功能。只有拥有 ACCOUNTADMIN 角色的用户才能授予此权限。

APPLY SNAPSHOT RETENTION LOCK

账户

授予创建和应用具有保留锁定的快照策略的能力。此权限已授予给 ACCOUNTADMIN 角色并且可以委托。

要使角色能够执行以下操作,需要此权限:

  • 创建具有保留锁定的快照策略。

  • 对快照集应用具有保留锁定的快照策略。

  • 在受具有保留锁定的策略保护的快照集中创建快照,可以由用户手动创建,也可以按计划自动创建。

APPLY LEGAL HOLD

账户

授予在快照中添加或移除法律保留的功能。默认情况下,该 ACCOUNTADMIN 角色具有此权限。

授予创建快照策略和集所需的权限

备注

  • 用于授予这些权限的角色必须具有架构的 OWNERSHIP 权限,或者必须具有 CREATE SNAPSHOT SET 或 CREATE SNAPSHOT POLICY 权限 WITH GRANT OPTION。

  • 您可以向自定义账户角色或数据库角色授予以下权限。

要使角色 myrole 能够在架构 myschema 中创建快照策略,请执行以下语句:

GRANT CREATE SNAPSHOT POLICY ON SCHEMA policy_schema TO ROLE myrole;
Copy

要使角色 myrole 能够在架构 myschema 中创建快照集,请执行以下语句:

GRANT CREATE SNAPSHOT SET ON SCHEMA policy_schema TO ROLE myrole;
Copy

向角色授予快照策略的 APPLY 权限

备注

  • 只有拥有 ACCOUNTADMIN 角色的用户才能授予此权限。

  • 您可以向自定义账户角色或数据库角色授予此权限。

要使角色 myrole 能够将快照策略 hourly_snapshot_policy 应用到快照集,请执行以下语句:

GRANT APPLY ON SNAPSHOT POLICY hourly_snapshot_policy TO ROLE myrole;
Copy

向角色授予 APPLY SNAPSHOT RETENTION LOCK 权限

您可以向角色授予在快照集上应用具有保留锁定的快照策略的权限。

只有拥有 ACCOUNTADMIN 角色的用户才能授予此权限。

重要

对快照集应用带保留锁定的快照策略是 不可逆操作。由于监管合规性所需的强保障要求,对快照集设置保留锁定后,您将无法撤销该锁定。Snowflake 支持部门也无法撤销此类保留锁定。在有效期结束之前,使用保留锁定创建的快照无法删除。

如果删除了 Snowflake 组织,该组织将不再是 Snowflake 客户。此种情况下,Snowflake 会删除所有快照(包括带保留锁定的快照)。

要使角色 retention_lock_admin_role 能够对快照集应用具有保留锁定的快照策略,请执行以下语句:

GRANT APPLY SNAPSHOT RETENTION LOCK ON ACCOUNT TO ROLE retention_lock_admin_role;
Copy

创建和配置快照

本部分提供创建和恢复快照的示例工作流程。

创建计划快照

创建按计划自动创建快照的快照集。

  1. 使用 CREATE SNAPSHOT POLICY 命令创建快照策略。例如,从创建快照集之时起,以下策略每小时创建一次快照。每个快照在 90 天后到期。

    CREATE SNAPSHOT POLICY hourly_snapshot_policy
      SCHEDULE = '60 MINUTE'
      EXPIRE_AFTER_DAYS = 90
      COMMENT = 'Hourly backups expire after 90 days';
    
    Copy
  2. 为表 t1 创建快照集并附加快照策略 hourly_snapshot_policy

    CREATE SNAPSHOT SET t1_snapshots
      FOR TABLE t1
      WITH SNAPSHOT POLICY hourly_snapshot_policy;
    
    Copy
  3. 为架构 s1 创建快照集并附加快照策略 hourly_snapshot_policy

    CREATE SNAPSHOT SET s1_snapshots
      FOR SCHEMA s1
      WITH SNAPSHOT POLICY hourly_snapshot_policy;
    
    Copy
  4. 为数据库 d1 创建快照集并附加快照策略 hourly_snapshot_policy

    CREATE SNAPSHOT SET d1_snapshots
      FOR DATABASE d1
      WITH SNAPSHOT POLICY hourly_snapshot_policy;
    
    Copy

创建具有保留锁定的计划快照

创建快照集,按计划自动创建具有保留锁定的快照。保留锁定可防止任何人(甚至是特权用户)删除或修改该策略所附加到的任何快照集中的快照。

只有拥有账户 APPLY SNAPSHOT RETENTION LOCK 权限的角色才能创建具有保留锁定的快照策略。

重要

对快照集应用带保留锁定的快照策略是 不可逆操作。由于监管合规性所需的强保障要求,对快照集设置保留锁定后,您将无法撤销该锁定。Snowflake 支持部门也无法撤销此类保留锁定。在有效期结束之前,使用保留锁定创建的快照无法删除。

如果删除了 Snowflake 组织,该组织将不再是 Snowflake 客户。此种情况下,Snowflake 会删除所有快照(包括带保留锁定的快照)。

  1. 创建具有保留锁定的策略,用于创建有效期为 90 天的每日快照:

    CREATE SNAPSHOT POLICY daily_snapshot_policy_with_lock
      WITH RETENTION LOCK
      SCHEDULE = '1440 MINUTE'
      EXPIRE_AFTER_DAYS = 90
      COMMENT = 'regulatory backups: they have a retention lock and expire after 90 days';
    
    Copy
  2. 为表 t2 创建快照集并附加快照策略 daily_snapshot_policy_with_lock

    CREATE SNAPSHOT SET t2_snapshots
      FOR TABLE t2
      WITH SNAPSHOT POLICY daily_snapshot_policy_with_lock;
    
    Copy
  3. 为架构 s2 创建快照集并附加快照策略 daily_snapshot_policy_with_lock

    CREATE SNAPSHOT SET s2_snapshots
      FOR SCHEMA s2
      WITH SNAPSHOT POLICY daily_snapshot_policy_with_lock;
    
    Copy
  4. 为数据库 d2 创建快照集并附加快照策略 daily_snapshot_policy_with_lock

    CREATE SNAPSHOT SET d2_snapshots
      FOR DATABASE d2
      WITH SNAPSHOT POLICY daily_snapshot_policy_with_lock;
    
    Copy

手动创建快照

您可以随时手动向快照集添加快照。此操作会生成与快照集关联的数据库、架构或表的快照。无论快照集是否还有按快照策略计划的快照,您都可以手动创建快照。如果存在与快照集关联的快照策略,并且该策略定义了有效期,则该有效期也适用于手动创建的快照。

以下示例创建了一个表快照集 t1_snapshots,然后向其添加第一个快照:

CREATE SNAPSHOT SET t1_snapshots FOR TABLE t1;
ALTER SNAPSHOT SET t1_snapshots ADD SNAPSHOT;
Copy

以下示例创建了一个包含每小时备份的快照策略、一个使用该策略的表快照集 t2_snapshots,然后向该快照集添加手动创建的快照:

CREATE SNAPSHOT POLICY hourly_snapshot_policy
  SCHEDULE = '60 MINUTE'
  EXPIRE_AFTER_DAYS = 7;

CREATE SNAPSHOT SET t2_snapshots FOR TABLE t2 WITH SNAPSHOT POLICY hourly_snapshot_policy;
-- Wait several hours. Then the snapshot set already contains several scheduled snapshots.
-- You can manually add a snapshot at any time, in addition to the scheduled snapshots.
ALTER SNAPSHOT SET t2_snapshots ADD SNAPSHOT;
Copy

您可以运行类似的命令,将快照添加到架构或数据库快照集。替换 ALTER SNAPSHOT SET 命令中架构或数据库快照集的名称。

暂停快照集的快照策略

当您暂停快照集的快照策略时,会阻止该快照策略用于在该快照集中创建新的计划快照。您还可以暂停该快照集中使用快照策略的现有快照的到期时间。使用相同策略的其他快照集不受影响。

以下示例暂停快照集 t2_snapshots 的快照策略:

ALTER SNAPSHOT SET t2_snapshots SUSPEND SNAPSHOT POLICY;
Copy

有关 ALTER SNAPSHOT SET 命令的更多信息,请参阅 ALTER SNAPSHOT SET

恢复快照集的快照策略

您可以恢复已暂停的快照策略。根据快照策略,此操作会恢复快照的创建和到期。如果在策略暂停期间有任何快照已达到到期时间,Snowflake 将在策略恢复后立即删除这些快照。

以下示例恢复快照集 t1_snapshot 的快照策略:

ALTER SNAPSHOT SET t1_snapshots
  RESUME SNAPSHOT POLICY;
Copy

有关 ALTER SNAPSHOT SET 命令的更多信息,请参阅 ALTER SNAPSHOT SET

恢复快照

您可以使用特定快照的 ID,从快照集恢复对象。例如,要从当前架构中的快照集 t1_snapshots 恢复表 t1,请执行以下语句:

  1. snapshot_id 列中找到要恢复的表快照的 ID:

    SHOW SNAPSHOTS IN SNAPSHOT SET t1_snapshots ->> SELECT "created_on", "snapshot_id", "expire_on" FROM $1;
    
    Copy
    +-------------------------------+--------------------------------------+-------------------------------+
    | created_on                    | snapshot_id                          | expire_on                     |
    |-------------------------------+------------------------------------------+---------------------------|
    | 2024-08-19 17:12:28.991 -0700 | 983e0b66-91eb-41cb-8a0b-037abfec1914 | 2024-08-20 17:12:28.991 -0700 |
    | 2024-08-19 18:12:33.824 -0700 | b5624ef0-1f35-452f-b132-09d8f0592e52 | 2024-08-20 18:12:33.824 -0700 |
    | 2024-08-19 19:12:43.830 -0700 | eca1a94a-fd40-46db-a2bc-4afba6a38c0a | 2024-08-20 19:12:43.830 -0700 |
    | 2024-08-19 20:12:45.446 -0700 | 8ee2fd7e-1afe-42e1-acd7-79582765a910 | 2024-08-20 20:12:45.446 -0700 |
    | 2024-08-19 21:12:55.305 -0700 | d38caf14-f8a5-4ba8-a248-8287e0cdcf40 | 2024-08-20 21:12:55.305 -0700 |
    +-------------------------------+--------------------------------------+-----------+-------------------+
    
  2. snapshot_id 列中找到要恢复的架构快照的 ID:

    SHOW SNAPSHOTS IN SNAPSHOT SET s1_snapshots;
    
    Copy
    +-------------------------------+--------------------------------------+-------------------------------+
    | created_on                    | snapshot_id                          | expire_on                     |
    |-------------------------------+--------------------------------------+-------------------------------|
    | 2024-08-19 17:12:28.991 -0700 | 0a0382e1-d265-46e9-b152-4c3b2b859e65 | 2024-08-20 17:12:28.991 -0700 |
    | 2024-08-19 18:12:33.824 -0700 | 8dbcf919-3393-4590-928f-5481d7f2502f | 2024-08-20 18:12:33.824 -0700 |
    | 2024-08-19 19:12:43.830 -0700 | 8ee2fd7e-1afe-42e1-acd7-79582765a910 | 2024-08-20 19:12:43.830 -0700 |
    | 2024-08-19 20:12:45.446 -0700 | bd729a79-01bc-444d-a550-adaaa31ab62f | 2024-08-20 20:12:45.446 -0700 |
    | 2024-08-19 21:12:55.305 -0700 | 9a8802c5-5fbd-4200-a09d-43e046103939 | 2024-08-20 21:12:55.305 -0700 |
    +-------------------------------+--------------------------------------+-------------------------------+
    
  3. snapshot_id 列中找到要恢复的数据库快照的 ID:

    SHOW SNAPSHOTS IN SNAPSHOT SET d1_snapshots;
    
    Copy
    +-------------------------------+--------------------------------------+-------------------------------+
    | created_on                    | snapshot_id                          | expire_on                     |
    |-------------------------------+--------------------------------------+-------------------------------|
    | 2024-08-19 17:12:28.991 -0700 | 42435925-4e77-4b01-ba89-8163ac03e12f | 2024-08-20 17:12:28.991 -0700 |
    | 2024-08-19 18:12:33.824 -0700 | 29c2c1b9-6599-4f0b-87b8-d43377fd7c77 | 2024-08-20 18:12:33.824 -0700 |
    | 2024-08-19 19:12:43.830 -0700 | a4283984-a063-4415-acc4-0e3c19259fad | 2024-08-20 19:12:43.830 -0700 |
    | 2024-08-19 20:12:45.446 -0700 | ffe25397-64b9-4c5f-b061-23a1885dc2dc | 2024-08-20 20:12:45.446 -0700 |
    | 2024-08-19 21:12:55.305 -0700 | 28e12b8a-aab8-40a8-ae39-9a5a5f654d66 | 2024-08-20 21:12:55.305 -0700 |
    +-------------------------------+--------------------------------------+-------------------------------+
    
  4. 恢复在 2024 年 8 月 19 日 18:12:33 拍摄的表 t1 的快照:

    CREATE TABLE restored_t1 FROM SNAPSHOT SET t1_snapshots IDENTIFIER 'b5624ef0-1f35-452f-b132-09d8f0592e52';
    
    Copy
  5. 恢复在 2024 年 8 月 19 日 18:12:33 拍摄的架构 s1 的快照:

    CREATE SCHEMA restored_s1 FROM SNAPSHOT SET s1_snapshots IDENTIFIER '8dbcf919-3393-4590-928f-5481d7f2502f';
    
    Copy
  6. 恢复在 2024 年 8 月 19 日 18:12:33 拍摄的数据库 d1 的快照:

    CREATE DATABASE restored_d1 FROM SNAPSHOT SET d1_snapshots IDENTIFIER '29c2c1b9-6599-4f0b-87b8-d43377fd7c77';
    
    Copy

从快照集中删除快照

对于任何快照集,您只能删除没有法律保留的最早快照。您可以通过指定快照 ID 来完成此操作。您可以通过检查 is_under_legal_hold 属性来找到没有法律保留的快照。您可以通过检查 created_on 属性来找到最早的快照。

备注

如果将具有保留锁定的快照策略附加到快照集,或者该特定快照已应用法律保留,则无法从该快照集中删除任何快照。

您从快照集中删除的快照必须是该快照集中最早的快照。

  1. 在以下输出的 snapshot_id 列中找到要删除的表快照的 ID。按 created_on 列升序排序,将最早的快照放在首位。您可以向 SELECT 命令添加 LIMIT 1,仅返回包含最早快照的详细信息的行。

    SHOW SNAPSHOTS IN SNAPSHOT SET t1_snapshots ->>
      SELECT "created_on", "snapshot_id", "expire_on" FROM $1
        WHERE "is_under_legal_hold" = 'N'
        ORDER BY "created_on";
    
    Copy
    +-------------------------------+--------------------------------------+-------------------------------+
    | created_on                    | snapshot_id                          | expire_on                     |
    |-------------------------------+--------------------------------------+-------------------------------|
    | 2024-08-19 17:12:28.991 -0700 | 983e0b66-91eb-41cb-8a0b-037abfec1914 | 2024-08-20 17:12:28.991 -0700 |
    | 2024-08-19 18:12:33.824 -0700 | b5624ef0-1f35-452f-b132-09d8f0592e52 | 2024-08-20 18:12:33.824 -0700 |
    | 2024-08-19 19:12:43.830 -0700 | eca1a94a-fd40-46db-a2bc-4afba6a38c0a | 2024-08-20 19:12:43.830 -0700 |
    | 2024-08-19 20:12:45.446 -0700 | 8ee2fd7e-1afe-42e1-acd7-79582765a910 | 2024-08-20 20:12:45.446 -0700 |
    | 2024-08-19 21:12:55.305 -0700 | d38caf14-f8a5-4ba8-a248-8287e0cdcf40 | 2024-08-20 21:12:55.305 -0700 |
    +-------------------------------+--------------------------------------+-------------------------------+
    
  2. 使用 snapshot_id 删除在 2024 年 8 月 19 日 17:12:28 创建的 t1_snapshots 快照:

    ALTER SNAPSHOT SET t1_snapshots DELETE SNAPSHOT IDENTIFIER '983e0b66-91eb-41cb-8a0b-037abfec1914';
    
    Copy
  3. 在以下输出的 snapshot_id 列中找到要删除的架构快照的 ID。

    SHOW SNAPSHOTS IN SNAPSHOT SET s1_snapshots ->>
      SELECT "created_on", "snapshot_id", "expire_on" FROM $1 ORDER BY "created_on";
    
    Copy
    +-------------------------------+--------------------------------------+-------------------------------+
    | created_on                    | snapshot_id                          | expire_on                     |
    |-------------------------------+--------------------------------------+-------------------------------|
    | 2024-08-19 17:12:28.991 -0700 | 28e12b8a-aab8-40a8-ae39-9a5a5f654d66 | 2024-08-20 17:12:28.991 -0700 |
    | 2024-08-19 18:12:33.824 -0700 | 46a1e22a-8557-432f-a14c-1261a4ca2b34 | 2024-08-20 18:12:33.824 -0700 |
    | 2024-08-19 19:12:43.830 -0700 | 3e42fef6-b895-4055-a59f-179744d015d3 | 2024-08-20 19:12:43.830 -0700 |
    | 2024-08-19 20:12:45.446 -0700 | 7807d24e-285e-4741-b332-87c32bad5cb6 | 2024-08-20 20:12:45.446 -0700 |
    | 2024-08-19 21:12:55.305 -0700 | e022e619-ee83-45a0-b2b7-9007e284bdb3 | 2024-08-20 21:12:55.305 -0700 |
    +-------------------------------+--------------------------------------+-------------------------------+
    
  4. 使用 snapshot_id 删除在 2024 年 8 月 19 日 17:12:28 创建的 s1_snapshots 快照:

    ALTER SNAPSHOT SET s1_snapshots DELETE SNAPSHOT IDENTIFIER '28e12b8a-aab8-40a8-ae39-9a5a5f654d66';
    
    Copy
  5. 在以下输出的 snapshot_id 列中找到要删除的数据库快照的 ID。

    SHOW SNAPSHOTS IN SNAPSHOT SET d1_snapshots ->>
      SELECT "created_on", "snapshot_id", "expire_on" FROM $1 ORDER BY "created_on";
    
    Copy
    +-------------------------------+--------------------------------------+-------------------------------+
    | created_on                    | snapshot_id                          | expire_on                     |
    |-------------------------------+--------------------------------------+-------------------------------|
    | 2024-08-19 17:12:28.991 -0700 | d3a77432-c98d-4969-91a9-fffae5dd655c | 2024-08-20 17:12:28.991 -0700 |
    | 2024-08-19 18:12:33.824 -0700 | 0a0382e1-d265-46e9-b152-4c3b2b859e65 | 2024-08-20 18:12:33.824 -0700 |
    | 2024-08-19 19:12:43.830 -0700 | 25e01ee0-ea9d-4bb7-af7f-f3fe87f9409e | 2024-08-20 19:12:43.830 -0700 |
    | 2024-08-19 20:12:45.446 -0700 | a12294f5-fc63-49cf-84f1-c7b72f7664af | 2024-08-20 20:12:45.446 -0700 |
    | 2024-08-19 21:12:55.305 -0700 | 28e12b8a-aab8-40a8-ae39-9a5a5f654d66 | 2024-08-20 21:12:55.305 -0700 |
    +-------------------------------+--------------------------------------+-------------------------------+
    
  6. 使用 snapshot_id 删除在 2024 年 8 月 19 日 17:12:28 创建的 d1_snapshots 快照:

    ALTER SNAPSHOT SET d1_snapshots DELETE SNAPSHOT IDENTIFIER 'd3a77432-c98d-4969-91a9-fffae5dd655c';
    
    Copy
  7. 尝试删除在 2024 年 8 月 19 日 21:12:55 创建的更新 d1_snapshots 快照。注意 Snowflake 如何防止您删除快照集中最早快照以外的快照。

    ALTER SNAPSHOT SET d1_snapshots DELETE SNAPSHOT IDENTIFIER '28e12b8a-aab8-40a8-ae39-9a5a5f654d66';
    
    Copy
    Snapshot '28e12b8a-aab8-40a8-ae39-9a5a5f654d66' cannot be deleted as it is not the oldest active snapshot in the snapshot set D1_SNAPSHOTS.
    

删除快照集

您可以使用 DROP SNAPSHOT SET 命令删除快照集。

备注

您无法删除具有保留锁定且包含未到期快照的快照集。如果快照集中有任何快照具有法律保留,您也无法删除该快照集。

删除 t1_snapshots 快照集:

DROP SNAPSHOT SET t1_snapshots;
Copy

删除 s1_snapshots 快照集:

DROP SNAPSHOT SET s1_snapshots;
Copy

删除 d1_snapshots 快照集:

DROP SNAPSHOT SET d1_snapshots;
Copy

查找所有包含特定表备份的快照集

以下示例说明如何在特定架构和数据库中查找包含特定表的所有快照集。SHOW TABLES 命令使用管道运算符检索数据库、架构和表的名称,并将它们存储在变量中。对 SHOW SNAPSHOT SETS 输出进行筛选以显示快照集,该快照集备份包含该表的数据库,或者包含该表或单个表的架构。

SHOW SNAPSHOT SETS 的筛选输出显示有两个针对数据库 MY_BIG_IMPORTANT_DATABASE 的数据库快照集、一个针对架构 MY_BIG_IMPORTANT_DATABASE.PUBLIC 的快照集,以及一个针对表 MY_BIG_IMPORTANT_DATABASE.PUBLIC.MY_SMALL_SECONDARY_TABLE 的表快照集。

SHOW TABLES IN SCHEMA public ->>
  SET (dname, sname, tname) =
    (SELECT "database_name", "schema_name", "name" FROM $1
      WHERE "name" = 'MY_SMALL_SECONDARY_TABLE' AND "kind" = 'TABLE');

SHOW SNAPSHOT SETS ->> SELECT "object_kind", "name", "database_name", "schema_name", "object_name" FROM $1
  WHERE ("object_kind" = 'TABLE' AND "database_name" = $dname AND "schema_name" = $sname AND "object_name" = $tname)
    OR ("object_kind" = 'SCHEMA' AND "database_name" = $dname AND "object_name" = $sname)
    OR ("object_kind" = 'DATABASE' AND "object_name" = $dname);
Copy
+-------------+------------------+---------------------------+-------------+---------------------------+
| object_kind | name             | database_name             | schema_name | object_name               |
|-------------+------------------+---------------------------+-------------+---------------------------|
| DATABASE    | DATABASE_BACKUP  | MY_BIG_IMPORTANT_DATABASE | PUBLIC      | MY_BIG_IMPORTANT_DATABASE |
| DATABASE    | DATABASE_BACKUP2 | MY_BIG_IMPORTANT_DATABASE | PUBLIC      | MY_BIG_IMPORTANT_DATABASE |
| SCHEMA      | SCHEMA_BACKUP3   | MY_BIG_IMPORTANT_DATABASE | PUBLIC      | PUBLIC                    |
| TABLE       | TABLE_BACKUP2    | MY_BIG_IMPORTANT_DATABASE | PUBLIC      | MY_SMALL_SECONDARY_TABLE  |
+-------------+------------------+---------------------------+-------------+---------------------------+

为具有依赖关系的表创建快照

以下示例显示如何为引用不同架构中序列和外键的表创建表快照。为做好准备,我们创建了包含序列和表的架构 other_schema。然后,我们在 public 架构中创建主表,引用序列和其他表。

USE DATABASE my_big_important_database;

CREATE SCHEMA other_schema;
USE SCHEMA other_schema;

CREATE SEQUENCE my_sequence;
CREATE TABLE my_dimension_table (id INT AUTOINCREMENT PRIMARY KEY);

USE SCHEMA public;
CREATE TABLE dependent_table
(
   id INT DEFAULT my_big_important_database.other_schema.my_sequence.NEXTVAL PRIMARY KEY,
   foreign_id INT,
   FOREIGN KEY (foreign_id) REFERENCES my_big_important_database.other_schema.my_dimension_table(id)
 );

SELECT GET_DDL('TABLE','dependent_table');
Copy

GET_DDL() 输出显示指向其他架构的引用:

+-------------------------------------------+
| GET_DDL('TABLE','DEPENDENT_TABLE')        |
|-------------------------------------------|
| create or replace TABLE DEPENDENT_TABLE ( |
|     ID NUMBER(38,0) NOT NULL DEFAULT MY_BIG_IMPORTANT_DATABASE.OTHER_SCHEMA.MY_SEQUENCE.NEXTVAL,
|     FOREIGN_ID NUMBER(38,0),                |
|     primary key (ID),                       |
|     foreign key (FOREIGN_ID) references MY_BIG_IMPORTANT_DATABASE.OTHER_SCHEMA.MY_DIMENSION_TABLE(ID)
| );                                        |
+-------------------------------------------+

接下来,我们为该表创建快照集并向其添加快照:

CREATE SNAPSHOT SET dependency_experiments FOR TABLE dependent_table;
ALTER SNAPSHOT SET dependency_experiments ADD SNAPSHOT;
SHOW SNAPSHOTS IN SNAPSHOT SET dependency_experiments;
Copy

SHOW SNAPSHOTS 输出包含用于恢复操作的 snapshot_id 值:

+-------------------------------+--------------------------------------+------------------------+---------------------------+--------------+-----------+
| created_on                    | snapshot_id                          | snapshot_set_name      | database_name             | schema_name  | expire_on |
|-------------------------------+--------------------------------------+------------------------+---------------------------+--------------+-----------|
| 2025-07-01 11:53:27.860 -0700 | 0fd44138-b571-449b-be0a-72779501f80e | DEPENDENCY_EXPERIMENTS | MY_BIG_IMPORTANT_DATABASE | OTHER_SCHEMA | NULL      |
+-------------------------------+--------------------------------------+------------------------+---------------------------+--------------+-----------+

我们使用新名称恢复该表,并确认恢复的表引用其他架构中的对象:

CREATE TABLE restored_dependent_table FROM SNAPSHOT SET dependency_experiments
  IDENTIFIER '0fd44138-b571-449b-be0a-72779501f80e';

SELECT GET_DDL('TABLE','restored_dependent_table');
Copy
+----------------------------------------------------+
| GET_DDL('TABLE','RESTORED_DEPENDENT_TABLE')        |
|----------------------------------------------------|
| create or replace TABLE RESTORED_DEPENDENT_TABLE ( |
|     ID NUMBER(38,0) NOT NULL DEFAULT MY_BIG_IMPORTANT_DATABASE.OTHER_SCHEMA.MY_SEQUENCE.NEXTVAL,
|     FOREIGN_ID NUMBER(38,0),                         |
|     foreign key (FOREIGN_ID) references MY_BIG_IMPORTANT_DATABASE.OTHER_SCHEMA.MY_DIMENSION_TABLE(ID),
|     primary key (ID)                                 |
| );                                                 |
+----------------------------------------------------+

为说明如果引用的对象不再存在时会发生什么,我们删除了序列,然后从同一个快照中再次恢复表:

DROP SEQUENCE my_big_important_database.other_schema.my_sequence;
CREATE TABLE OR REPLACE restored_dependent_table FROM SNAPSHOT SET dependency_experiments
  IDENTIFIER '0fd44138-b571-449b-be0a-72779501f80e';

SELECT * FROM restored_dependent_table;
Copy

查询表仍然有效:

+----+------------+
| ID | FOREIGN_ID |
|----+------------|
+----+------------+
0 Row(s) produced. Time Elapsed: 0.129s

但是,GET_DDL()、DESCRIBE 和 INSERT 之类的操作都会失败,因为它们依赖于已不存在的序列:

SELECT GET_DDL('TABLE','restored_dependent_table');
Copy
002073 (02000): SQL compilation error:
Sequence used as a default value in table 'MY_BIG_IMPORTANT_DATABASE.OTHER_SCHEMA.RESTORED_DEPENDENT_TABLE'
  column 'ID' was not found or could not be accessed.
DESC TABLE restored_dependent_table;
Copy
+------------+--------------+--------+-------+----------------------------------------+-------------+------------+-------+------------+---------+-------------+----------------+
| name       | type         | kind   | null? | default                                | primary key | unique key | check | expression | comment | policy name | privacy domain |
|------------+--------------+--------+-------+----------------------------------------+-------------+------------+-------+------------+---------+-------------+----------------|
| ID         | NUMBER(38,0) | COLUMN | N     | [sequence cannot be found or accessed] | Y           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| FOREIGN_ID | NUMBER(38,0) | COLUMN | Y     | NULL                                   | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
+------------+--------------+--------+-------+----------------------------------------+-------------+------------+-------+------------+---------+-------------+----------------+
INSERT INTO restored_dependent_table (foreign_id) VALUES (2);
Copy
002073 (02000): SQL compilation error:
Sequence used as a default value in table 'MY_BIG_IMPORTANT_DATABASE.OTHER_SCHEMA.RESTORED_DEPENDENT_TABLE'
  column 'ID' was not found or could not be accessed.

为动态表创建快照

动态表总是涉及对某些其他表的引用。出于这个原因,您可能更愿意对动态表使用架构快照或数据库快照,这样原始表和动态表就可以包含在同一个快照中。

如果您为动态表创建表快照,则当您从快照恢复时,应在 CREATE SNAPSHOT SET 命令以及 CREATE TABLE 命令中包含关键字 DYNAMIC。以下示例设置动态表、该表的表快照集,并创建第一个快照:

CREATE DYNAMIC TABLE my_dynamic_table
  TARGET_LAG = '1 minute'
  WAREHOUSE = my_wh
  AS SELECT * FROM my_base_table WHERE col1 IS NOT NULL;

CREATE SNAPSHOT SET dynamic_table_snapshots
  FOR DYNAMIC TABLE my_dynamic_table;

ALTER SNAPSHOT SET dynamic_table_snapshots ADD SNAPSHOT;
Copy

以下示例说明如何确定在不同时间创建的快照的快照 IDs。在这种情况下,最新的快照是结果集中的第一行。然后,在 CREATE DYNAMIC TABLE 命令中使用快照的 ID。

SHOW SNAPSHOTS IN SNAPSHOT SET dynamic_table_snapshots
  ->> SELECT "created_on", "snapshot_id" FROM $1
        ORDER BY "created_on" DESC;

CREATE DYNAMIC TABLE restored_dynamic_table
  FROM SNAPSHOT SET dynamic_table_snapshots
    IDENTIFIER '<snapshot_id_from_SHOW_SNAPSHOTS_output>';
Copy

小技巧

当您从快照恢复动态表时,Snowflake 会在首次刷新新表时 自动初始化 新表。

监控快照和快照操作

您可以通过查询以下视图来确定存在哪些与快照相关的对象、它们的属性以及它们使用的存储空间。

Information Schema:

Account Usage:

SQL 参考主题

快照策略

快照集

快照

您没有运行实际的 CREATE SNAPSHOT 命令。要创建新快照,请运行 ALTER SNAPSHOT SET ... ADD SNAPSHOT。或者,当您将快照集与具有计划的快照策略关联时,Snowflake 会根据指定的计划自动在快照集中创建快照。要删除更早的快照,请运行 ALTER SNAPSHOT SET ... DELETE SNAPSHOT。此类操作需要您为特定快照指定标识符。您可以使用以下命令查找快照标识符以及其他信息,例如每个快照的创建时间。

从快照中恢复对象

您可以使用语法 CREATE object_kind FROM SNAPSHOT SET 从相应的快照集恢复每种对象。

快照集中的其他快照使用原始对象,而不是恢复的对象。即使您将恢复的对象重命名为与原始对象相同的名称,也是如此。如果要在恢复后继续使用相同的快照集,则应使用新名称恢复对象,然后将数据传输回原始对象。

视图

以下系统视图包含与快照、快照集和快照策略相关的元数据。

Information Schema 视图

INFORMATION_SCHEMA 架构中的这些视图包含有关当前存在的快照相关对象的信息:

Account Usage 视图

ACCOUNT_USAGE 架构中的这些视图包含已存在或已删除的快照相关对象、对快照执行的操作以及它们使用的存储空间的相关信息:

语言: 中文