功能介绍
云开发数据库环境之间的迁移一直是个老大难问题,虽然SDK中提供了单个集合的export和import,但是要达到实现整个数据库的迁移还只是100步中的第一步,该方案便是介绍一种将A环境数据库迁移至B环境数据库的思路,仅供参考。
需要的准备
将文件夹下的函数部署至对应环境
已经创建好的A环境与B环境
如果迁移至的环境在另一个账号下,需要另一个账号的secretID和secretKey,并在init该环境时添加该两个字段
可以直接在云开发控制台进行操作,无需发起调用
将函数的超时时间调至900秒.
使用的资源
两边环境的云函数
两边环境的云数据库
目标环境的云存储
函数介绍
migrate
迁移函数,需部署至被迁移的环境下
记得修改demo中的环境ID为自己的环境ID
需主动发起调用,无需参数。
它会调用exportDatabase函数导出数据,并得到一个返回值数组,数据格式大致如下
然后会调用copyDatabase,进行迁移
exportDatabase
导出函数,需部署至被迁移的环境下
被migrate调用
copyDatabase
需部署至被迁移的环境下
被migrate调用
importDatabase
导入函数,需部署至迁移目标环境下
该函数接收CollectionName函数进行集合导入,用户无需主动调用,该函数被copyDatabase调用。
时序图
完整步骤
1将函数部署到对应环境(除了importDatabase是部署到目标环境,剩下三个均为被迁移环境),记得云端安装依赖。
2调用migrate(建议控制台直接调用)
3等待返回值
4前往新环境数据库查看迁移结果
注意事项
1由于 export 这个接口每秒只能调用一次,所以保险起见,在代码层级上每个集合的导出都间隔一秒。所以migrate这个函数总调用时间会比较长,建议耐心等待(每有一个集合需要约2秒),若集合数量比较大,建议将函数超时时间往上调整。若需要大于900秒,考虑使用云托管实现。
2migrate将一次性执行完所有的逻辑,运行时间较长,请耐心等待,等待期间可以去干别的事儿。
3每个文档的导出都是异步的需要时间,得到migrate的返回值之后,请等待一段时候再调用copyDatabase,由于每个文档大小不定所以这个时间不确定,但在copyDatabase中内置了检测函数,如果在未完全导出前发起调用,该函数会停止并提示那一项暂未导出完成,可以放心调用。
4返回success后,到控制台查看可能会出现集合已经创建,但文档数量为0的情况,这是因为导入是一个异步事件,创建集合和文档导入并非同时进行的,等待一段时间即可。
5文档数为0的集合会被跳过。
6若出现系统错误,内部错误等,可以适当调大云函数运行内存。
7若migrate函数控制台出現 ESOCKETTIMEDOUT 或其他报错,但其他三个函数均运行正常,那可以忽视,以目标环境数据库数据是否正确迁移为准。
8借用了目标环境的云存储作为媒介,若嫌占用大小可以删除,目录为/tmp/db-imports
9未经过严格测试,暂且不清楚性能上限,目前测试20+集合,几百条文档没有问题。
开源代码
https://github.com/Readercyc/Cloudbase-Solution