バックアップの方法
1. 基本バックアップコマンド
Supabase CLI の supabase db dump コマンドを使います。
基本型
supabase db dump -f backup.backup
※デフォルトではLink先のリモートのSupabaseデータベースをバックアップします。
このコマンドは、リモートのSupabaseデータベースからbackup.backupというファイルに出力します。
もしローカル環境のデータベースをバックアップしたい場合は、👇️ --localオプションを追加します。
supabase db dump -f backup_local.backup --local
【補足】特定の要素のみをバックアップする場合
-
ロール(ユーザー・権限)のみ:
supabase db dump --role-only -f backupRoles.backup -
特定のスキーマ(例:
publicとauth)のみ:supabase db dump -s public,auth -f backupPartial.backup -
データのみ:
supabase db dump --data-only -f backupData.backup
2. 毎日バックアップする方法
毎日バックアップを行うには、バックアップコマンドをスクリプト化し、それを定期的に実行します。
powershellでの、タイムスタンプ付きでローカルにバックアップする backup-supabase.ps1 というスクリプトの例。
# backup-supabase.ps1
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$backupDir = "supabase/backup"
$historyDir = "$backupDir/history"
$filename = "$timestamp-backupAll_local.backup"
if (!(Test-Path $backupDir)) {
New-Item -ItemType Directory -Path $backupDir | Out-Null
}
if (!(Test-Path $historyDir)) {
New-Item -ItemType Directory -Path $historyDir | Out-Null
}
# 古いバックアップファイルを圧縮してhistoryフォルダに移動
$archiveName = "$historyDir/$timestamp-backup_archive.zip"
Compress-Archive -Path (Get-ChildItem -Path $backupDir -Filter "*.backup").FullName -DestinationPath $archiveName
Remove-Item -Path (Get-ChildItem -Path $backupDir -Filter "*.backup").FullName
try {
# ローカルのバックアップ
# ロールのバックアップ
supabase db dump --local -f "$backupDir/$timestamp-roles_local.backup" --role-only
# スキーマのバックアップ
supabase db dump --local -f "$backupDir/$timestamp-schema_local.backup"
# データのバックアップ
supabase db dump --local -f "$backupDir/$timestamp-data_local.backup" --use-copy --data-only
if ($LASTEXITCODE -eq 0) {
Write-Host "バックアップ完了: $backupDir/$filename"
} else {
Write-Host "バックアップに失敗しました (exit code: $LASTEXITCODE)"
}
} catch {
Write-Host "エラーが発生しました: $_"
}
このスクリプトは、日々のバックアップを自動化するために利用できます。
例えば、WindowsのタスクスケジューラやLinuxのcronジョブなどを利用して、毎日特定の時刻にこのスクリプトを実行するように設定することで、自動的に日次バックアップが作成されます。
古いバックアップファイルは、3つのファイルをまとめてzipファイルにしてhistoryに移動させます。
公式のドキュメントでのSupabase全体のバックアップのコマンド
バックアップファイルの保存場所の設定をします。
例えば、supabaseフォルダの中の supabase/backup に保存するようにします。(場所は自由です)
supabase
├── backup
│ ├── history
│ │ ├── 20250913_083351-backup_archive.zip
│ │ └── 20250913_083431-backup_archive.zip
│ ├── 20250913_083431-data_local.backup
│ ├── 20250913_083431-roles_local.backup
│ └── 20250913_083431-schema_local.backup
├── migrations
├── .gitignore
├── config.toml
└── signing_key.json
Supabaseのサーバー側とローカル側それぞれの場合のバックアップコマンド一覧
# サーバーのバックアップ
# ロール
supabase db dump -f supabase/backup/roles.backup --role-only
# スキーマ
supabase db dump -f supabase/backup/schema.backup
# データ
supabase db dump -f supabase/backup/data.backup --use-copy --data-only
# ローカルのバックアップ
# ロール
supabase db dump --local -f supabase/backup/roles_local.backup --role-only
# スキーマ
supabase db dump --local -f supabase/backup/schema_local.backup
# データ
supabase db dump --local -f supabase/backup/data_local.backup --use-copy --data-only
- ロールを取得
- スキーマを取得
- データを取得、これはデータのみを取ってくると指定している。
DBのリセット
localのデータベースをリセットする場合
※--db-url オプションで接続文字列を指定します。
--local オプションを使えばいいのですが、ローカルの接続文字列を指定した場合のパターンとして記録しておきます。
supabase db reset --db-url postgresql://postgres:postgres@127.0.0.1:54322/postgres
リストアの方法
リストアはSupabaseの有料でのサービスを利用するか、psqlコマンドを使うか、もしくはDBeaverなどのツールで復元します。
※SupabaseのCLIにはリストアのコマンドがありません。
公式のドキュメント
Restore Dashboard backup | Supabase Docs
https://supabase.com/docs/guides/platform/migrating-within-supabase/dashboard-restore
バックアップに含まれないもの
まず、バックアップファイルには直接データベースに保存されない以下の項目は 含まれていません
- Edge Functions
- Auth Settings (認証設定) と API キー
- Realtime settings (リアルタイム設定)
- Database extensions (データベース拡張機能) と設定
psqlのインストール
参考
Postgresをインストールします。
Postgres インストーラーのダウンロード ページから最新バージョンのインストール ファイルをダウンロードして実行します。
PostgreSQL ダウンロード先
PostgreSQLをダウンロードしたらインストールをします。
デフォルトのインストール先
C:\Program Files\PostgreSQL\17
パスの設定
システムPATHにPostgresを追加します。
C:\Program Files\PostgreSQL\17\bin
(デフォルトの)インストール先+\bin を追加します。
PATHを追加した後はPCを再起動します。
※\binを追加するのを忘れないでください。
psqlの動作確認
VSCodeのPowershellなどを立ち上げてコマンドを実行できるか確認します。
09-12 20:41:21> psql --version
psql (PostgreSQL) 17.6
接続文字列の作成
サーバーの場合
Supabase サーバーへの接続文字列
# us-east(デフォルト値)
postgresql://postgres.[PROJECT-REF]:[YOUR-PASSWORD]@aws-0-us-east-1.pooler.supabase.com:5432/postgres
# northeast-1
# Transaction pooler
postgresql://postgres.[PROJECT-REF]:[YOUR-PASSWORD]@aws-0-ap-northeast-1.pooler.supabase.com:6543/postgres
# northeast-1
# Session pooler
postgresql://postgres.[PROJECT-REF]:[YOUR-PASSWORD]@aws-0-ap-northeast-1.pooler.supabase.com:5432/postgres
[PROJECT-REF]はSupabaseで作成したProject ID
[YOUR-PASSWORD]はDBのパスワード
Project IDは、Supabaseのサーバーのダッシュボードの左サイドメニューの Project Settings > Settings > General > Project Settings > Project ID で確認できます。
Supabase ローカルへの接続文字列
supabase status コマンドで表示されます。
supabase status
...
DB URL: postgresql://postgres:postgres@127.0.0.1:54322/postgres
👆️ DB URLがローカルへの接続文字列
リストアの実行
接続文字列の準備ができたら、psqlコマンドを使ってバックアップを復元します。
# サーバーのSupabaseをリストア
psql \
--single-transaction \
--variable ON_ERROR_STOP=1 \
--file roles.backup \
--file schema.backup \
--command 'SET session_replication_role = replica' \
--file data.backup \
--dbname [接続文字列]
# ローカルのSupabaseをリストア
psql --single-transaction --variable ON_ERROR_STOP=1 --file supabase/backup/roles_local.backup --file supabase/backup/schema_local.backup --command 'SET session_replication_role = replica' --file supabase/backup/data_local.backup --dbname postgresql://postgres:postgres@127.0.0.1:54322/postgres
[接続文字列]と/SQLfile/pathを
それぞれ置き換えてコマンドを実行してください。
これで、データベースのデータが復元されます。
バックアップは週1回~毎日実行します。
タスクスケジューラや、GitHub Actions の Scheduled workflow を使います
supabase db dump コマンド でSQLファイル取得し、それを圧縮&暗号化のうえ適当な場所に保存します。
保存データの数やサイズが大きくなるにつれ、バックアップの保存先やスケジュールを考え直します。
スクリプトを書いてバックアップの完全自動化を目指しましょう。
以上で終了です。

