CREATE POSTGRES INSTANCE

创建一个新的 Snowflake Postgres 实例 或创建现有实例的分支。

分支使用 时间点恢复 (PITR),在特定时间点创建实例的 完整、独立副本:这对于从生产数据恢复、测试或创建开发环境非常有用。

另请参阅:

ALTER POSTGRES INSTANCE, DESCRIBE POSTGRES INSTANCE, DROP POSTGRES INSTANCE, SHOW POSTGRES INSTANCES

语法

CREATE POSTGRES INSTANCE <name>
  COMPUTE_FAMILY = '<compute_family>'
  STORAGE_SIZE_GB = <storage_gb>
  AUTHENTICATION_AUTHORITY = { POSTGRES | POSTGRES_OR_SNOWFLAKE }
  [ POSTGRES_VERSION = { 16 | 17 | 18 } ]
  [ NETWORK_POLICY = '<network_policy>' ]
  [ HIGH_AVAILABILITY = { TRUE | FALSE } ]
  [ STORAGE_INTEGRATION = '<storage_integration_name>' ]
  [ POSTGRES_SETTINGS = '<json_string>' ]
  [ COMMENT = '<string_literal>' ]
  [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , ... ] ) ]

The following syntax creates a fork of an existing instance at a point in time. The FORK clause uses point-in-time recovery with the same AT | BEFORE syntax as Time Travel, but creates a full physical copy of the Postgres instance:

