如何迁移Supabase项目
本文为您介绍如何使用supabase-cli迁移工具,将一个完整的Supabase项目(包括数据库、存储对象和边缘函数)迁移至云原生数据仓库AnalyticDB PostgreSQL版Supabase(简称AnalyticDB Supabase)。
适用场景
迁移路径
-
从Supabase Cloud迁移至AnalyticDB Supabase。
-
从自托管Supabase项目迁移至AnalyticDB Supabase。
-
AnalyticDB Supabase项目之间迁移。
迁移内容
-
数据库模式:包括Schema、表结构、函数和触发器等。
-
数据库数据:包括用户数据、auth数据及其他系统数据。
-
PostgreSQL扩展:自动在目标项目安装所需插件。
-
存储对象 (Storage):存储桶(Buckets)和其中的文件。
-
边缘函数 (Edge Functions):函数代码及其相关配置。
-
角色与权限:数据库的用户和权限设置。
迁移命令语法
选择对应平台中的迁移工具,使用如下命令迁移。
./supabase-cli migrate-project [flags]
必选参数
-
源环境配置
-
Supabase Cloud源配置
--source-project-ref string # 源项目引用ID (必需) --source-anon-key string # 源项目匿名密钥 (必需) --source-service-role-key string # 源项目服务角色密钥 (必需) -
自托管Supabase项目或AnalyticDB Supabase
--source-api-url string # 源API URL (必需) --source-anon-key string # 源项目匿名密钥 (必需) --source-service-role-key string # 源项目服务角色密钥 (必需) --source-database-url string # 源数据库URL (必需) 且需要 percent-encoded
-
-
目标环境配置
--target-api-url string # 目标API URL(必需) --target-anon-key string # 目标项目匿名密钥 (必需) --target-service-role-key string # 目标项目服务角色密钥 (必需) --target-database-url string # 目标数据库URL(必需)且需要 percent-encoded
可选参数
-
Supabase Cloud源配置
--source-database-url string # 源数据库URL (可选) 需要 percent-encoded -
迁移内容
--include-data # 包含数据库数据(默认:true) --include-storage # 包含存储对象(默认:true) --include-functions # 包含Edge Functions(默认:true) --include-system-data # 包含系统模块数据(默认:true) -
执行选项
--use-local-exec # 使用本地执行器,不依赖Docker容器,需要本地按转pgdump等工具 --concurrency int # 并发操作数(默认:2) --dry-run # 预览模式,不执行实际迁移 --resume-from string # 从指定步骤恢复(database|storage|functions) -
安全选项
重要使用
--allow-truncate参数时,请确保源端和目标端配置正确,防止误操作清理源库数据。--allow-truncate # 允许清理表数据(默认:false) --preserve-extra-tables # 保留目标库额外表(默认:true)
注意事项
-
生产环境迁移前,务必在测试环境中完整验证迁移流程。
-
迁移过程中请保持网络连接稳定。
-
大型数据库迁移可能需要较长时间,请合理安排迁移时间。
-
建议在低峰时段执行生产环境迁移。
前提条件
-
确保以下网络连接正常。AnalyticDB Supabase的具体操作,请参见修改白名单。
-
可以访问源Supabase项目的API和数据库。
-
可以访问目标环境的API和数据库。
-
目标数据库允许外部连接。
-
-
已安装并启动Docker。
迁移步骤
步骤一:获取项目信息并配置环境变量
-
获取源端配置信息。
以Supabase Cloud为例,需从项目设置页面获取以下信息。
-
Project Ref:20字符的项目ID。
-
访问 Supabase 控制台。
-
单击源端项目,查看URL(例如
https://supabase.com/dashboard/project/qeqfhfoebrtkbmwd****),URL末尾即为Project Ref(例如qeqfhfoebrtkbmwd****)。
-
-
Anon Key:匿名密钥(以
eyJ开头)。 -
Service Role Key:服务角色密钥(以
eyJ开头),需要具备读取所有数据的权限。 -
Database URL(可选):PostgreSQL连接字符串。
单击源端项目页面上方connect,切换到Connection String页签下,Method选择Transaction pooler。

-
-
获取目标端AnalyticDB Supabase配置信息。具体操作,请参见获取API Keys。
-
API URL:完整的API地址(如
https://your-domain.supabase.opentrust.net)。 -
Anon Key:目标环境的匿名密钥。
-
Service Role Key:目标环境的服务角色密钥,需要具备完整的管理权限。
-
Database URL:PostgreSQL连接字符串,目标数据库用户需要创建表、插件等权限。
-
-
(可选)建议将项目信息配置到环境变量中,避免在命令行中暴露敏感信息。
-
从Supabase Cloud迁移至AnalyticDB Supabase
# 创建配置文件 cat > migration.env << 'EOF' SOURCE_PROJECT_REF="your-project-ref" SOURCE_ANON_KEY="eyJ..." SOURCE_SERVICE_ROLE_KEY="eyJ..." TARGET_API_URL="https://your-domain.supabase.opentrust.net" TARGET_ANON_KEY="eyJ..." TARGET_SERVICE_ROLE_KEY="eyJ..." TARGET_DATABASE_URL="postgres://postgres:password@{your-project-id}.supabase.opentrust.net:5432/postgres" EOF # 加载环境变量 source migration.env -
从自托管Supabase或AnalyticDB Supabase迁移至AnalyticDB Supabase
# 创建配置文件 cat > migration.env << 'EOF' SOURCE_API_URL="http://localhost:54321" SOURCE_ANON_KEY="eyJ..." SOURCE_SERVICE_ROLE_KEY="eyJ..." SOURCE_DATABASE_URL="postgres://postgres:password@{your-project-id}.supabase.opentrust.net:5432/postgres" TARGET_API_URL="https://your-domain.supabase.opentrust.net" TARGET_ANON_KEY="eyJ..." TARGET_SERVICE_ROLE_KEY="eyJ..." TARGET_DATABASE_URL="postgres://postgres:password@{your-project-id}.supabase.opentrust.net:5432/postgres" EOF # 加载环境变量 source migration.env
-
步骤二:下载迁移工具并登录
-
请根据操作系统和架构,下载对应的supabase-cli工具。后续执行相关命令时,请将
supabase-cli替换为下载的cli工具名称。 -
执行以下命令,并根据提示信息完成登录。
./supabase-cli login
步骤三:(可选)预览迁移
-
如果您未配置环境变量,且数据库密码中存在特殊字符,则需对特殊字符转义处理。
-
如果Supabase Cloud数据库无法访问,出现报错“failed to connect to host=db.xxxx.supabase.co user=postgres database=postgres”,请指定
--source-database-url参数为Transaction pooler地址。获取方法请参见步骤一:获取项目信息并配置环境变量。
-
从Supabase Cloud迁移至AnalyticDB Supabase
./supabase-cli migrate-project \ --source-project-ref "$SOURCE_PROJECT_REF" \ --source-anon-key "$SOURCE_ANON_KEY" \ --source-service-role-key "$SOURCE_SERVICE_ROLE_KEY" \ --target-api-url "$TARGET_API_URL" \ --target-anon-key "$TARGET_ANON_KEY" \ --target-service-role-key "$TARGET_SERVICE_ROLE_KEY" \ --target-database-url "$TARGET_DATABASE_URL" \ --dry-run -
从自托管Supabase或AnalyticDB Supabase迁移至AnalyticDB Supabase
./supabase-cli migrate-project \ --source-hosted \ --source-api-url "$SOURCE_API_URL" \ --source-anon-key "$SOURCE_ANON_KEY" \ --source-service-role-key "$SOURCE_SERVICE_ROLE_KEY" \ --source-database-url "$SOURCE_DATABASE_URL" \ --target-api-url "$TARGET_API_URL" \ --target-anon-key "$TARGET_ANON_KEY" \ --target-service-role-key "$TARGET_SERVICE_ROLE_KEY" \ --target-database-url "$TARGET_DATABASE_URL" \ --dry-run
步骤四:迁移Supabase项目
-
如果您未配置环境变量,且数据库密码中存在特殊字符,则需对特殊字符转义处理。
-
如果Supabase Cloud数据库无法访问,出现报错“failed to connect to host=db.xxxx.supabase.co user=postgres database=postgres”,请指定
--source-database-url参数为Transaction pooler地址。获取方法请参见步骤一:获取项目信息并配置环境变量。
迁移完整项目
-
从Supabase Cloud迁移至AnalyticDB Supabase
./supabase-cli migrate-project \ --source-project-ref "$SOURCE_PROJECT_REF" \ --source-anon-key "$SOURCE_ANON_KEY" \ --source-service-role-key "$SOURCE_SERVICE_ROLE_KEY" \ --target-api-url "$TARGET_API_URL" \ --target-anon-key "$TARGET_ANON_KEY" \ --target-service-role-key "$TARGET_SERVICE_ROLE_KEY" \ --target-database-url "$TARGET_DATABASE_URL" -
从自托管Supabase或AnalyticDB Supabase迁移至AnalyticDB Supabase
./supabase-cli migrate-project \ --source-hosted \ --source-api-url "$SOURCE_API_URL" \ --source-anon-key "$SOURCE_ANON_KEY" \ --source-service-role-key "$SOURCE_SERVICE_ROLE_KEY" \ --source-database-url "$SOURCE_DATABASE_URL" \ --target-api-url "$TARGET_API_URL" \ --target-anon-key "$TARGET_ANON_KEY" \ --target-service-role-key "$TARGET_SERVICE_ROLE_KEY" \ --target-database-url "$TARGET_DATABASE_URL"
仅迁移数据库模式和数据
使用migrate-database子命令仅迁移数据库模式和数据。
支持的额外参数:
-
--include-data:是否包含数据。 -
--include-system-data:是否包含系统数据。 -
--allow-truncate:是否允许清理表数据。 -
--preserve-extra-tables:是否保留额外表。
使用示例如下:
-
从Supabase Cloud迁移至AnalyticDB Supabase
./supabase-cli migrate-project migrate-database \ --source-project-ref "$SOURCE_PROJECT_REF" \ --source-anon-key "$SOURCE_ANON_KEY" \ --source-service-role-key "$SOURCE_SERVICE_ROLE_KEY" \ --target-api-url "$TARGET_API_URL" \ --target-anon-key "$TARGET_ANON_KEY" \ --target-service-role-key "$TARGET_SERVICE_ROLE_KEY" \ --target-database-url "$TARGET_DATABASE_URL" -
从自托管Supabase或AnalyticDB Supabase迁移至AnalyticDB Supabase
./supabase-cli migrate-project migrate-database \ --source-hosted \ --source-api-url "$SOURCE_API_URL" \ --source-anon-key "$SOURCE_ANON_KEY" \ --source-service-role-key "$SOURCE_SERVICE_ROLE_KEY" \ --source-database-url "$SOURCE_DATABASE_URL" \ --target-api-url "$TARGET_API_URL" \ --target-anon-key "$TARGET_ANON_KEY" \ --target-service-role-key "$TARGET_SERVICE_ROLE_KEY" \ --target-database-url "$TARGET_DATABASE_URL"
仅迁移存储桶和对象
使用migrate-storage子命令仅迁移存储桶和对象。
-
从Supabase Cloud迁移至AnalyticDB Supabase
./supabase-cli migrate-project migrate-storage \ --source-project-ref "$SOURCE_PROJECT_REF" \ --source-anon-key "$SOURCE_ANON_KEY" \ --source-service-role-key "$SOURCE_SERVICE_ROLE_KEY" \ --target-api-url "$TARGET_API_URL" \ --target-anon-key "$TARGET_ANON_KEY" \ --target-service-role-key "$TARGET_SERVICE_ROLE_KEY" \ --target-database-url "$TARGET_DATABASE_URL" -
从自托管Supabase或AnalyticDB Supabase迁移至AnalyticDB Supabase
./supabase-cli migrate-project migrate-storage \ --source-hosted \ --source-api-url "$SOURCE_API_URL" \ --source-anon-key "$SOURCE_ANON_KEY" \ --source-service-role-key "$SOURCE_SERVICE_ROLE_KEY" \ --source-database-url "$SOURCE_DATABASE_URL" \ --target-api-url "$TARGET_API_URL" \ --target-anon-key "$TARGET_ANON_KEY" \ --target-service-role-key "$TARGET_SERVICE_ROLE_KEY" \ --target-database-url "$TARGET_DATABASE_URL"
仅迁移Edge Functions
使用migrate-functions子命令或functions-cli工具仅迁移Edge Functions。
-
从Supabase Cloud迁移至AnalyticDB Supabase
./supabase-cli migrate-project migrate-functions \ --source-project-ref "$SOURCE_PROJECT_REF" \ --source-anon-key "$SOURCE_ANON_KEY" \ --source-service-role-key "$SOURCE_SERVICE_ROLE_KEY" \ --target-api-url "$TARGET_API_URL" \ --target-anon-key "$TARGET_ANON_KEY" \ --target-service-role-key "$TARGET_SERVICE_ROLE_KEY" \ --target-database-url "$TARGET_DATABASE_URL" -
从自托管Supabase或AnalyticDB Supabase迁移至AnalyticDB Supabase
./supabase-cli migrate-project migrate-functions \ --source-hosted \ --source-api-url "$SOURCE_API_URL" \ --source-anon-key "$SOURCE_ANON_KEY" \ --source-service-role-key "$SOURCE_SERVICE_ROLE_KEY" \ --source-database-url "$SOURCE_DATABASE_URL" \ --target-api-url "$TARGET_API_URL" \ --target-anon-key "$TARGET_ANON_KEY" \ --target-service-role-key "$TARGET_SERVICE_ROLE_KEY" \ --target-database-url "$TARGET_DATABASE_URL"
常见问题
连接源数据库报错“connections refused”,如何解决?
使用以下命令检查网络连接。
# 检查网络连接
ping db.your-project-ref.supabase.co
# 检查数据库URL格式
# 正确格式:postgres://postgres:password@host:port/database
权限报错“permission denied for schema auth”,如何解决?
-
确保使用的是Service role key,而不是Anon key。
-
检查密钥是否有足够的权限,权限要求请参见前提条件。
-
确认目标数据库用户具有管理员权限。
报错“插件 xxx 在目标数据库中不可用”,如何解决?
安装缺失的插件,或在源数据库中移除不必要的插件。
序列冲突报错“relation "test_id_seq" already exists”,如何解决?
参考以下命令:
# 使用更安全的表清理策略
supabase migrate-project ... --preserve-extra-tables=true --allow-truncate=true
数据库连接串中存在特殊字符,如何处理?
建议您将项目配置到环境变量中。如果未配置环境变量,则需对特殊字符转义处理,转义规则如下:
! : %21
@ : %40
# : %23
$ : %24
% : %25
^ : %5e
& : %26
* : %2a
( : %28
) : %29
_ : %5f
+ : %2b
= : %3d