理解数据库与磁盘空间
磁盘指标指的是由Postgres报告的存储使用情况。这些指标每日更新。在阅读本文档时,我们会提到"数据库大小"和"磁盘大小":
-
数据库大小:显示您Postgres数据库中数据的实际大小。可以在数据库报告页面查看。
-
磁盘大小:显示整体磁盘空间使用情况,包括数据库大小以及Postgres运行所需的额外文件,如预写日志(WAL)和其他系统日志文件。可以在数据库设置页面查看。
数据库大小
以下SQL查询将显示Postgres集群中所有数据库的大小:
123select pg_size_pretty(sum(pg_database_size(pg_database.datname)))from pg_database;
该值会在数据库报告页面中显示。
数据库大小主要由您的数据、索引和物化视图占用。您可以通过删除其中任何一项并运行Vacuum操作来减少数据库大小。
根据您的计费计划,数据库可能会进入只读模式,这将阻止您插入和删除数据。磁盘管理部分提供了管理只读模式的说明。
磁盘空间使用情况
您的数据库大小是 Supabase 项目磁盘使用量的一部分,Postgres 有许多组件会消耗额外的磁盘空间。其中一个主要组件是预写日志(WAL)。Postgres 会将数据库变更存储在日志文件中,这些文件在应用到数据库后会被清除。这些相同的文件也被只读副本或其他复制方法使用。
如果您想确定存储在磁盘上的 WAL 文件大小,Postgres 提供了 pg_ls_waldir
作为辅助函数;可以运行以下查询:
1select pg_size_pretty(sum(size)) as wal_size from pg_ls_waldir();
真空(VACUUM)操作
Postgres 不会立即回收数据库中死元组(即已删除行)占用的物理空间。它们会被标记为"已移除",直到执行真空操作。因此,从数据库中删除数据可能不会立即减少报告的磁盘使用量。您可以使用 Supabase CLI 的 inspect db bloat
命令查看数据库中的所有死元组。或者,您可以在 SQL 编辑器 中运行 CLI 的 GitHub 仓库中找到的查询。
12345678# 登录 CLInpx supabase login# 初始化本地 supabase 目录npx supabase init# 关联项目npx supabase link
检测膨胀
npx supabase inspect db bloat --linked
1234如果您发现需要立即清理的表,可以在 [SQL 编辑器](https://supabase.com/dashboard/project/_/sql/new) 中运行以下命令:```sqlvacuum full <表名>;
VACUUM 操作可能会暂时增加资源使用率,在维护完成前可能对项目性能产生不利影响。vacuum full 命令会锁定表直到操作完成。
Supabase 项目默认启用了自动 vacuum 功能,确保定期执行这些操作以保持数据库健康和性能良好。您可以微调 autovacuum 参数,或者手动启动 vacuum 操作。在删除大量数据后运行手动 vacuum 可能有助于减少 Postgres 报告的数据库大小。
预占用空间
新的 Supabase 项目数据库大小约为 40-60MB。这个空间包括预安装的扩展、模式以及默认的 Postgres 数据。安装扩展时会占用额外的数据库空间,即使这些扩展处于非活动状态。
磁盘大小
Supabase 使用网络附加存储来平衡性能与可扩展性。磁盘扩展行为取决于您的计费计划。
付费计划行为
专业版(Pro Plan)及更高等级的项目拥有自动扩展磁盘功能。
当数据库使用量达到分配磁盘大小的90%时,磁盘会自动扩容。磁盘将扩展至当前容量的150%(例如8GB→12GB)。自动扩容每6小时只能执行一次。如果在这6小时内磁盘使用率达到95%,您的项目将进入只读模式。
自动扩容操作会添加当前容量50%的空间,上限为200GB。如果当前容量的50%超过200GB,则只会添加200GB(例如1500GB的磁盘将扩容至1700GB)。
您也可以在数据库设置页面手动扩展磁盘容量。专业版/团队版(Pro/Team Plan)的最大磁盘容量为60TB。如需更大容量,请联系我们了解企业版(Enterprise Plan)详情。
免费版计划行为
当您超过500 MB限制时,免费版项目将进入只读模式。进入只读模式后,您有以下选择:
只读模式
在某些情况下,Supabase可能会将您的数据库置于只读模式,以防止超出计费或磁盘限制。
在只读模式下,客户端会遇到诸如cannot execute INSERT in a read-only transaction
等错误。当使用量低于磁盘大小的95%时,常规操作(读写模式)将自动恢复。
禁用只读模式
您可以手动覆盖只读模式来缩减磁盘大小。为此,请在SQL编辑器中运行以下命令:
首先,更改事务访问模式:
1set session characteristics as transaction read write;
这将允许您在会话中删除数据。删除数据后,建议运行vacuum以尽可能多地回收空间:
1vacuum;
回收空间后,您可以运行以下命令来禁用只读模式:
1set 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大约每周会发布新版本,待新版本可用后即可进行升级。