平台

理解数据库与磁盘空间


磁盘指标指的是由Postgres报告的存储使用情况。这些指标每日更新。在阅读本文档时,我们会提到"数据库大小"和"磁盘大小":

  • 数据库大小:显示您Postgres数据库中数据的实际大小。可以在数据库报告页面查看。

  • 磁盘大小:显示整体磁盘空间使用情况,包括数据库大小以及Postgres运行所需的额外文件,如预写日志(WAL)和其他系统日志文件。可以在数据库设置页面查看。

数据库大小

以下SQL查询将显示Postgres集群中所有数据库的大小:

1
2
3
select pg_size_pretty(sum(pg_database_size(pg_database.datname)))from pg_database;

该值会在数据库报告页面中显示。

数据库大小主要由您的数据、索引和物化视图占用。您可以通过删除其中任何一项并运行Vacuum操作来减少数据库大小。

磁盘空间使用情况

您的数据库大小是 Supabase 项目磁盘使用量的一部分,Postgres 有许多组件会消耗额外的磁盘空间。其中一个主要组件是预写日志(WAL)。Postgres 会将数据库变更存储在日志文件中,这些文件在应用到数据库后会被清除。这些相同的文件也被只读副本或其他复制方法使用。

如果您想确定存储在磁盘上的 WAL 文件大小,Postgres 提供了 pg_ls_waldir 作为辅助函数;可以运行以下查询:

1
select pg_size_pretty(sum(size)) as wal_size from pg_ls_waldir();

真空(VACUUM)操作

Postgres 不会立即回收数据库中死元组(即已删除行)占用的物理空间。它们会被标记为"已移除",直到执行真空操作。因此,从数据库中删除数据可能不会立即减少报告的磁盘使用量。您可以使用 Supabase CLIinspect db bloat 命令查看数据库中的所有死元组。或者,您可以在 SQL 编辑器 中运行 CLI 的 GitHub 仓库中找到的查询

1
2
3
4
5
6
7
8
# 登录 CLInpx supabase login# 初始化本地 supabase 目录npx supabase init# 关联项目npx supabase link

检测膨胀

npx supabase inspect db bloat --linked

1
2
3
4
如果您发现需要立即清理的表,可以在 [SQL 编辑器](https://supabase.com/dashboard/project/_/sql/new) 中运行以下命令:```sqlvacuum full <表名>;

Supabase 项目默认启用了自动 vacuum 功能,确保定期执行这些操作以保持数据库健康和性能良好。您可以微调 autovacuum 参数,或者手动启动 vacuum 操作。在删除大量数据后运行手动 vacuum 可能有助于减少 Postgres 报告的数据库大小。

预占用空间

新的 Supabase 项目数据库大小约为 40-60MB。这个空间包括预安装的扩展、模式以及默认的 Postgres 数据。安装扩展时会占用额外的数据库空间,即使这些扩展处于非活动状态。

磁盘大小

Supabase 使用网络附加存储来平衡性能与可扩展性。磁盘扩展行为取决于您的计费计划。

付费计划行为

专业版(Pro Plan)及更高等级的项目拥有自动扩展磁盘功能。

当数据库使用量达到分配磁盘大小的90%时,磁盘会自动扩容。磁盘将扩展至当前容量的150%(例如8GB→12GB)。自动扩容每6小时只能执行一次。如果在这6小时内磁盘使用率达到95%,您的项目将进入只读模式。

您也可以在数据库设置页面手动扩展磁盘容量。专业版/团队版(Pro/Team Plan)的最大磁盘容量为60TB。如需更大容量,请联系我们了解企业版(Enterprise Plan)详情。

免费版计划行为

当您超过500 MB限制时,免费版项目将进入只读模式。进入只读模式后,您有以下选择:

只读模式

在某些情况下,Supabase可能会将您的数据库置于只读模式,以防止超出计费或磁盘限制。

在只读模式下,客户端会遇到诸如cannot execute INSERT in a read-only transaction等错误。当使用量低于磁盘大小的95%时,常规操作(读写模式)将自动恢复。

禁用只读模式

您可以手动覆盖只读模式来缩减磁盘大小。为此,请在SQL编辑器中运行以下命令:

首先,更改事务访问模式

1
set session characteristics as transaction read write;

这将允许您在会话中删除数据。删除数据后,建议运行vacuum以尽可能多地回收空间:

1
vacuum;

回收空间后,您可以运行以下命令来禁用只读模式

1
set default_transaction_read_only = 'off';

磁盘空间分布

您可以在项目的计算与磁盘页面查看磁盘空间的分布情况。

磁盘空间分布

磁盘空间使用分为三类:

  • 数据库 - 数据库占用的磁盘空间。包括实际数据、索引、物化视图等。
  • WAL - 预写日志占用的磁盘空间。使用量取决于您的WAL设置和写入数据库的数据量。
  • 系统 - 系统保留的磁盘空间,确保数据库平稳运行。用户无法修改这部分空间,通常只占用极小比例。

缩减磁盘空间

在正常操作期间,磁盘不会自动缩小。当您减小数据库大小后,它们会在项目升级时自动"调整到合适大小"。升级后的最终磁盘空间为数据库大小的1.2倍,最小为8GB。例如,如果您的数据库大小为100GB,当前磁盘为200GB,升级后的磁盘空间将为120GB。

如果WAL目录过大,您可以修改WAL设置max_wal_size。请注意更改这些设置可能会产生副作用,需自行承担风险。要查询当前WAL大小,可使用SELECT SUM(size) FROM pg_ls_waldir()

如果您的项目已运行最新版Postgres而无法升级,Postgres大约每周会发布新版本,待新版本可用后即可进行升级。