Skip to content

数据库

为项目提供的托管 Postgres(16、17 或 18),位于项目的私有网络上,没有任何请求时休眠,有连接时唤醒。由方块的一个有状态服务和一个云盘构成,二者只由数据库修改。尚未向账户开放。

更新于

尚未开放。数据库还没有向账户开放。这些页面按目前正在构建的样子介绍它,开放前可能还会变化。

数据库是你项目中的托管 PostgreSQL:版本 16、17 或 18,在项目的私有网络上按名称访问。它由平台已有的东西构成:一个云盘保存它的数据,一个有状态的方块服务在上面运行 PostgreSQL。没有任何请求时,它的实例休眠;连接会唤醒它,会话都还在。

什么时候用数据库

  • 给应用用的 Postgres:你的方块和沙箱在项目网络上按名称连接它。
  • 每个环境、用户或智能体一个数据库:一次调用创建一个,一次调用删除它,并把它的数据快照保留一周。
  • 带有应用常用功能的 Postgres:向量、PostGIS、时间序列、cron 和全文搜索都已自带 (PostgreSQL)。

工作方式

  1. 创建。POST /v1/databases 带上名称,创建云盘和服务,等待 PostgreSQL 第一次启动,然后返回所有者的密码和连接字符串。密码只出现在这次响应中。
  2. 连接。项目网络上的沙箱和项目的服务用连接字符串 (private_uri) 连接:postgresql://<owner>:<password>@<name>:5432/<database>。
  3. 休眠。没有任何请求 sleep_after_seconds 秒后(默认为 1),它的实例连同内存和会话一起休眠。连接会唤醒它。
  4. 删除。DELETE /v1/databases/{id} 停止 PostgreSQL,把它的云盘快照保留七天,并删除其余部分。
POST /v1/databases
{"name": "shop", "version": "17"}

调用

调用 作用
POST /v1/databases 创建一个数据库 (201);或者,在创建请求所要求的内容与已有数据库一致时,返回项目中同名的数据库 (200),不带密码。
GET /v1/databases, GET /v1/databases/{id} 项目的数据库,最新的在前(用 name 查找);按 id 或名称查看一个。从不包含密码。
DELETE /v1/databases/{id} 删除它,并把它的数据快照保留七天(?final_snapshot=false:不保留)。
GET /v1/databases/{id}/branches, GET /v1/databases/{id}/branches/{branch} 它的分支:目前只有根分支 main。
POST /v1/databases/{id}/branches/{branch}/sleep, …/wake 立即让它的实例休眠;立即唤醒它。
POST /v1/databases/{id}/roles/{role}/reset-password 为它的所有者设置新密码,只出现在响应中。

创建、删除、休眠、唤醒和设置新密码需要有 write 权限范围的密钥;读取需要 read。

创建数据库

除 name 外,每个字段都可以省略:

字段 说明
name 小写字母、数字和连字符:它在项目中和网络上的名称。它的服务也用这个名称,它的云盘是 <name>-data:已被应用或云盘使用的名称会被拒绝 (409 name_taken)。
version PostgreSQL 的主版本:16、17 或 18(默认)。
region na、eu 或 ap;不指定时为项目的归属区域。
database_name 集群中的数据库:默认为 glacdb。最多 57 个字符的小写标识符,不能是 postgres、template0、template1 或 pg_…。它的所有者是 <database_name>_owner。
size {vcpus, memory_bytes}:它的实例的上限,受你的套餐限制,默认 1 vCPU 和 1 GiB(最少 256 MiB)。按实际用量计费,而不是按这些上限。
storage {size_bytes, durability}:它的云盘。durability 默认为 strict:对象存储收到提交后提交才返回,所以已响应的提交在机器丢失后仍然存在。standard:机器收到后即返回。
sleep_after_seconds 没有任何请求时,它的实例保持运行多久:付费版上为 1 到 3,600 秒,默认 1 秒。免费版上固定为 1 秒:免费版的数据库在最后一个查询一秒后暂停,五分钟后休眠,与 Neon 的免费版相同(其他值会被拒绝,400 invalid_field)。
metadata 你自己的键和值,都是字符串。

创建请求会等待 PostgreSQL 第一次启动(最多 150 秒),然后返回处于 ready 的数据库;如果第一次启动仍在进行,则返回 creating:这时反复 GET 它,直到它变成 ready。创建按名称保证幂等:指定项目中已有数据库的创建请求,如果要求的内容与它一致,就返回它(200,不带密码),否则会被拒绝 (409 name_taken)。云盘和服务和其他云盘、应用一样,计入你的套餐允许项目保有的数量,二者之一被拒绝就是创建被拒绝,已创建的部分会被撤销。

