使用CLI进行备份与恢复
学习如何使用Supabase CLI备份和恢复项目
使用 CLI 备份数据库
3
获取新的数据库连接字符串
在项目仪表板中,点击 Connect。
默认使用会话池连接字符串。如果您的 ISP 支持 IPv6 或您已启用 IPv4 附加组件,请使用直接连接字符串。
会话池连接字符串:
1postgresql://postgres.[PROJECT-REF]:[YOUR-PASSWORD]@aws-0-us-east-1.pooler.supabase.com:5432/postgres
直接连接字符串:
1postgresql://postgres.[PROJECT-REF]:[YOUR-PASSWORD]@db.[PROJECT-REF].supabase.com:5432/postgres
5
备份数据库
将 [CONNECTION_STRING]
替换为前几步获取的连接字符串后,运行以下命令:
1supabase db dump --db-url [CONNECTION_STRING] -f roles.sql --role-only
1supabase db dump --db-url [CONNECTION_STRING] -f schema.sql
1supabase db dump --db-url [CONNECTION_STRING] -f data.sql --use-copy --data-only
开始之前
使用 CLI 恢复备份
2
配置新创建的项目
在新项目中:
- 如果旧数据库使用了 Webhooks,请启用数据库 Webhooks
- 如果旧数据库使用了非默认扩展,请启用扩展
- 如果旧数据库使用了 Realtime 的复制功能,请在必要表上启用发布
3
获取新数据库连接字符串
前往项目页面,点击页面顶部的"连接"按钮获取连接字符串。
默认使用会话池连接字符串。如果您的 ISP 支持 IPv6,请使用直接连接字符串。
会话池连接字符串:
1postgresql://postgres.[PROJECT-REF]:[YOUR-PASSWORD]@aws-0-us-east-1.pooler.supabase.com:5432/postgres
直接连接字符串:
1postgresql://postgres.[PROJECT-REF]:[YOUR-PASSWORD]@db.[PROJECT-REF].supabase.com:5432/postgres
5
使用 CLI 恢复项目
将 [CONNECTION_STRING]
替换为前几步获取的连接字符串后运行以下命令:
12345678psql \ --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 管理旧数据库的迁移,并希望在新恢复的项目中保留迁移历史,需要使用以下命令单独插入迁移记录:
12345678supabase 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"
auth
和 storage
模式的变更
如果您在旧项目中修改过 auth
和 storage
模式(例如添加触发器或行级安全(RLS)策略),需要单独恢复这些变更。Supabase CLI 可以通过以下命令帮助您比对这两个模式的变更:
12supabase link --project-ref "$OLD_PROJECT_REF"supabase db diff --linked --schema auth,storage > changes.sql
迁移存储对象
新项目已包含旧项目的存储桶(Storage buckets),但存储对象需要手动迁移。使用以下脚本将存储对象从一个项目迁移到另一个项目。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152// 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 () { .('迁移出错 ', ) .() } }})()