在项目里,数据是重中之重,我们需要保护数据免受未经授权的访问、损坏或盗窃,要在运维上做足一定的防御,例如在第三方平台购买防火墙之类的。而我们作为程序员,需要防止数据丢失,避免给项目、组织带来巨大的财富损失,那么定时备份数据库是一定要做的,这样能尽少的给项目、组织带来巨大的财富损失,才能控制在一定的损失范围,达到损失最小化的目的。
现在来讲讲如何在NestJs里定时备份数据库。
项目环境如下:
makefile
node:16.18.0
npm: 8.19.2
mysql: 8.0.24
相关依赖版本:
bash
nest: 10.0.3
@nestjs/schedule: 4.0.0
mysqldump:3.2.0
首先新建一个Nest项目,这里就不写流水账了,可看作者本人的掘金Nest文章,点击链接查看,然后安装依赖,执行下方命令
bash
npm install @nestjs/schedule mysqldump
安装好后在项目的相关目录(可自定义),写上定时备份数据的方法,和备份数据的目录
Cron 是一个定义时间值的方法,可查阅下方两个文档/工具链接,这里不做太多的详述,因为作者也还不太熟悉。
Cron 速查手册:xunyidian.com/t/CronManua... Cron 小工具:crontab.guru/
方法的代码如下
typescript
import { Injectable } from '@nestjs/common';
import { Cron, CronExpression } from '@nestjs/schedule';
import mysqldump from 'mysqldump';
import configuration from '../../config/index'; // 不同环境的配置文件
@Injectable()
export class SqlTaskService {
// 每天凌晨一点备份数据库,CronExpression.EVERY_DAY_AT_1AM
// 每10秒,EVERY_10_SECONDS
@Cron(CronExpression.EVERY_10_SECONDS, {
name: 'sqlTask',
timeZone: 'Asia/shanghai'
})
handleCron() {
const sqlInfo = configuration().db.mysql
mysqldump({
connection: {
host: sqlInfo.host, // 数据库地址
user: sqlInfo.username, // 数据库帐号
password: sqlInfo.password, // 数据库密码
database: sqlInfo.database // 数据库表名
},
dumpToFile: `./backSql/${Math.round(Date.now() / 1000)}.sql`, // 存入的文件目录
});
console.log('备份数据库');
}
}
备份数据库有两种业务情况,1、在项目启动时定时备份,2、在项目系统里给个开关写个接口手动备份。这里是定时任务,所以要在项目启动时执行方法,所以要在app.module里引入方法
代码如下:
然后启动项目看看,每隔10秒就备份一次,成功了,然后用 Navicat 数据库管理工具导入备份好的SQL,数据存在即成功了。
当然,备份的SQL也可以备份在另外一个用来备份的数据库,或者以附件的形式发送到邮箱,不一定要备份在服务端的目录里,是全凭业务来决定它备份的目的地。