数据库包含什么

字段 说明
id, name, version, region db-…;与创建时相同。region 为项目的归属区域时为 null。
status creating、ready、failed(第一次启动失败:error 说明原因,这时只能删除它)、deleting、deleted。
database_name, role 集群中的数据库及其所有者。
password 所有者的密码,只出现在创建和设置新密码的响应中;其他地方都为 null。它不保存在任何地方:PostgreSQL 只保存它的 SCRAM 校验值。
default_branch 它的根分支 main:state(awake;paused,被保持在机器内存中时;asleep;unavailable,机器无法访问时;creating、failed)、private_host(它的名称)、private_uri、size、storage(它的云盘的 drive_id、大小和持久性)、app_id 和 instance_id。
sleep_after_seconds, metadata, created_at 与创建时相同。
final_snapshot 已删除数据库的:保留下来的云盘快照,以及它的删除时间。

只有在给出密码的响应中,private_uri 才带有密码。实例是一个沙箱:GET /v1/sandboxes/{instance_id} 可以读取它,也可以在里面运行命令。

连接

项目的服务,以及项目网络上的沙箱 (project_network: true),用所有者和密码,在 5432 端口按名称(或 <name>.internal)访问数据库:

psql "postgresql://glacdb_owner:<password>@shop:5432/glacdb"

连接休眠的数据库会唤醒它,就像连接网络上的任何服务一样。每次登录都用密码 (SCRAM);PostgreSQL 的超级用户只能在机器本地登录,从不通过网络登录。POST /v1/databases/{id}/roles/{role}/reset-password(角色即它的 role)设置新密码:从下一次登录起旧密码会被拒绝,已打开的连接保持。

休眠与唤醒

没有任何请求 sleep_after_seconds 秒后,它的实例连同内存一起休眠:当时打开的会话在它醒来时都还在。正在等它的客户端也算请求:只要有查询在进行(无论它在等什么,包括锁或定时器)、有事务未结束或有登录未完成,它就保持运行并按运行计费,直到这些结束;打开着却不在等任何东西的连接,仍然不会让它保持运行。连接会唤醒它;POST /v1/databases/{id}/branches/main/wake 也会,和任何唤醒一样,受套餐允许账户同时运行的数量限制。…/sleep 立即让它休眠,无论它的客户端在等什么:打开的连接保持打开,连接上的下一条消息会唤醒它,它还没回答的查询会在下次醒来时回答。对正在创建或删除的数据库,唤醒和休眠都会被拒绝(409 database_busy,retryable),第一次启动失败的数据库返回 409 database_failed。

如果 PostgreSQL 自行停止(崩溃,或被内核的 OOM killer 结束),它会在实例中重新启动,数据保持原样:它像断电后一样,通过预写日志恢复,每个已提交的事务都在。它在最后一个进程退出 0.1 秒后启动;每次在启动后 10 秒内再次停止,等待时间就加倍,最多一分钟。每次启动都是一个 instance.restarted 事件,分支的 start_command 会说明它重新启动了多少次、上一次是如何结束的,以及在等待期间,下一次何时启动(服务)。

数据库由什么构成

数据库的服务和云盘属于项目:GET /v1/apps 和 GET /v1/drives 会列出它们,managed_by 指明所属的数据库 ({"object": "database", "id": "db-…"}),它们的日志、指标和快照与其他的一样读取。只有数据库能修改它们:对它的应用更新、部署、回滚或删除,对它的云盘重命名、恢复或删除,在别处以读写方式挂载它的云盘,以及删除或修改它的实例,都会被拒绝 (409 managed_by_database)。项目中任何人都可以为它的云盘创建快照、分叉快照、以只读方式挂载快照。

在数据库有自己的计量项之前,数据库按它的构成计费:它的实例的 CPU 时间和内存与任何实例一样计费(沙箱价格),它的云盘与任何云盘一样计费(云盘价格)。

删除

DELETE /v1/databases/{id} 删除它的服务(PostgreSQL 以快速关闭方式停止),在云盘静止时为它创建快照,即数据的最终状态,然后删除云盘。快照保留七天,作为项目中的一个云盘快照 (GET /v1/drive-snapshots?drive_deleted=true),可以分叉成新云盘,也可以以只读方式挂载;?final_snapshot=false 则不保留。响应是处于 deleted 的数据库,带有 final_snapshot;剩余部分需要更久时,返回 deleting,平台会完成删除。名称立即可以再用。

下一步

  • PostgreSQL:版本、扩展、角色及所有者能做什么、新数据库如何开始、它的压缩,以及平台保留的设置。
导航

输入以搜索……

↑↓ 切换↵ 选择Esc 关闭