如何通过Node.js使用MongoDump URI备份Mongo Atlas M0集群并实现定时备份
错误原因排查
- spawn参数格式错误:
spawn的第二个参数为命令参数数组,选项名和对应值必须拆分为两个独立的数组元素,不可将--uri和连接串合并为同一个字符串。终端执行时shell会自动完成参数拆分,而spawn默认不启用shell解析,因此会识别参数失败返回错误码。 - 语法错误:
async function backupMongoDbData后缺少括号,属于语法不合法问题。 - 不必要的await:
child_process.spawn是同步返回子进程实例的方法,本身不返回Promise,无需加await修饰。
修复后的完整实现代码
const { spawn } = require('child_process'); const cron = require('node-cron'); const fs = require('fs'); const path = require('path'); // 提前创建备份目录,避免路径不存在报错 const backupDir = path.join(__dirname, 'BackupData'); if (!fs.existsSync(backupDir)) { fs.mkdirSync(backupDir, { recursive: true }); } // 按需调整cron表达式,示例为每天凌晨2点执行 cron.schedule('0 2 * * *', () => { backupMongoDbData(); }); function backupMongoDbData() { // 按时间生成备份文件名,避免覆盖历史备份 const backupPath = path.join(backupDir, `${new Date().toISOString().replace(/[:.]/g, '-')}.archive.gz`); const child = spawn('mongodump', [ "--uri", "mongodb+srv://DBusername:DBpassword@DBcluster/databaseName", `--archive=${backupPath}`, '--gzip', ]); child.stdout.on('data', (data) => { console.log('stdout:\n', data.toString()); }); child.stderr.on('data', (data) => { console.log('stderr:\n', data.toString()); }); child.on('error', (error) => { console.log('error:\n', error); }); child.on('exit', (code, signal) => { if (code) console.log('Process exit with code:', code); else if (signal) console.log('Process killed with signal:', signal); else console.log('Backup is successful'); }); }
MongoAtlas M0集群适配注意事项
- 运行脚本的服务器IP必须提前加入MongoAtlas控制台的IP白名单,否则会被拦截无法连接集群
- 本地安装的
mongodump工具主版本需要和Atlas M0集群的MongoDB版本保持一致,避免版本不兼容导致备份失败 - 若连接串包含特殊字符,无需额外转义,spawn传递参数时会自动处理特殊字符的转义问题
内容的提问来源于stack exchange,提问作者sai krishna
相关产品推荐
相关产品推荐

