数据库

自定义Postgres配置


每个 Supabase 项目都是一个预配置的 Postgres 集群。您可以根据需要覆盖某些配置设置。这是一个高级主题,除非必要,我们不建议修改这些设置。

查看设置

要列出所有 Postgres 设置及其描述,请运行:

1
select * from pg_settings;

可配置设置

用户上下文设置

pg_settings 表中的 context 列指定了更改设置的要求。默认情况下,具有 user 上下文的设置可以通过 SQLroledatabase 级别进行修改。

要列出所有用户上下文设置,请运行:

1
select * from pg_settings where context = 'user';

例如,可以修改 statement_timeout 设置:

1
alter database "postgres" set "statement_timeout" TO '60s';

要验证更改,请执行:

1
show "statement_timeout";

超级用户设置

部分设置仅能由超级用户修改。Supabase 预先启用了 supautils 扩展,该扩展允许 postgres 角色保留某些超级用户权限。这使得可以在 role 级别修改以下保留配置:

设置项描述
auto_explain.log_min_duration记录执行时间超过此阈值的查询计划。
auto_explain.log_nested_statements记录嵌套语句的执行计划。
log_min_messages记录消息的最低严重级别。
pg_net.ttl设置 pg_net 扩展 保存响应的时间长度
pg_net.batch_size设置 pg_net 扩展 每秒可发出的请求数量
pgaudit.*配置 PGAudit 扩展log_parameter 参数仍受限制以保护敏感信息
pgrst.*PostgREST 设置
plan_filter.*配置 pg_plan_filter 扩展
session_replication_role设置会话对触发器和重写规则的行为。
track_io_timing收集数据库 I/O 活动的时间统计信息。

例如,要为 postgres 角色启用 log_nested_statements,执行:

1
alter role "postgres" set "auto_explain.log_nested_statements" to 'on';

查看变更:

1
2
3
4
5
select rolname, rolconfigfrom pg_roleswhere rolname = 'postgres';

CLI 可配置设置

虽然许多 Postgres 参数可以直接配置,但部分配置可以通过 Supabase CLI 在 system 级别进行修改。

CLI 支持的参数

以下参数可供覆盖配置:

  1. effective_cache_size(有效缓存大小)
  2. logical_decoding_work_mem(仅限CLI)
  3. maintenance_work_mem(维护工作内存)
  4. max_connections(仅限CLI)
  5. max_locks_per_transaction(仅限CLI)
  6. max_parallel_maintenance_workers(最大并行维护工作线程数)
  7. max_parallel_workers_per_gather(每个Gather节点最大并行工作线程数)
  8. max_parallel_workers(最大并行工作线程数)
  9. max_replication_slots(仅限CLI)
  10. max_slot_wal_keep_size(仅限CLI)
  11. max_standby_archive_delay(仅限CLI)
  12. max_standby_streaming_delay(仅限CLI)
  13. max_wal_size(仅限CLI)
  14. max_wal_senders(仅限CLI)
  15. max_worker_processes(仅限CLI)
  16. session_replication_role(会话复制角色)
  17. shared_buffers(仅限CLI)
  18. statement_timeout(语句超时)
  19. track_activity_query_size(活动查询跟踪大小)
  20. track_commit_timestamp(提交时间戳跟踪)
  21. wal_keep_size(仅限CLI)
  22. wal_sender_timeout(仅限CLI)
  23. work_mem(工作内存)

使用 CLI 管理 Postgres 配置

开始前:

  1. 安装 Supabase CLI 1.69.0 或更高版本
  2. 使用 CLI 登录 您的 Supabase 账户

要更新 Postgres 配置,使用 postgres config 命令:

1
2
3
supabase --experimental \--project-ref <project-ref> \postgres-config update --config shared_buffers=250MB

默认情况下,CLI 会将提供的配置覆盖与现有配置合并。使用 --replace-existing-overrides 标志可以强制用新配置完全替换现有覆盖:

1
2
3
4
supabase --experimental \--project-ref <project-ref> \postgres-config update --config max_parallel_workers=3 \--replace-existing-overrides

要删除特定配置覆盖,使用 postgres-config delete 命令:

1
2
3
supabase --experimental \--project-ref <project-ref> \postgres-config delete --config shared_buffers,work_mem

默认情况下,无论是更新还是删除配置,都会导致数据库及其所有关联的只读副本重启。您可以使用 --no-restart 标志来阻止此行为,尝试在不重启的情况下重新加载更新后的配置。请参考 Postgres 文档以确定特定参数是否可以在不重启的情况下重新加载。

1
2
3
supabase --experimental \--project-ref <project-ref> \postgres-config delete --config shared_buffers --no-restart

重置为默认配置

要将数据库级别的设置重置为默认值:

1
2
3
4
5
-- 重置数据库级别的单个设置alter database "postgres" set "<setting_name>" to default;-- 重置数据库级别的所有设置alter database "postgres" reset all;

对于role级别的配置,可以执行:

1
alter role "<role_name>" set "<setting_name>" to default;

注意事项

  1. 通过CLI进行的更改可能会重启数据库,导致现有数据库连接短暂中断;在大多数情况下,中断时间不应超过几秒。但您可以使用--no-restart标志绕过重启以保持连接不受影响。请注意,这取决于您所做的具体配置更改。如果更改需要重启,使用--no-restart标志将阻止重启,但这些更改只有在手动触发重启后才会生效。此外,某些参数在主库和只读副本上必须保持一致;在这些情况下不重启可能导致只读副本在主库/只读副本单独重启时出现故障。

  2. 自定义Postgres配置将始终覆盖Supabase生成的默认优化。当更改计算附加组件时,您还应审查并更新自定义Postgres配置,以确保它们与更新后的计算资源保持兼容和有效。

  3. 某些参数(例如wal_keep_size)可能会增加磁盘使用率,触发磁盘扩容,进而可能导致账单费用增加