Supabase云数据库迁移到本地
11/25/2025, 3:24:11 PM
#Next.js#React#Supabase
上次写了个本地数据迁移到云数据库,那么也该有个从云数据库迁移到本地的。其实基本就是数据库地址换一下,但是考虑到数据安全,所以多做了很多步骤......
准备工作
1. 获取云数据库连接地址
类似于postgresql://postgres:[密码]@db.[项目ID].supabase.co:5432/postgres
2.确保本地数据库正在运行
这个不用多说了吧......
3.确认能用 psql/pg_dump 命令访问
没有的话得去自己电脑里面高级设置,搜索环境变量,然后加上。
迁移步骤
步骤 1: 在 .env 中新增 Supabase 直连串
# 本地数据库 PostgreSQL
DATABASE_URL="postgresql://postgres:[密码]@localhost:5432/[项目名]?schema=public"
# 额外保留的 Supabase 直连连接串为单独变量
SUPABASE_DATABASE_URL="postgresql://postgres:[密码]@db.[项目ID].supabase.co:5432/postgres"
步骤 2: 备份本地数据库
先做本地二进制备份以便回滚;注意在 Windows 下的 Git Bash 中,需要把 PostgreSQL bin 目录加入 PATH。
执行命令:
export PATH="[本机安装的bin目录]:$PATH"
export PGPASSWORD="安装数据库时设置的密码"
mkdir -p backups
pg_dump -h localhost -p 5432 -U postgres -Fc [自己定义的数据库名] -f backups/yyj_blog.pre-migrate.dump
命令解析:
pg_dump:PostgreSQL 的命令行导出工具,用于导出数据库内容。
-h localhost:连接主机为 localhost(本机)。
-p 5432:连接端口为 5432(Postgres 默认端口)。
-U postgres:以数据库用户 postgres 进行连接(会提示密码,或通过环境变量 PGPASSWORD 提供)。
-Fc:指定输出格式为 custom(自定义二进制格式)。该格式可由 pg_restore 增量或并行恢复,适合备份/恢复操作。
-f backups/yyj_blog.pre-migrate.dump:把导出的备份写到指定文件(此处是 yyj_blog.pre-migrate.dump)。
步骤 3: 从 Supabase 导出 JSON
执行命令:
# 第一条命令等价于下面第二条,读取的变量是.env文件里的SUPABASE_DATABASE_URL,导出的是云端数据库
# 但是第二条会从文件读取,适合多人/多环境,避免在命令历史里直接明文写密码(但是要在前面导出密码)
export DATABASE_URL="postgresql://postgres:[密码]@db.[项目ID].supabase.co:5432/postgres"
# export DATABASE_URL="$(grep -E '^SUPABASE_DATABASE_URL=' .env | sed 's/^SUPABASE_DATABASE_URL=//; s/^"//; s/"$//')"
# 然后运行之前写过的导出脚本
node scripts/tools/export-data.mjs
步骤 4: 在本地应用 Prisma 迁移
执行命令:
export DATABASE_URL="$(grep -E '^DATABASE_URL=' .env | sed 's/^DATABASE_URL=//; s/^"//; s/"$//')"
npx prisma migrate deploy
步骤 5: 导入 JSON 到本地
方法一:先清空,再导入
清空本地表(示例命令):
LOCAL_CONN=$(grep -E "^DATABASE_URL=" .env | sed 's/^DATABASE_URL=//; s/^"//; s/"$//' | cut -d'?' -f1)
# 用 psql 连接到 LOCAL_CONN 指定的数据库并执行 SQL 命令。
# SQL 部分:TRUNCATE TABLE "AuditLog","User":清空这些表的数据
psql "$LOCAL_CONN" -c 'TRUNCATE TABLE "AuditLog","User" RESTART IDENTITY CASCADE;'
随后运行导入:
# ls -t 按修改时间降序列出匹配 data-export/backup-*.json 的文件
# head -n1 取第一个(最新的文件),赋值给变量 LATEST_JSON。若没有匹配,变量可能为空或 ls 报错
# 相当于保险一点取最新的备份文件进行导入,如果默认导入就是最新的,直接执行node scripts/tools/import-data.mjs
LATEST_JSON=$(ls -t data-export/backup-*.json | head -n1)
# 要导入的数据库
export DATABASE_URL="$LOCAL_CONN"
# 导入
node scripts/tools/import-data.mjs "$LATEST_JSON"
方法二:直接覆盖
export DATABASE_URL="postgresql://postgres:[密码]@localhost:5432/[项目名]"
node scripts/tools/import-data.mjs --force