Node.js 结合 node-schedule 实现 MySQL 定时备份
为解决服务器环境意外导致数据库丢失的风险,本文介绍了一种基于 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 数据库自动化维护的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













