本文為您介紹如何使用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