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