CREATE POSTGRES INSTANCE <name>
  FORK <source_instance>
  [ { 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>' [ , ... ] ) ]

必填参数

name

指定 Postgres 实例的标识符(名称);对于账户必须是唯一的。

此外,标识符必须以字母字符开头,且不能包含空格或特殊字符,除非整个标识符字符串放在双引号内(例如,"My object")。放在双引号内的标识符也区分大小写。

有关更多信息,请参阅 标识符要求

COMPUTE_FAMILY = 'compute_family'

为 Postgres 实例指定 实例大小

Snowflake Postgres 提供三个级别:

  • **突发型**(BURST_XS、BURST_S、BURST_M):对于开发和间歇性工作负载具有成本效益。仅限于 100GB 存储,不支持高可用性。

  • **标准**(STANDARD_M 通过 STANDARD_24XL):平衡式 CPU 以及用于通用工作负载的内存。支持包括高可用性在内的所有功能。

  • **内存优化型**(HIGHMEM_L 通过 HIGHMEM_48XL):适用于内存密集型查询和大型索引的更高内存与 CPU 比率。支持包括高可用性在内的所有功能。

备注

某些功能需要特定计算系列。例如,高可用性 (HIGH_AVAILABILITY = TRUE) 仅适用于 STANDARD 和 HIGHMEM 实例,而不适用于 BURST 实例。

STORAGE_SIZE_GB = storage_gb

指定存储大小,单位为 GB。必须介于 10 到 65,535 之间。

根据分配的量,存储与计算分开计费。您可以稍后使用 ALTER POSTGRES INSTANCE 以下命令增大或缩小存储大小。有关成本的更多信息,请参阅 Snowflake Postgres 成本评估

备注

When you decrease the storage size, you can't set it too close to current disk usage. The new size must be at least 1.4x the disk space currently in use. That way, there's still room to add more data without triggering an automatic storage increase.

AUTHENTICATION_AUTHORITY = { POSTGRES | POSTGRES_OR_SNOWFLAKE }

Specifies the authentication method for the instance. POSTGRES indicates that only Postgres user passwords can be used. POSTGRES_OR_SNOWFLAKE also allows the use of short-lived access token passwords. See Snowflake Postgres 的 Snowflake 令牌身份验证 for more details.

可选参数

POSTGRES_VERSION = { 16 | 17 | 18 }

指定要使用的 Postgres 主要版本。

虽然最新版本包含新功能和改进,但出于应用程序兼容性或匹配现有实例的目的,您可以选择较旧的版本。您可以稍后使用 ALTER POSTGRES INSTANCE 升级至更新的版本。

默认值:None。最新的 Postgres 版本。

NETWORK_POLICY = 'network_policy'

指定用于实例的 网络策略。要指定此参数,您必须已获得网络策略对象的 USAGE 权限。

默认值:None。不应用网络策略。

重要

如果没有网络策略,实例将无法接受传入连接。您仍然可以使用 SHOW 和 DESCRIBE 命令查看实例,但在使用 ALTER POSTGRES INSTANCE 附加网络策略之前无法连接到 Postgres 数据库。

STORAGE_INTEGRATION = 'storage_integration_name'

将类型为 POSTGRES_EXTERNAL_STORAGE 的存储集成附加到 Postgres 实例,使 pg_lake 扩展能够访问外部对象存储中的数据。有关完整的设置步骤,请参阅 为 pg_lake 配置 S3 存储

您以后也可以使用 ALTER POSTGRES INSTANCE 附加或移除存储集成。

默认值:None。未附加存储集成。

HIGH_AVAILABILITY = { TRUE | FALSE }

指定是否为实例启用 高可用性

高可用性会在单独的可用区中配置备用实例,以实现自动故障转移。这样可以在主数据库不可用时,最大限度地缩短停机时间。如果没有 HA,恢复需要从备份中恢复,对于大型或活动实例,这可能需要数小时。请注意,启用或禁用 HA 稍后使用 ALTER POSTGRES INSTANCE 需要一项 维护操作

重要

突发型实例大小(BURST_XS、BURST_S、BURST_M)不支持高可用性。

默认:FALSE

POSTGRES_SETTINGS = 'json_string'

以 JSON 格式为实例指定自定义 Postgres 服务器设置

'{"component:name" = "value", ...}'

该格式使用 component:name,其中 component``postgres``(适用于 PostgreSQL 服务器设置)或 ``pgbouncer``(适用于连接池管理器设置)。例如:

'{"postgres:work_mem" = "128MB", "pgbouncer:default_pool_size" = "200"}'

请参阅 Snowflake Postgres 服务器设置 了解可用设置。

默认值:None。未设置自定义 Postgres 配置参数。

COMMENT = 'string_literal'

指定 Postgres 实例的注释。

注释对于记录实例的用途或所有权非常有用,例如“计费服务的生产示例”或“X 团队的 QA 环境”。与标签不同,注释是自由形式的文本,不用于组织或成本跟踪。

默认:无值。

TAG ( tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] )

指定 标签 名称和标签字符串值。

标签值始终为字符串,标签值的最大字符数为 256。

有关在语句中指定标签的信息,请参阅 Tag quotas

分支参数

为 Snowflake Postgres 实例创建分支会创建一个完全相同的副本,其中包含所有相同的架构对象和表数据。您还可以指定一个时间点,以便创建了分支的实例反映实例的先前状态。这样,您就可以从数据完整性问题中恢复,例如意外删除对象。您还可以探索开发和测试环境中的场景,例如使用相同的数据尝试不同的实例配置。有关更多信息,请参阅 Snowflake Postgres 时间点恢复

FORK source_instance

创建一个新实例作为指定源实例的分支(副本)。

{ AT | BEFORE } ( { TIMESTAMP => timestamp | OFFSET => time_difference } )

指定要进行分支的时间点。您不能从过去 10 天前的时间点创建分支。时间戳或偏移量必须在 Postgres 10 天数据保留期内。

AT | BEFORE 子句接受以下参数之一:

TIMESTAMP => timestamp

指定要用于 Time Travel 的确切日期和时间。该值必须显式转换为 TIMESTAMP、TIMESTAMP_LTZ、TIMESTAMP_NTZ 或 TIMESTAMP_TZ 数据类型。

OFFSET => time_difference

指定与当前时间的差值(以秒为单位),格式为 -N,其中 N 可以是整数或算术表达式(例如,-120 为 120 秒,-30*60 为 30 分钟)。

默认值:None。使用当前时间。

创建分支时,以下参数是可选参数,默认为源实例中的值:

  • COMPUTE_FAMILY

  • STORAGE_SIZE_GB

  • HIGH_AVAILABILITY

  • POSTGRES_SETTINGS

输出

创建新实例时,该命令将返回一行,其中包含以下列:

描述

status

创建操作的状态。

host

用于连接到实例的主机名。

access_roles

snowflake_adminapplication 角色的用户名及密码。

default_database

实例的默认数据库。

重要

access_roles 列包含无法稍后检索的凭据。将这些详细信息保存在安全位置。

创建分支时,该命令仅返回包含 statushost 列的一行。在分支对应的时间点,分支与源实例使用相同的凭据。

访问控制要求

用于执行此操作的 角色 必须至少具有以下 权限

权限

对象

备注

CREATE POSTGRES INSTANCE

账户

默认情况下,只有 ACCOUNTADMIN 角色具有此权限。

USAGE

网络策略

仅当指定 NETWORK_POLICY 时需要。

USAGE

存储集成

仅当指定 STORAGE_INTEGRATION 时需要。

有关创建具有指定权限集的自定义角色的说明,请参阅 创建自定义角色

有关对 安全对象 执行 SQL 操作的相应角色和权限授予的一般信息,请参阅 访问控制概述

使用说明

  • 创建新实例需要一些时间才能完成。在构建过程中,实例显示其当前的 状态。在实例设置期间,您可以使用 DESC POSTGRES INSTANCE 命令来跟踪状态。

  • 创建分支时,您不会指定或查看凭据。这是因为在分支对应的时间点,分支使用的是源实例拥有的相同凭据。如果您需要向不同于原始实例的一组用户提供访问权限,您可以稍后为创建了分支的实例重新生成凭据。

  • The time needed to create a fork depends on the amount of data in the source instance. Larger databases with more data take longer to fork. The compute family (instance size) of the source doesn't significantly affect fork duration.

  • 创建分支时使用备份和预写日志 (WAL) 回放执行完整数据复制,这意味着,创建了分支的实例是完全独立的:删除源实例不会影响您通过其创建的任何分支。

    备注

    Postgres forking isn't part of the Snowflake Time Travel feature, which uses zero-copy technology for tables. However, forking uses the same AT | BEFORE syntax to specify a point in time.

  • 关于元数据:

    注意

    客户应确保在使用 Snowflake 服务时,不会将个人数据(用户对象除外)、敏感数据、出口管制数据或其他受监管数据作为元数据输入。有关更多信息,请参阅 Snowflake 中的元数据字段

示例

创建基本 Postgres 实例:

CREATE POSTGRES INSTANCE my_postgres
  COMPUTE_FAMILY = 'STANDARD_S'
  STORAGE_SIZE_GB = 50
  AUTHENTICATION_AUTHORITY = POSTGRES;

创建具有高可用性和网络策略的 Postgres 实例:

CREATE POSTGRES INSTANCE prod_postgres
  COMPUTE_FAMILY = 'STANDARD_M'
  STORAGE_SIZE_GB = 500
  AUTHENTICATION_AUTHORITY = POSTGRES
  POSTGRES_VERSION = 17
  HIGH_AVAILABILITY = TRUE
  NETWORK_POLICY = 'my_network_policy'
  COMMENT = 'Production Postgres instance';

稍后创建实例并配置网络策略:

-- Step 1: Create instance without network policy
CREATE POSTGRES INSTANCE my_postgres
  COMPUTE_FAMILY = 'STANDARD_S'
  STORAGE_SIZE_GB = 50
  AUTHENTICATION_AUTHORITY = POSTGRES;

-- Step 2: Monitor instance creation
DESCRIBE POSTGRES INSTANCE my_postgres
  ->> SELECT "property", "value"
      FROM $1
      WHERE "property" IN ('name', 'state', 'host');

-- Step 3: Once READY, attach network policy to enable connections
ALTER POSTGRES INSTANCE my_postgres
  SET NETWORK_POLICY = 'my_network_policy';

-- Step 4: Now you can connect to the Postgres database using the host and credentials
-- from the CREATE output

创建现有实例的分支:

CREATE POSTGRES INSTANCE my_fork
  FORK my_source_instance;

在特定时间点创建分支:

CREATE POSTGRES INSTANCE my_fork
  FORK my_source_instance
  AT (TIMESTAMP => '2025-01-15 12:00:00'::TIMESTAMP_NTZ);

创建 2 小时前且实例大小不同的分支:

CREATE POSTGRES INSTANCE my_fork
  FORK my_source_instance
  AT (OFFSET => -7200)
  COMPUTE_FAMILY = 'STANDARD_L';

使用更大的实例大小和不同的存储创建用于报告的分支:

-- Fork production instance for reporting workload
CREATE POSTGRES INSTANCE reporting_instance
  FORK prod_instance
  COMPUTE_FAMILY = 'HIGHMEM_XL'
  STORAGE_SIZE_GB = 500
  COMMENT = 'Dedicated reporting instance to offload analytics queries';

在午夜 (UTC) 创建分支,用于每日测试:

-- Fork at start of day (midnight UTC)
CREATE POSTGRES INSTANCE daily_test_instance
  FORK prod_instance
  AT (TIMESTAMP => '2026-02-05 00:00:00'::TIMESTAMP_NTZ);

创建一个 HA 处于禁用状态的开发分支,以降低成本:

CREATE POSTGRES INSTANCE dev_instance
  FORK prod_instance
  COMPUTE_FAMILY = 'STANDARD_S'
  STORAGE_SIZE_GB = 100
  HIGH_AVAILABILITY = FALSE
  COMMENT = 'Development environment from prod data';

使用事件发生前的分支,从意外数据删除中恢复:

-- Recover by forking from 30 minutes ago
CREATE POSTGRES INSTANCE recovered_instance
  FORK damaged_instance
  AT (OFFSET => -1800)
  COMMENT = 'Recovery fork from before data deletion';