数据库

超时设置

延长数据库超时时间以执行更长时间的事务


修改Postgres超时设置

您可以在以下级别修改Postgres超时:

  1. 会话级别
  2. 函数级别
  3. 全局级别
  4. 角色级别

会话级别

会话级别设置仅在连接持续期间有效。

通过运行以下命令设置会话超时:

1
set statement_timeout = '10min';

由于它仅适用于会话,因此只能通过Supavisor的会话模式(端口5432)或直接连接使用。不能在控制面板、Supabase客户端API或Supavisor的事务模式(端口6543)中使用。

这通常用于单个长时间运行的管理任务,例如创建HSNW索引。设置完成后,您可以通过执行以下命令查看:

1
SHOW statement_timeout;

查看完整的修改会话超时指南

函数级别

当通过Supabase客户端库调用时,此设置适用于数据库REST API:

1
2
3
4
5
6
create or replace function myfunc()returns void as $$ select pg_sleep(3); -- 模拟一些长时间运行的进程$$language sqlset statement_timeout TO '4s'; -- 设置自定义超时

这主要用于需要特殊运行时间豁免的重复函数。

角色级别

此设置用于为特定角色配置超时时间。

默认角色超时时间为:

  • anon:3秒
  • authenticated:8秒
  • service_role:无(若未设置则默认使用authenticator角色的8秒超时)
  • postgres:无(默认受全局超时限制为2分钟)

执行以下查询来修改角色的超时时间:

1
alter role example_role set statement_timeout = '10min'; -- 也可以使用秒数'10s'

与全局设置不同,结果无法通过SHOW statement_timeout查看。请改为运行:

1
2
3
4
5
6
7
8
9
10
11
12
select rolname, rolconfigfrom pg_roleswhere rolname in ( 'anon', 'authenticated', 'postgres', 'service_role' -- ,<任何自定义角色> );

全局级别

此设置会修改所有未显式设置超时的角色和会话的语句超时时间。

1
alter database postgres set statement_timeout TO '4s';

检查更改是否生效:

1
show statement_timeout;

虽然非必要,但如果您不确定超时是否已应用,可以运行快速测试:

1
2
3
4
5
create or replace function myfunc()returns void as $$ select pg_sleep(601); -- 模拟长时间运行的进程$$language sql;

识别超时

Supabase仪表板提供了工具来帮助您识别已超时和长时间运行的查询。

使用日志浏览器

前往日志浏览器,运行以下查询来识别超时事件(statement timeout)和成功运行超过10秒的查询(duration)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
select cast(postgres_logs.timestamp as datetime) as timestamp, event_message, parsed.error_severity, parsed.user_name, parsed.query, parsed.detail, parsed.hint, parsed.sql_state_code, parsed.backend_typefrom postgres_logs cross join unnest(metadata) as metadata cross join unnest(metadata.parsed) as parsedwhere regexp_contains(event_message, 'duration|statement timeout') -- (可选) 修改或移除 and parsed.user_name = 'authenticator' -- <--------修改此处order by timestamp desclimit 100;

使用查询性能页面

前往查询性能页面,按相关角色和查询速度进行筛选。此页面仅识别运行缓慢但成功的查询。与日志浏览器不同,它不会显示超时的查询。

理解日志中的角色

每个API服务器都使用特定用户连接数据库:

角色对应API/工具
supabase_admin被Realtime服务使用,用于项目配置
authenticatorPostgREST服务
supabase_auth_admin认证服务
supabase_storage_admin存储服务
supabase_replication_admin同步读取副本
postgresSupabase仪表盘和外部工具(如Prisma、SQLAlchemy、PSQL等)
自定义角色外部工具(如Prisma、SQLAlchemy、PSQL等)

通过parsed.user_name字段可以筛选特定用户产生的日志:

1
2
3
4
5
-- 基于角色/服务器查找事件... querywhere -- 查找相关角色产生的事件 parsed.user_name = '<ROLE>'