小程序云开发之数据库自动备份

数据是无价的,我们通常会把重要的业务数据存放在数据库中,并需要对数据库做定时的自动备份工作,防止数据异常丢失,造成无法挽回的损失。

小程序云开发提供了方便的云数据库供我们直接使用,云开发使用了腾讯云提供的云数据库,拥有完善的数据保障机制,无需担心数据丢失。但是,我们还是不可避免的会担心数据库中数据的安全,比如不小心删除了数据集合,写入了脏数据等。

还好,云开发控制台提供了数据集合的导出,导入功能,我们可以手动备份数据库。不过,总是手动备份数据库也太麻烦了点,所有重复的事情都应该让代码去解决,下面我们就说说怎么搞定云开发数据库自动备份。

通过查阅微信的文档,可以发现云开发提供了数据导出接口databaseMigrateExport

POST https://api.weixin.qq.com/tcb/databasemigrateexport?access_token=ACCESS_TOKEN

通过这个接口,结合云函数的定时触发功能,我们就可以做数据库定时自动备份了。梳理一下大致的流程:

  1. 创建一个定时触发的云函数
  2. 云函数调用接口,导出数据库备份文件
  3. 将备份文件上传到云存储中以供使用

1. 获取 access_token

调用微信的接口需要 access_token,所以我们首先要获取 access_token。通过文档了解到使用 auth.getAccessToken 接口可以用小程序的 appid 和 secret 获取 access_token。

