在Windows环境中备份数据库有很多办法,文中仅说明如何使用代码来实现备份功能。
备份数据库最常用的就是使用cmd命令进行备份,其代码如下:
E:
cd E:\SOFT\MySQL\mysql-5.7.24-winx64\bin
mysqldump -uroot -p123456 --lock-all-tables --flush-logs e3db > E:/1586916254571.sql
代码第一行:切换盘符,cmd默认在C盘,所以需要把根盘符切换到mysql安装的那个盘符
代码第二行:切换路径,将路径切换到mysql安装目录的bin目录下,因为mysqldump命令需要在这个路径下才能被正确识别
代码第三行:-u后面跟着数据库账户,-p跟着密码,大于号前面为需要备份的数据库名,后面是需要备份的文件名和路径。其中备份路径不允许有中文存在,不然有极大可能无法生成备份文件。
上面三行代码就是只用cmd命令进行数据库备份的操作,那么如何使用node来控制呢?这里我介绍使用node执行bat文件。代码如下:
const path = require('path');
const fs = require('fs');
const {execFile} = require('child_process');
execFile(path.resolve('./backupTask/test.bat'),{encoding: 'buffer'}, (err, stdout, stderr) => {
if (err) {
console.error(err);
return;
}
if(fs.existsSync(filePath)){
console.log('生成成功');
} else {
console.log('生成失败')
}
});
在node中使用child_process这个子进程来实现控制bat命令文件的执行,需要注意的是,不管是bat命令文件中的命令还是node后台所在的项目路径都不建议出现中文字符,楼主在测试的时候由于项目路径下存在中文,导致执行的时候要么报错要么执行成功但是没有生成任何的文件。
按照上述的说法就可以正常执行bat命令,把数据库成功的备份出来。如果你想要能动态改变备份文件的文件名,那么只要结合fs模块的writeFile就可以达到命令的动态生成。下面贴出楼主完整的代码。
log.allLog.info('启动数据库备份命令');
let backupDir = config.backupConfig.dbDir; // 设置备份路径
backupDir = backupDir.replace(/\\/g, '/'); // 路径斜杠替换
let filePath = backupDir + '/' + new Date().getTime() + '.sql'; // 根据时间戳生成备份文件路径+文件名
log.allLog.info('生成备份路径和文件名:' + filePath);
// 生成cmd命令字符串
let cmdStr = `${config.backupConfig.drive}
${config.backupConfig.binPath}
mysqldump -u${config.username} -p${config.password} --lock-all-tables --flush-logs ${config.database} > ${filePath}`;
fs.writeFile('./batCmd/run.bat', cmdStr, {encoding: 'utf8'}, err => {
if (err) {
log.errLog.error('数据库备份命令写入文件错误,', err);
return;
}
log.allLog.info('数据库备份命令写入成功');
log.allLog.info('执行命令文件,文件路径:' + path.resolve('./batCmd/run.bat'));
execFile(path.resolve('./batCmd/run.bat'), {encoding: 'buffer'}, (err, stdout, stderr) => {
if (err) {
log.errLog.error('数据库备份命令执行错误,', err);
return;
}
log.allLog.info('数据库备份命令执行成功,正在检测文件是否成功生成');
if (fs.existsSync(filePath)) {
log.allLog.info('数据库备份命令执行成功,成功检测到文件:' + filePath);
} else {
log.errLog.error('数据库备份命令执行成功,但未检测到备份文件');
}
});
});