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

相关推荐
陈大鱼头21 分钟前
摸鱼搭子知乎你怎么了?访问抛出的 525 错误码是什么啊?
运维·后端·http
陈随易1 小时前
不使用 Husky 和 Lint-staged,实现 Git 提交前自动格式化代码
前端·后端·程序员
凤山老林1 小时前
SpringBoot 启动时执行某些操作的 8 种方式
java·开发语言·spring boot·后端
岁月宁静1 小时前
Node.js 核心模块详解:fs 模块原理与应用
前端·人工智能·node.js
莹Innsane1 小时前
重新认识 Golang 中的 json 编解码
后端
东百牧码人1 小时前
MySqlConnection is already in use是什么原因
后端
白衣鸽子1 小时前
【基础数据篇】数据访问守卫:Accessor模式
后端·设计模式
Cache技术分享1 小时前
213. Java 函数式编程风格 - Java 中的简单 for 循环转换:从命令式到函数式
前端·后端