平台

使用CLI进行备份与恢复

学习如何使用Supabase CLI备份和恢复项目


使用 CLI 备份数据库

1

安装 Supabase CLI

安装 Supabase CLI

2

安装 Docker Desktop

为您的平台安装 Docker Desktop

3

获取新的数据库连接字符串

在项目仪表板中,点击 Connect

会话池连接字符串:

1
postgresql://postgres.[PROJECT-REF]:[YOUR-PASSWORD]@aws-0-us-east-1.pooler.supabase.com:5432/postgres

直接连接字符串:

1
postgresql://postgres.[PROJECT-REF]:[YOUR-PASSWORD]@db.[PROJECT-REF].supabase.com:5432/postgres
4

获取数据库密码

数据库设置 中重置密码。

将连接字符串中的 [YOUR-PASSWORD] 替换为数据库密码。

5

备份数据库

[CONNECTION_STRING] 替换为前几步获取的连接字符串后,运行以下命令:

1
supabase db dump --db-url [CONNECTION_STRING] -f roles.sql --role-only
1
supabase db dump --db-url [CONNECTION_STRING] -f schema.sql
1
supabase db dump --db-url [CONNECTION_STRING] -f data.sql --use-copy --data-only

开始之前

使用 CLI 恢复备份

1

创建项目

创建一个新项目

2

配置新创建的项目

在新项目中:

  • 如果旧数据库使用了 Webhooks,请启用数据库 Webhooks
  • 如果旧数据库使用了非默认扩展,请启用扩展
  • 如果旧数据库使用了 Realtime 的复制功能,请在必要表上启用发布
3

获取新数据库连接字符串

前往项目页面,点击页面顶部的"连接"按钮获取连接字符串。

会话池连接字符串:

1
postgresql://postgres.[PROJECT-REF]:[YOUR-PASSWORD]@aws-0-us-east-1.pooler.supabase.com:5432/postgres

直接连接字符串:

1
postgresql://postgres.[PROJECT-REF]:[YOUR-PASSWORD]@db.[PROJECT-REF].supabase.com:5432/postgres
4

获取数据库密码

项目连接页面重置密码。

将连接字符串中的 [YOUR-PASSWORD] 替换为数据库密码。

5

使用 CLI 恢复项目

[CONNECTION_STRING] 替换为前几步获取的连接字符串后运行以下命令:

1
2
3
4
5
6
7
8
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]

重要项目恢复注意事项

故障排除说明

  • session_replication_role 设置为 replica 会禁用所有触发器,避免列被重复加密。
  • 如果您创建过任何具有 login 属性的自定义角色,需要在新建项目中手动设置这些角色的密码。
  • 如果在恢复过程中遇到与 supabase_admin 相关的权限错误,请编辑 schema.sql 文件并注释掉所有包含 ALTER ... OWNER TO "supabase_admin" 的语句。

保留迁移历史

如果您曾使用 Supabase CLI 管理旧数据库的迁移,并希望在新恢复的项目中保留迁移历史,需要使用以下命令单独插入迁移记录:

1
2
3
4
5
6
7
8
supabase db dump --db-url "$OLD_DB_URL" -f history_schema.sql --schema supabase_migrationssupabase db dump --db-url "$OLD_DB_URL" -f history_data.sql --use-copy --data-only --schema supabase_migrationspsql \ --single-transaction \ --variable ON_ERROR_STOP=1 \ --file history_schema.sql \ --file history_data.sql \ --dbname "$NEW_DB_URL"

authstorage 模式的变更

如果您在旧项目中修改过 authstorage 模式(例如添加触发器或行级安全(RLS)策略),需要单独恢复这些变更。Supabase CLI 可以通过以下命令帮助您比对这两个模式的变更:

1
2
supabase link --project-ref "$OLD_PROJECT_REF"supabase db diff --linked --schema auth,storage > changes.sql

迁移存储对象

新项目已包含旧项目的存储桶(Storage buckets),但存储对象需要手动迁移。使用以下脚本将存储对象从一个项目迁移到另一个项目。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// npm install @supabase/supabase-js@1const { } = ('@supabase/supabase-js')const = 'https://xxx.supabase.co'const = 'old-project-service-key-xxx'const = 'https://yyy.supabase.co'const = 'new-project-service-key-yyy';(async () => { const = (, , { : { : 'storage', }, }) const = (, ) const = (, ) // 如果对象数量很多,请确保更新postgrest设置中的max_rows // 或者在此处实现分页 const { : , } = await .('objects').() if () { .('从旧存储桶获取对象时出错') throw } for (const of ) { .(`正在迁移 ${.}`) try { const { , : } = await . .(.) .(.) if () { throw } const { , : } = await . .(.) .(., , { : true, : .., : .., }) if () { throw } } catch () { .('迁移出错 ', ) .() } }})()