You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Supabase执行Prisma migrate dev时频繁出现Postgres advisory lock超时

问题描述

使用Supabase(Postgres 15.1.0.88)搭配Prisma ORM 4.15.0执行pnpm prisma migrate dev或pnpm prisma migrate reset时,频繁出现超时错误,核心报错信息:

Error: P1002
The database server at db.***.supabase.co:5432 was reached but timed out.
Context: Timed out trying to acquire a postgres advisory lock (SELECT pg_advisory_lock(72707369)). Elapsed: 10000ms.

同时Supabase日志中出现relation "_prisma_migrations" does not exist的错误,后续还会触发connection to client lost和canceling statement due to statement timeout(对应锁查询语句)的日志。等待一段时间后,迁移命令偶尔能成功执行1-2次。

解决方案

1. 延长Prisma的锁超时时间

Prisma默认锁超时为10秒,针对Supabase的网络延迟或资源竞争情况,可在schema.prisma中配置更长的超时时间:

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
  migrate  = { lockTimeout = 30000 } // 设置为30秒,可根据实际情况调整
}

修改后重新执行迁移命令,给锁获取流程预留更多缓冲时间。

2. 手动创建_prisma_migrations表

日志中出现的_prisma_migrations不存在错误,可能是初始迁移时表未创建成功导致流程阻塞。登录Supabase控制台,进入SQL编辑器执行以下语句:

CREATE TABLE IF NOT EXISTS "_prisma_migrations" (
  "id" VARCHAR(36) NOT NULL,
  "checksum" VARCHAR(64) NOT NULL,
  "finished_at" TIMESTAMP(3),
  "migration_name" VARCHAR(255) NOT NULL,
  "logs" TEXT,
  "rolled_back_at" TIMESTAMP(3),
  "started_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
  "applied_steps_count" INTEGER NOT NULL DEFAULT 0,
  CONSTRAINT "_prisma_migrations_pkey" PRIMARY KEY ("id")
);

创建完成后再尝试执行迁移命令。

3. 排查Supabase数据库资源与连接状态

  • 查看Supabase项目的数据库资源监控面板,检查CPU、内存、连接数是否耗尽,免费/基础套餐在高峰时段可能存在资源限制。
  • 查看Supabase的慢查询日志,确认是否有长时间运行的查询占用数据库资源,导致锁等待超时。

4. 绕过Prisma锁机制手动执行迁移

如果锁问题持续存在,可拆分迁移流程手动执行:

  1. 生成迁移文件但不自动执行:
    pnpm prisma migrate dev --create-only
    
  2. 找到prisma/migrations目录下新生成的SQL文件,复制内容到Supabase的SQL编辑器中手动执行。
  3. 执行完成后,运行以下命令标记该迁移已完成:
    pnpm prisma migrate resolve --applied <迁移文件名>
    

内容的提问来源于stack exchange,提问作者tlz13

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 10:39:59