// 获取 access_token
request.get(`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${secret}`,(err, res, body) => {if (err) {// 处理错误return;}const data = JSON.parse(body);// data.access_token}
);

2. 创建数据库导出任务

获取 access_token 后,就可以使用 databaseMigrateExport 接口导出数据进行备份。

databaseMigrateExport 接口会创建一个数据库导出任务,并返回一个 job_id,这个 job_id 怎么用我们下面再说。显然数据库的数据导出并不是同步的,而是需要一定时间的,数据量越大导出所要花费的时间就越多,个人实测,2W 条记录,2M 大小,导出大概需要 3~5 S。

调用 databaseMigrateExport 接口需要传入环境 Id,存储文件路径,导出文件类型(1 为 JSON,2 为 CSV),以及一个 query 查询语句。

因为我们是做数据库备份,所以这里就导出 JSON 类型的数据,兼容性更好。需要备份的数据可以用 query 来约束,这里还是很灵活的,既可以是整个集合的数据,也可以是指定的部分数据,这里我们就使用 db.collection('data').get() 备份 data 集合的全部数据。同时我们使用当前时间作为文件名,方便以后使用时查找。

request.post(`https://api.weixin.qq.com/tcb/databasemigrateexport?access_token=${accessToken}`,{body: JSON.stringify({env,file_path: `${date}.json`,file_type: '1',query: 'db.collection("data").get()'})},(err, res, body) => {if (err) {// 处理错误return;}const data = JSON.parse(body);// data.job_id}
);

3. 查询任务状态,获取文件地址

在创建号数据库导出任务后,我们会得到一个 job_id,如果导出集合比较大,就会花费较长时间,这时我们可以使用 databaseMigrateQueryInfo 接口查询数据库导出的进度。

当导出完成后,会返回一个 file_url,即可以下载数据库导出文件的临时链接。

request.post(`https://api.weixin.qq.com/tcb/databasemigratequeryinfo?access_token=${accessToken}`,{body: JSON.stringify({env,job_id: jobId})},(err, res, body) => {if (err) {reject(err);}const data = JSON.parse(body);// data.file_url}
);

获取到文件下载链接之后,我们可以将文件下载下来,存入到自己的云存储中,做备份使用。如果不需要长时间的保留备份,就可以不用下载文件,只需要将 job_id 存储起来,当需要恢复备份的时候,通过 job_id 查询到新的链接,下载数据恢复即可。

至于 job_id 存在哪,就看个人想法了,这里就选择存放在数据库里。

await db.collection('db_back_info').add({data: {date: new Date(),jobId: job_id}
});

4. 函数定时触发器

云函数支持定时触发器,可以按照设定的时间自动执行。云开发的定时触发器采用的 Cron 表达式语法,最大精度可以做的秒级,详细的使用方法可以参考官方文档:定时触发器 | 微信开放文档

这里我们配置函数每天凌晨 2 点触发,这样就可以每天都对数据库进行备份。在云函数目录下新建 config.json文件,写入如下内容:

{"triggers": [{"name": "dbTrigger","type": "timer","config": "0 0 2 * * * *"}]
}

完整代码

最后,贴出可以在云函数中使用的完整代码,只需要创建一个定时触发的云函数,并设置好相关的环境变量即可使用

  • appid
  • secret
  • backupColl:需要备份的集合名称,如 ‘data’
  • backupInfoColl:存储备份信息的集合名称,如 ‘db_back_info’

注意,云函数的默认超时时间是 3 秒,创建备份函数时,建议将超时时间设定到最大值 20S,留有足够的时间查询任务结果。

/* eslint-disable */
const request = require('request');
const cloud = require('wx-server-sdk');// 环境变量
const env = 'xxxx';cloud.init({env
});// 换取 access_token
async function getAccessToken(appid, secret) {return new Promise((resolve, reject) => {request.get(`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${secret}`,(err, res, body) => {if (err) {reject(err);return;}resolve(JSON.parse(body));});});
}// 创建导出任务
async function createExportJob(accessToken, collection) {const date = new Date().toISOString();return new Promise((resolve, reject) => {request.post(`https://api.weixin.qq.com/tcb/databasemigrateexport?access_token=${accessToken}`,{body: JSON.stringify({env,file_path: `${date}.json`,file_type: '1',query: `db.collection("${collection}").get()`})},(err, res, body) => {if (err) {reject(err);}resolve(JSON.parse(body));});});
}// 查询导出任务状态
async function waitJobFinished(accessToken, jobId) {return new Promise((resolve, reject) => {// 轮训任务状态const timer = setInterval(() => {request.post(`https://api.weixin.qq.com/tcb/databasemigratequeryinfo?access_token=${accessToken}`,{body: JSON.stringify({env,job_id: jobId})},(err, res, body) => {if (err) {reject(err);}const { status, file_url } = JSON.parse(body);console.log('查询');if (status === 'success') {clearInterval(timer);resolve(file_url);}});}, 500);});
}exports.main = async (event, context) => {// 从云函数环境变量中读取 appid 和 secret 以及数据集合const { appid, secret, backupColl, backupInfoColl } = process.env;const db = cloud.database();try {// 获取 access_tokenconst { errmsg, access_token } = await getAccessToken(appid, secret);if (errmsg && errcode !== 0) {throw new Error(`获取 access_token 失败:${errmsg}` || '获取 access_token 为空');}// 导出数据库const { errmsg: jobErrMsg, errcode: jobErrCode, job_id } = await createExportJob(access_token, backupColl);// 打印到日志中console.log(job_id);if (jobErrCode !== 0) {throw new Error(`创建数据库备份任务失败:${jobErrMsg}`);}// 将任务数据存入数据库const res = await db.collection('db_back_info').add({data: {date: new Date(),jobId: job_id}});// 等待任务完成const fileUrl = await waitJobFinished(access_token, job_id);console.log('导出成功', fileUrl);// 存储到数据库await db.collection(backupInfoColl).doc(res._id).update({data: {fileUrl}});} catch (e) {throw new Error(`导出数据库异常:${e.message}`);}
};

联系我们

更多云开发使用技巧及 Serverless 行业动态,扫码关注我们~

access重复数据累计_小程序·云开发之数据库自动备份丨云开发101相关推荐

  1. access 根据id删除数据_小程序云开发之数据库自动备份丨云开发101

    钻石有价,数据无价.我们通常会把重要的业务数据存放在数据库中,并需要对数据库做定时的自动备份工作,防止数据异常丢失,造成无法挽回的损失. 小程序云开发提供了方便的云数据库供我们直接使用,云开发使用了腾 ...

  2. access重复数据累计_在 Access 中查找并删除重复记录

    如果您的 Access 数据库包含从多个源导入的数据,或者您继承了已经使用多年而且没有得到正确设置的数据库,那么该数据库中可能包含需要清除的重复记录. 要确定 Access 表中是否存在重复记录,可以 ...

  3. 小程序 数据库 时间_新增NBA2K19数据查询功能 小程序【大P数据库】更新公告

    自微信小程序[NBA2KOL2大P数据库]上线以来,我们就收到了很多朋友的热心反馈,其中就有不少朋友希望加入NBA2K19球员数据的查询功能. 之所以很多朋友会有这样的建议是因为在NBA2KOL2游戏 ...

  4. 小程序与MySQL数据库的交互_小程序是如何与数据库交互的?

    以往的开发方式: 小程序必须要绑定至少一个合法安全域名,且该域名必须是使用ssl证书的,也就是要以https协议.小程序正式上线后,只能跟合法安全域名内的域名进行信息互通.如果请求没有配置过的域名,会 ...

  5. access重复数据累计_Access 查询同一张表中两个或以上字段含有重复项的记录

    这篇文章是对我自己另一篇文章的补充.( Access 查询同一张表中某个字段含有重复项的记录) 记录的动力总是来自于工作中遇到的问题.上次只要根据某个字段把有重复项的记录列出来,这次条件增多了,要根据 ...

  6. access重复数据累计_ACCESS数据库-sql语句查找重复记录、唯一记录和分组统计方法...

    本例测试环境是EXCEL中用VBA连接ACCESS数据库 有如下一张表,要分别查找出所有同名的人.所有同名并且学号也一样的人以及所有同名但不同学号的人. 查询所有同名人员 select * from ...

  7. 美云智数|数据“灯塔”:小程序的运营之“光”

    小程序的诞生之初,微信曾邀请过上百家企业共同开启小程序内测,但由于页面设计.用户体验等问题,小程序并不被业内所看好.如今,小程序优化了内部的系统,俨然已成为新的行业风口.它架起了用户和开发者之间便利的 ...

  8. u8 api开发报类型不匹配错误_小程序云开发入门学习,小程序支付功能常见错误汇总及解决方案...

    近期有比较多的同学反映,使用云开发调取微信支付时,老是提示订单不存在.今天就把这几天大家遇到的问题统一汇总到这里. 一,订单不存在的错误 如下图所示的错误. 通常看到这个错误时,最好去看下上面看下,有 ...

  9. 微信小程序菜品做法展示数据库设计_微信小程序结合后台数据管理实现商品数据的动态展示、维护...

    微信小程序给我们提供了一个很好的开发平台,可以用于展现各种数据和实现丰富的功能,本篇随笔介绍微信小程序结合后台数据管理实现商品数据的动态展示.维护,介绍如何实现商品数据在后台管理系统中的维护管理,并通 ...

最新文章

  1. 四年磨一剑,机械出身的我是如何拿到蚂蚁金服 Offer 的!
  2. Maven配置JDK编译版本
  3. Spring5.0 Kafka2.11
  4. ES6 开发常用新特性以及简述ES7
  5. windows下安装subversion
  6. leetcode 75 --- sort-colors
  7. Java String字符串和整型int的相互转换
  8. 商业|商务海报篇-简洁华丽的商务海报
  9. 儿童车内滞留监测控制系统的设计
  10. 2020 年最新 Web 前端开发经典面试试题及答案(建议收藏)
  11. 如何利用Python程序读取Excel创建折线图
  12. YeeCOM DTU 轮询采集
  13. linux skyeye,用skyeye运行uClinux内核
  14. 小酥的Python学习日记 2022.7.3
  15. 19.flowable 任务委派
  16. 阿里云OSS跨域设置
  17. JEECG3.8 全套实战视频全部开放,免费下载!
  18. 一元n次多项式的处理
  19. 循环神经网络RNN论文解读
  20. c语言在测绘工程中的作用,测绘C程序设计实习报告

热门文章

  1. websocket的用途/场景
  2. Eclipse构建Maven分包分模块项目并构建服务端
  3. Java面试——Spring系列总结
  4. 在Spring Boot + Mybatis 中,使用@Repository失效
  5. java服务端无法发送给客户端,无法从客户端向服务器发送消息
  6. linux 文件怎么不让删,请问如何设置权限,可以禁止用户删除文件
  7. android外置sd大小,android 读取外置和内置存储卡路径和大小
  8. ROS 创建msg和srv 编写发布者和订阅者节点 编写服务端和客户端节点(python版本)
  9. 中快捷搜索_同事用1分钟,我用半小时,原来是因为这8个Word快捷键,秒杀一切办公技巧...
  10. 土木工程和计算机专硕,第一次发帖 关于大工土木专硕