事情是这样的,我们的后端服务器部署在美国,邮件服务用的是 Resend(AWS us-east-1),但 Supabase 数据库当时建的时候选在了新加坡。这种区域跨度大会导致请求延迟,趁着项目刚起步、数据量不大,决定把 Supabase 迁移到美国区域。
Supabase 不能直接修改项目区域,只能新建一个项目,然后把旧项目的表结构和数据迁移过去。好在 Supabase 后端就是标准的 PostgreSQL,可以用 pg_dump 和 psql 完成整个迁移过程。

导出旧数据库
迁移的第一步是把旧数据库的内容导出来。pg_dump 可以一次性导出 public 模式下的所有表、触发器、函数以及数据。
首先需要获取旧项目的连接字符串。在 Supabase 控制台最上面有一个 Connect 点开。

选择 URI 模式并复制。连接字符串的格式类似:
postgresql://postgres:[YOUR-PASSWORD]@db.项目ID.supabase.co:5432/postgres

需要你的数据库密码,如果不记得,可以在 Database 设置页面点击 "Reset database password" 重置一个新密码。

拿到连接字符串后,在本地终端运行导出命令:
pg_dump 'postgresql://postgres:你的密码@db.旧项目ID.supabase.co:5432/postgres' > hiapi_backup.sql
注意:如果密码中包含特殊字符(比如感叹号 !),需要用单引号把整个连接字符串包起来,否则 shell 会解析这些特殊字符导致命令失败。
安装 PostgreSQL 客户端
第一次运行 pg_dump 如果遇到这个报错:

这说明本地没有安装 PostgreSQL 客户端工具。Mac 用户可以通过 Homebrew 安装:
brew install postgresql
解决版本不匹配问题
装完客户端再运行,我还遇到了版本不匹配的问题:

这是因为 Supabase 已经升级到 PostgreSQL 17,而本地安装的工具版本太旧。PostgreSQL 要求 pg_dump 的版本必须大于或等于服务器版本,否则会拒绝工作。
解决方法是安装 PostgreSQL 17 并配置环境变量:
# 安装 PostgreSQL 17
brew install postgresql@17
# 添加到 PATH
echo 'export PATH="/opt/homebrew/opt/postgresql@17/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
# 验证版本
pg_dump --version
# 输出应该是 pg_dump (PostgreSQL) 17.x
版本匹配后,重新运行导出命令就能成功生成 hiapi_backup.sql 文件,直接生成在你当前运行终端命令的目录下。

创建新项目并导入数据
在 Supabase 控制台创建新项目,选一个和后端服务器、邮件服务在同一个区域的地方。
新项目创建完成后,还按照上面说的去 Connect 获取新的连接字符串,然后运行导入命令:
psql 'postgresql://postgres:新密码@db.新项目ID.supabase.co:5432/postgres' < hiapi_backup.sql
执行过程看到了一些报错信息,和AI咨询了一下,说这些报错是正常的。只要检查一下核心表结构和数据进去了就可以。比如表的数量对不对,之前写的一些函数和触发器有没有同步过来,比如表里面的数据一不一致。

迁移注意事项
根据 Supabase 官方文档,使用 pg_dump / psql 迁移时有几点需要注意:
1、如果想让迁移更快,可以临时升级新项目的 Compute 配置,导入完成后再降回去。使用 --no-owner --no-privileges 参数导出可以避免用户权限冲突,让导出文件更干净。
2、如果之前用 Supabase CLI 管理数据库迁移历史,想保留这些记录的话,需要单独导出 supabase_migrations schema 的数据。
3、迁移完成后记得更新项目中的环境变量,把 Supabase URL 和 API Key 换成新项目的。
💡 AI 工具的爆发,让普通人也能快速做出产品。
但如何做?如何变现?如何真正走向海外市场?
👇 想了解更多 AI 编程 & 出海实战信息,扫码添加好友了解更多
🔗 更多教程请访问 ipengtao.com
文章评论