超时设置
延长数据库超时时间以执行更长时间的事务
控制面板和客户端查询的最大可配置超时时间为60秒。对于更长时间的事务,请使用Supavisor或直接连接。
修改Postgres超时设置
您可以在以下级别修改Postgres超时:
会话级别
会话级别设置仅在连接持续期间有效。
通过运行以下命令设置会话超时:
1set statement_timeout = '10min';
由于它仅适用于会话,因此只能通过Supavisor的会话模式(端口5432)或直接连接使用。不能在控制面板、Supabase客户端API或Supavisor的事务模式(端口6543)中使用。
这通常用于单个长时间运行的管理任务,例如创建HSNW索引。设置完成后,您可以通过执行以下命令查看:
1SHOW statement_timeout;
查看完整的修改会话超时指南。
函数级别
当通过Supabase客户端库调用时,此设置适用于数据库REST API:
123456create 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分钟)
执行以下查询来修改角色的超时时间:
1alter role example_role set statement_timeout = '10min'; -- 也可以使用秒数'10s'
如果您正在修改Supabase客户端API调用的超时时间,需要通过运行以下脚本重新加载PostgREST以使超时更改生效:
1NOTIFY pgrst, 'reload config';
与全局设置不同,结果无法通过SHOW statement_timeout
查看。请改为运行:
123456789101112select rolname, rolconfigfrom pg_roleswhere rolname in ( 'anon', 'authenticated', 'postgres', 'service_role' -- ,<任何自定义角色> );
全局级别
此设置会修改所有未显式设置超时的角色和会话的语句超时时间。
1alter database postgres set statement_timeout TO '4s';
检查更改是否生效:
1show statement_timeout;
虽然非必要,但如果您不确定超时是否已应用,可以运行快速测试:
12345create or replace function myfunc()returns void as $$ select pg_sleep(601); -- 模拟长时间运行的进程$$language sql;
识别超时
Supabase仪表板提供了工具来帮助您识别已超时和长时间运行的查询。
使用日志浏览器
前往日志浏览器,运行以下查询来识别超时事件(statement timeout
)和成功运行超过10秒的查询(duration
)。
1234567891011121314151617181920select 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服务使用,用于项目配置 |
authenticator | PostgREST服务 |
supabase_auth_admin | 认证服务 |
supabase_storage_admin | 存储服务 |
supabase_replication_admin | 同步读取副本 |
postgres | Supabase仪表盘和外部工具(如Prisma、SQLAlchemy、PSQL等) |
自定义角色 | 外部工具(如Prisma、SQLAlchemy、PSQL等) |
通过parsed.user_name
字段可以筛选特定用户产生的日志:
12345-- 基于角色/服务器查找事件... querywhere -- 查找相关角色产生的事件 parsed.user_name = '<ROLE>'