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 atdb.***.supabase.co:5432was 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锁机制手动执行迁移
如果锁问题持续存在,可拆分迁移流程手动执行:
- 生成迁移文件但不自动执行:
pnpm prisma migrate dev --create-only - 找到
prisma/migrations目录下新生成的SQL文件,复制内容到Supabase的SQL编辑器中手动执行。 - 执行完成后,运行以下命令标记该迁移已完成:
pnpm prisma migrate resolve --applied <迁移文件名>
内容的提问来源于stack exchange,提问作者tlz13

