Snowflake Postgres 时间点恢复¶
概述¶
Snowflake Postgres 支持通过时间点恢复 (PITR) 创建实例的 分支。分支是一个新实例,反映现有实例在特定时间点的状态。 分支类似于 Snowflake 中的 CLONE 操作。但与 CLONE 操作不同,分支会完整复制所有源数据。
由于分支与源实例隔离,对分支进行的任何更改(包括架构或数据)都不会影响源实例。
在以下情况下,时间点恢复非常有用:
从意外更改中恢复,例如被删除的表或错误的数据更新。
检查数据的历史状态,以进行调试或审计。
在不影响源实例的情况下,使用生产数据的真实副本 测试应用程序变更。
分支是基于指定时间之前源实例的最新基础备份创建的。源实例的预写日志 (WAL) 记录会被回放到所选时间点,从而确保分支实例在该时刻与源实例在事务上保持一致。
分支中复制的内容¶
创建分支时,将从源实例复制以下内容:
Postgres 版本。复制版本以保证二进制兼容性。
高可用性设置(启用或禁用)。
用于访问实例的凭据。
在创建新实例时,您可以自定义一些属性,例如 存储 和 实例大小(计划)。分支实例的定价与其他实例一样,取决于分支的配置(计划、存储和高可用性)。
创建分支¶
要将 Postgres 实例创建为源实例的分支,请执行 CREATE POSTGRES INSTANCE 命令,并指定 FORK 子句。该命令会根据 AT 或 BEFORE 子句指定的时间点,从源实例创建分支。如果省略该子句,分支将基于源实例的当前状态创建。
CREATE POSTGRES INSTANCE <name>
FORK <orig_name>
[ { AT | BEFORE } ( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> } ) ]
[ COMPUTE_FAMILY = <compute_family> ]
[ STORAGE_SIZE_GB = <storage_gb> ]
[ HIGH_AVAILABILITY = { TRUE | FALSE } ]
[ POSTGRES_SETTINGS = '<json_string>' ]
[ COMMENT = '<string_literal>' ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , ... ] ) ]
对于命令参数:
FORK orig_name指定分支的源实例。
{ AT | BEFORE } ( { TIMESTAMP => timestamp | OFFSET => time_difference } )指定要进行分支的时间点。 时间戳或偏移量必须在 Postgres 10 天数据保留时间内。
默认值:None。 使用当前时间。
AT | BEFORE 子句接受以下参数之一:
TIMESTAMP => timestamp指定要用于 Time Travel 的确切日期和时间。该值必须显式转换为 TIMESTAMP、TIMESTAMP_LTZ、TIMESTAMP_NTZ 或 TIMESTAMP_TZ 数据类型。
如未指定显式转换,AT 子句中的时间戳会被视为采用 UTC 时区的时间戳(相当于 TIMESTAMP_NTZ)。为显式强制转换使用 TIMESTAMP 数据类型也可能导致值被视为 TIMESTAMP_NTZ 值。有关详细信息,请参阅 日期和时间数据类型。
OFFSET => time_difference指定自当前时间开始的、要用于 Time Travel 的时间差值(以秒为单位),其格式为
-N,其中N可以是整数或算术表达式(例如,-120为 120 秒、-30*60为 1800 秒或 30 分钟)。
默认值:None。 从源实例复制。
COMPUTE_FAMILY = compute_family指定 Snowflake Postgres 实例规格 表中实例规格的名称。
默认值:None。 从源实例复制。
STORAGE_SIZE_GB = storage_gb指定存储大小,单位为 GB。必须介于 10 到 65,535 之间。
默认值:None。 从源实例复制。
HIGH_AVAILABILITY = { TRUE | FALSE }指定要用于分支的高可用性设置。
默认值:None。 从源实例复制。
POSTGRES_SETTINGS = 'json_string'允许您以 JSON 格式,在实例上可选地设置 Postgres 配置参数。 请参阅 Snowflake Postgres 服务器设置 获取可用的 Postgres 参数列表。
'{"component:name" = "value", ...}'默认值:None。 从源实例复制。
COMMENT = 'string_literal'指定用户的注释。
默认:
NULL
TAG ( tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] )指定 标签 名称和标签字符串值。
标签值始终为字符串,标签值的最大字符数为 256。
有关在语句中指定标签的信息,请参阅 Tag quotas。
将返回一行,包含以下列:
statushost
CREATE FORK SQL 示例
通过源实例
my_origin_instance在时间戳2025-01-01 12:00:00创建分支my_fork。CREATE POSTGRES INSTANCE my_fork FORK my_origin_instance AT (TIMESTAMP => '2025-01-01 12:00:00');通过源实例
my_origin_instance创建分支my_fork,状态为120秒前的样子。CREATE POSTGRES INSTANCE my_fork FORK my_origin_instance AT (OFFSET => -120);创建分支
my_fork,基于源实例my_origin_instance的当前状态,使用STANDARD_M实例规格,不启用高可用性。CREATE POSTGRES INSTANCE my_fork FORK my_origin_instance COMPUTE_FAMILY = STANDARD_M HIGH_AVAILABILITY = FALSE;
创建分支时,不会显示任何凭据。 分支实例的凭据与源实例相同。 如有需要,您可以稍后重新生成凭据。
创建分支所需时间取决于源实例的大小。
