はじめに
バックエンドなどのサーバーとSupabaseのリージョンが離れすぎており、レイテンシが大きく(遅く)なっていたため、リージョンを変更(移行)することにしました。ユーザー数が増える前のタイミングで実施した記録です。
基本的には、以下の公式ドキュメントの手順に従って進めました。
動作環境
- macOS 26.5.2
- Supabase CLI 2.109.1
- Supabase Hobbyプラン
移行の手順
1. 移行先の新規プロジェクトを作成
まずは移行先となる新しいプロジェクトを立ち上げます。この際、リージョン設定を間違えないよう注意してください。
データベースのパスワードは後ほど使うためメモしておきます。また、必要に応じてRLS(Row Level Security)設定の有効化なども事前に行っておきます。
2. 旧プロジェクトの「Connection string」を控える
旧プロジェクトの管理画面を開き、プロジェクト画面の「Connect」タブを押します。
「Direct」を選択した後、Connection stringの値をメモっておきます。(もしデータベースのパスワードを忘れた場合は、リセットしてメモしておいてください)
postgresql://postgres:[YOUR-PASSWORD]@[PROJECT-REF].supabase.co:5432/postgres
3. Supabase CLIのインストールと準備
Homebrewを使ってSupabase CLIをインストールします。
brew install supabase/tap/supabase
インストール後、バージョンが表示されるか確認します。
supabase -v
確認できたら、任意の場所にバックアップ保存用のフォルダを作成して移動します。
mkdir supabase-backup && cd supabase-backup
4. 旧プロジェクトからのデータエクスポート(ダンプ)
以下の3つのコマンドを実行して、古いデータベースからデータを抽出します。
※[CONNECTION_STRING]の部分は、手順2で控えた旧プロジェクトのConnection stringに置き換えてください。
supabase db dump --db-url "[CONNECTION_STRING]" -f roles.sql --role-only
supabase db dump --db-url "[CONNECTION_STRING]" -f schema.sql
supabase db dump --db-url "[CONNECTION_STRING]" -f data.sql --use-copy --data-only -x "storage.buckets_vectors" -x "storage.vector_indexes"
実行が完了すると、フォルダ内に3つのSQLファイル(roles.sql, schema.sql, data.sql)が保存されます。
5. 新プロジェクトへのデータインポート
新しく作成したプロジェクトのConnection stringを取得し、以下の[CONNECTION_STRING]と置き換えて実行します。これにより、先ほど抽出したSQLファイルを用いて新しいデータベースにデータを差し込みます。
psql \
--single-transaction \
--variable ON_ERROR_STOP=1 \
--file roles.sql \
--file schema.sql \
--command 'SET session_replication_role = replica' \
--file data.sql \
--dbname "[CONNECTION_STRING]"
成功すると、新しいデータベースへデータが移行されます。
あとは、OAuth認証などを利用している場合は、新プロジェクト側でも同様に有効化などの設定を行ってください。
つまずいたポイント
1. スーパーアドミンに関するエラー
新しいデータベースにデータを差し込む(インポートする)際、以下のエラーが発生しました。
psql:roles.sql:13: ERROR: "supabase_admin" is a reserved role, only superusers can modify it
原因と対策
このエラーは、roles.sqlを実行する際に、一般権限のユーザーがスーパーアドミンの設定を変更しようとしたために発生しているようです。
対策として、roles.sqlを開き、supabase_adminなどのスーパーアドミンに関する記述がある行をコメントアウトしてから、再度インポートのコマンドを実行することで解決できました。
2. OAuth認証の有効化とURLの設定漏れ
データの移行自体は完了したものの、実際のアプリケーション側で認証(サインイン)ができない状態になっていました。
原因と対策
新しいプロジェクト側でOAuthの有効化設定と、リダイレクトURLの設定を忘れていたことが原因でした。データベースの移行だけでなく、Authentication周りのプラットフォーム設定も新プロジェクト側で再度合わせておく必要があります。