平台

了解数据库和磁盘大小


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

  • 数据库大小:显示 Postgres 数据库中数据的实际大小。这可以在 数据库报告页面 找到。

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

数据库大小#

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

1
select
2
pg_size_pretty(sum(pg_database_size(pg_database.datname)))
3
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 不会立即回收数据库中死元组(即已删除的行)所使用的物理空间。它们被标记为“已删除”,直到执行 Vacuum 操作。因此,从数据库中删除数据可能不会立即减少报告的磁盘使用量。您可以使用 Supabase CLI inspect db bloat 命令查看数据库中的所有死元组。或者,您可以在 SQL 编辑器 中运行 查询

1
# Login to the CLI
2
npx supabase login
3
4
# Initialize a local supabase directory
5
npx supabase init
6
7
# Link a project
8
npx supabase link
9
10
# Detect bloat
11
npx supabase inspect db bloat --linked

如果您找到想要立即清理的表,可以在 SQL 编辑器 中运行以下命令

1
vacuum full <table name>;

Supabase 项目启用了自动 Vacuum,这可确保定期执行这些操作,以保持数据库的健康和性能。可以 微调 自动 Vacuum 参数,或 手动启动 Vacuum 操作。在从数据库中删除大量数据后运行手动 Vacuum 可以帮助减少 Postgres 报告的数据库大小。

占用空间#

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

磁盘大小#

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

Pro 计划及更高版本的项目具有自动缩放磁盘。

当数据库达到分配磁盘大小的 90% 时,磁盘大小会自动扩展。磁盘扩展到原来的 1.5 倍(例如,8 GB -> 12 GB)。自动缩放每 6 小时只能进行一次。如果在 6 小时内达到磁盘空间的 95%,您的项目将进入只读模式。

磁盘大小也可以在 数据库设置页面 上手动扩展。Pro/Team 计划的最大磁盘大小为 60 TB。如果您需要更多空间,请 联系我们 了解有关企业计划的更多信息。

免费方案行为#

当您超过 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';

磁盘大小分布#

您可以在 项目的计算和磁盘页面 上查看磁盘大小的分布情况。

Disk Size Distribution

您的磁盘大小使用情况分为三类

  • 数据库 - 数据库的磁盘使用情况。这包括实际数据、索引、物化视图……
  • WAL - 预写式日志的磁盘使用情况。使用量取决于您的 WAL 设置和写入数据库的数据量。
  • 系统 - 系统保留的磁盘使用情况,以确保数据库可以平稳运行。用户无法修改此项,它应该只占用很少的空间。

减小磁盘大小#

磁盘在正常操作期间不会自动缩小。一旦您 减小了数据库大小,它们将在 项目升级 期间自动“调整大小”。升级后的最终磁盘大小是数据库大小的 1.2 倍,最小为 8 GB。例如,如果您的数据库大小为 100GB,并且您有 200GB 的磁盘,那么升级后的磁盘大小将为 120 GB。

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

如果您的项目已经是 Postgres 的最新版本并且无法升级,那么大约每周会发布一个新版本的 Postgres,您可以一旦可用就升级到该版本。