数据库

超时

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


更改 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
create or replace function myfunc()
2
returns void as $$
3
select pg_sleep(3); -- simulating some long-running process
4
$$
5
language sql
6
set statement_timeout TO '4s'; -- set custom timeout

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

角色级别#

这为特定角色设置超时时间。

默认角色超时时间为:

  • anon: 3s
  • authenticated: 8s
  • service_role: 无(如果未设置,则默认为 authenticator 角色的 8s 超时时间)
  • postgres: 无(默认情况下由全局超时时间限制为 2 分钟)

运行以下查询以更改角色的超时时间:

1
alter role example_role set statement_timeout = '10min'; -- could also use seconds '10s'

与全局设置不同,结果不能使用 SHOW statement_timeout 检查。而是运行:

1
select
2
rolname,
3
rolconfig
4
from pg_roles
5
where
6
rolname in (
7
'anon',
8
'authenticated',
9
'postgres',
10
'service_role'
11
-- ,<ANY CUSTOM ROLES>
12
);

全局级别#

这更改了所有角色和会话的语句超时时间,而无需设置显式超时时间。

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

检查您的更改是否生效:

1
show statement_timeout;

虽然不是必需的,但如果您不确定是否应用了超时时间,可以运行一个快速测试:

1
create or replace function myfunc()
2
returns void as $$
3
select pg_sleep(601); -- simulating some long-running process
4
$$
5
language sql;

识别超时#

Supabase 仪表板包含帮助您识别超时和长时间运行的查询的工具。

使用日志资源管理器#

转到 日志资源管理器,并运行以下查询以识别超时事件(statement timeout)和成功运行时间超过 10 秒的查询(duration)。

1
select
2
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_type
11
from
12
postgres_logs
13
cross join unnest(metadata) as metadata
14
cross join unnest(metadata.parsed) as parsed
15
where
16
regexp_contains(event_message, 'duration|statement timeout')
17
-- (OPTIONAL) MODIFY OR REMOVE
18
and parsed.user_name = 'authenticator' -- <--------CHANGE
19
order by timestamp desc
20
limit 100;

使用查询性能页面#

转到 查询性能页面,并按相关角色和查询速度进行筛选。这仅识别运行缓慢但成功的查询。与日志资源管理器不同,它不会向您显示超时查询。

了解日志中的角色#

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

角色API/工具
supabase_admin用于实时和项目配置
authenticatorPostgREST
supabase_auth_admin认证
supabase_storage_admin存储
supabase_replication_admin同步只读副本
postgresSupabase 仪表板和外部工具(例如,Prisma、SQLAlchemy、PSQL...)
自定义角色外部工具(例如,Prisma、SQLAlchemy、PSQL...)

parsed.user_name 字段进行筛选,以仅检索由特定用户发出的日志

1
-- find events based on role/server
2
... query
3
where
4
-- find events from the relevant role
5
parsed.user_name = '<ROLE>'