超时
延长数据库超时时间以执行更长时间的事务
仪表板和 客户端查询具有最大可配置超时时间 60 秒。对于更长时间的事务,请使用 Supavisor 或直接连接。
更改 Postgres 超时时间#
您可以在以下位置更改 Postgres 超时时间:
会话级别#
会话级别设置仅在连接持续时间内有效。
通过运行以下命令设置会话超时时间:
1set statement_timeout = '10min';由于它仅适用于会话,因此只能通过 Supavisor 在会话模式(端口 5432)或直接连接进行连接时使用。它不能在仪表板中使用,也不能与 Supabase 客户端 API 或 Supavisor 在事务模式(端口 6543)中使用。
这通常用于单个、长时间运行的行政任务,例如创建 HSNW 索引。实施设置后,您可以通过执行以下命令查看它:
1SHOW statement_timeout;有关更改会话超时时间的完整指南,请参见 此处。
函数级别#
这适用于从 Supabase 客户端库调用的数据库 REST API。
1create or replace function myfunc()2returns void as $$3 select pg_sleep(3); -- simulating some long-running process4$$5language sql6set statement_timeout TO '4s'; -- set custom timeout这主要用于需要特殊运行时豁免的重复函数。
角色级别#
这为特定角色设置超时时间。
默认角色超时时间为:
anon: 3sauthenticated: 8sservice_role: 无(如果未设置,则默认为authenticator角色的 8s 超时时间)postgres: 无(默认情况下由全局超时时间限制为 2 分钟)
运行以下查询以更改角色的超时时间:
1alter role example_role set statement_timeout = '10min'; -- could also use seconds '10s'如果您正在更改 Supabase 客户端 API 调用的超时时间,则需要重新加载 PostgREST 以反映超时时间更改,方法是运行以下脚本:
1NOTIFY pgrst, 'reload config';与全局设置不同,结果不能使用 SHOW statement_timeout 检查。而是运行:
1select2 rolname,3 rolconfig4from pg_roles5where6 rolname in (7 'anon',8 'authenticated',9 'postgres',10 'service_role'11 -- ,<ANY CUSTOM ROLES>12 );全局级别#
这更改了所有角色和会话的语句超时时间,而无需设置显式超时时间。
1alter database postgres set statement_timeout TO '4s';检查您的更改是否生效:
1show statement_timeout;虽然不是必需的,但如果您不确定是否应用了超时时间,可以运行一个快速测试:
1create or replace function myfunc()2returns void as $$3 select pg_sleep(601); -- simulating some long-running process4$$5language sql;识别超时#
Supabase 仪表板包含帮助您识别超时和长时间运行的查询的工具。
使用日志资源管理器#
转到 日志资源管理器,并运行以下查询以识别超时事件(statement timeout)和成功运行时间超过 10 秒的查询(duration)。
1select2 cast(postgres_logs.timestamp as datetime) as timestamp,3 event_message,4 parsed.error_severity,5 parsed.user_name,6 parsed.query,7 parsed.detail,8 parsed.hint,9 parsed.sql_state_code,10 parsed.backend_type11from12 postgres_logs13 cross join unnest(metadata) as metadata14 cross join unnest(metadata.parsed) as parsed15where16 regexp_contains(event_message, 'duration|statement timeout')17 -- (OPTIONAL) MODIFY OR REMOVE18 and parsed.user_name = 'authenticator' -- <--------CHANGE19order by timestamp desc20limit 100;使用查询性能页面#
转到 查询性能页面,并按相关角色和查询速度进行筛选。这仅识别运行缓慢但成功的查询。与日志资源管理器不同,它不会向您显示超时查询。
了解日志中的角色#
每个 API 服务器都使用指定的用户连接到数据库:
| 角色 | API/工具 |
|---|---|
supabase_admin | 用于实时和项目配置 |
authenticator | PostgREST |
supabase_auth_admin | 认证 |
supabase_storage_admin | 存储 |
supabase_replication_admin | 同步只读副本 |
postgres | Supabase 仪表板和外部工具(例如,Prisma、SQLAlchemy、PSQL...) |
| 自定义角色 | 外部工具(例如,Prisma、SQLAlchemy、PSQL...) |
按 parsed.user_name 字段进行筛选,以仅检索由特定用户发出的日志
1-- find events based on role/server2... query3where4 -- find events from the relevant role5 parsed.user_name = '<ROLE>'