Node.js 结合 node-schedule 实现 MySQL 定时备份

洛溪
洛溪
发布时间:2026-10-15| 5人浏览过
原创

为解决服务器环境意外导致数据库丢失的风险,本文介绍了一种基于 Node.js 的自动化备份方案。通过组合 child_process 调用 mysqldump 命令行工具,并利用 node-schedule 设置定时策略,可将数据库导出为 SQL 文件并持久化存储。结合 PM2 进程管理,可实现稳定可靠的定时备份任务。

准备条件与依赖

在开始之前,请确保运行环境中已安装以下组件:

  • Node.js:用于运行脚本逻辑。
  • MySQL Client:系统需安装 MySQL 客户端,以便在终端中直接调用 mysqldump 命令。
  • 目标项目:一个正常的 Node.js 项目结构。

首先,在项目根目录下安装所需的核心依赖包:node-schedule 用于处理定时任务调度,child_process 是 Node.js 内置模块,用于启动子进程执行系统命令。

npm install node-schedule

child_process 和 fs 均为 Node.js 原生模块,无需额外安装。

编写备份脚本

建议将备份相关的逻辑封装在独立的文件中,例如在项目的 src/command/ 目录下创建 BackupDB.ts (或 .js) 文件。以下是核心实现步骤:

第1步:引入必要模块

导入定时器、子进程管理和文件系统模块,为后续执行和存储做准备:

import schedule from "node-schedule";
import { spawn } from "child_process";
import fs from "fs";

第2步:定义备份函数与文件命名

创建一个主方法 backupDb。为了区分每次备份的数据,建议使用当前时间戳作为文件名的一部分,防止旧数据被意外覆盖。

export const backupDb = () => {
  // 生成格式如 1678888888.dump.sql 的文件名
  const dumpFileName = `${Math.round(Date.now() / 1000)}.dump.sql`;
  
  // 创建写文件流
  const writeStream = fs.createWriteStream(dumpFileName);
}

第3步:构建 mysqldump 子进程

使用 spawn 启动 mysqldump 命令。注意在生产环境中硬编码密码存在安全隐患,建议通过环境变量传递或使用配置文件读取。stdout 是备份数据的输出流,stderr 可用于捕获错误日志。

export const backupDb = () => {
  const dumpFileName = `${Math.round(Date.now() / 1000)}.dump.sql`;
  const writeStream = fs.createWriteStream(dumpFileName);
  
  // 替换下方占位符为实际的数据库配置
  const dump = spawn("mysqldump", [
    "-u", process.env.DB_USER || "你的mysql账户名",
    "-p", process.env.DB_PASS || "你的mysql账户密码",
    process.env.DB_NAME || "所要备份的数据库名"
  ]);
}

第4步:设置定时任务与数据流管道

利用 node-schedule 设置 Cron 表达式来确定执行频率。将数据库导出的标准输出(stdout)通过管道(pipe)传输到上一步创建的写文件流(writeStream)中。同时监听文件的结束事件以判断备份是否成功完成。

此处示例设定为每天凌晨 1 点执行备份:

export const backupDb = () => {
  const dumpFileName = `${Math.round(Date.now() / 1000)}.dump.sql`;
  const writeStream = fs.createWriteStream(dumpFileName);
  
  const dump = spawn("mysqldump", [
    "-u", process.env.DB_USER || "你的mysql账户名",
    "-p", process.env.DB_PASS || "你的mysql账户密码",
    process.env.DB_NAME || "所要备份的数据库名"
  ]);

  // Cron 表达式:秒 分 时 日 月 星期
  // "0 0 1 * * *" 表示每天凌晨 01:00:00 执行
  schedule.scheduleJob("0 0 1 * * *", function(){
    dump.stdout.pipe(writeStream)
      .on("finish", () => {
        console.log(`[${new Date().toISOString()}] 数据库备份成功: ${dumpFileName}`);
      })
      .on("error", (err) => {
        console.error("写入备份文件时发生错误:", err);
      });
      
    // 监听子进程错误
    dump.stderr.on("data", (data) => {
      console.error(`mysqldump 错误输出: ${data}`);
    });
  });
}

Cron 表达式各字段含义说明图(来源参考)

第5步:调用触发器

在主入口文件(如 src/index.js 或 server.js)中引入并调用该方法,确保服务启动时即注册好定时任务。

import { backupDb } from "./command/BackupDB";

// 启动备份定时任务
backupDb();

// 其他服务启动逻辑...

部署与维护

为了保证备份任务在服务器重启后仍能持续运行,推荐使用 PM2 进行进程管理。

全局安装 PM2

npm install pm2 -g

启动服务

使用 start 命令启动 Node 应用,并为进程指定一个便于识别的名称:

pm2 start ./src/index.js --name mysql-backup-service

查看状态

部署完成后,可以通过以下命令监控备份任务的运行状态和日志:

pm2 ls      # 查看所有进程列表及运行状态
pm2 logs    # 查看实时日志输出,确认备份是否按时触发

总结

通过上述步骤,我们建立了一个基于 Node.js 的 MySQL 定时备份机制。核心在于利用 spawn 执行系统级备份命令,并通过流式处理将结果保存为文件。这种方案不仅实现了数据的定期保护,还可在此基础上进一步扩展,例如增加发送备份邮件通知、上传至云存储等功能,从而形成更完善的数据安全体系。以上就是 Node.js 结合 node-schedule 实现 MySQL 定时备份的详细内容,更多关于 Node.js 数据库自动化维护的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。