调用supabase db reset出现内存不足错误,求解决方案
问题
执行supabase db reset命令时出现错误:failed to send batch: ERROR: Out of memory (SQLSTATE XX000)。经排查,问题源于一个使用PostgreSQL net扩展的数据库迁移脚本,函数代码如下:
-- Function to send Slack notification for new users CREATE OR REPLACE FUNCTION public.send_slack_new_user_notification(new_user_record jsonb) RETURNS void LANGUAGE plpgsql SECURITY DEFINER set search_path = public AS $function$ DECLARE _project_url text; _anon_key text; _url text; _headers jsonb; BEGIN -- Get project URL and anon key dynamically SELECT public.get_project_url() INTO _project_url; SELECT public.get_anon_key() INTO _anon_key; -- Construct the full function URL _url := format('%s/functions/v1/on_new_user_slack_notify', _project_url); -- Construct the headers with the anon key _headers := format('{"Content-Type": "application/json", "Authorization": "Bearer %s"}', _anon_key)::jsonb; -- Perform a web request to our Edge Function select "net"."http_post"( url:= _url, body:=jsonb_build_object('record', new_user_record), headers:= _headers ); END; $function$;
注释掉HTTP请求代码后,supabase db reset可正常执行。尝试调整db.settings中的shared_buffers、work_mem、maintenance_work_mem等内存参数,问题仍未解决。
解决方案
- 迁移脚本仅创建函数,不执行外部请求:迁移的核心是变更数据库结构,执行外部HTTP请求会让迁移依赖外部服务,还容易引发内存问题。建议只在迁移中定义函数,将实际的HTTP请求触发逻辑放到业务代码或PostgreSQL触发器中(比如用户创建时触发),避免迁移阶段执行外部调用。
- 给HTTP请求添加超时限制:net扩展的
http_post如果遇到目标服务响应缓慢或返回大体积数据,会持续占用内存。给请求添加超时参数,强制终止超时请求:select "net"."http_post"( url:= _url, body:=jsonb_build_object('record', new_user_record), headers:= _headers, timeout_milliseconds:= 3000 -- 设置3秒超时 ); - 优化PostgreSQL内存参数:除了常规参数,调整
max_worker_processes减少并发进程数,temp_buffers调大以避免临时数据溢出到磁盘引发的间接内存压力;同时确保work_mem设置合理,避免单个请求占用过多内存。 - 拆分迁移与业务逻辑:将函数创建和首次执行分离,迁移脚本只完成函数定义,函数的实际调用放到应用启动后的初始化流程中,彻底避免迁移阶段的外部请求操作。
内容的提问来源于stack exchange,提问作者progNewbie
相关产品推荐
相关产品推荐

