【NestJs】定时备份Mysql数据库

在项目里,数据是重中之重,我们需要保护数据免受未经授权的访问、损坏或盗窃,要在运维上做足一定的防御,例如在第三方平台购买防火墙之类的。而我们作为程序员,需要防止数据丢失,避免给项目、组织带来巨大的财富损失,那么定时备份数据库是一定要做的,这样能尽少的给项目、组织带来巨大的财富损失,才能控制在一定的损失范围,达到损失最小化的目的。

现在来讲讲如何在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也可以备份在另外一个用来备份的数据库,或者以附件的形式发送到邮箱,不一定要备份在服务端的目录里,是全凭业务来决定它备份的目的地。

相关推荐
用户4469074354813 分钟前
opensearch、ES 使用 search_after 实时搜索存在重复数据、丢数据问题
后端
陈橙橙13 分钟前
系统设计note
后端
风一样的树懒18 分钟前
怎么理解ES的准实时性?
后端
前端双越老师36 分钟前
使用 langChain.js 实现 RAG 知识库语义搜索
人工智能·langchain·node.js
无限大640 分钟前
《计算机“十万个为什么”》之 Java 语言为什么能跨平台
后端
植物昂光43 分钟前
基于Node.js的微博热榜抓取与展示开发记录
前端·node.js
无为3471 小时前
用AI解决独立开发者痛点:我如何构建一个面向开发者的产品灵感平台
后端
SimonKing1 小时前
告别System.currentTimeMillis()!Java高精度计时最佳实践
java·后端·程序员
Moment1 小时前
通过 Mac 自动的 say 命令学习粤语真的太好玩了 😏😏😏
前端·javascript·后端
understandme1 小时前
维护 mysql 老代码的 json 的坑
javascript·后端