如何迁移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
可选参数
迁移内容
--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开头),需要具备读取所有数据的权限。
获取目标端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迁移至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迁移至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" \ --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" \ --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" \ --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" \ --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