Windows环境中 node后台使用代码备份mysql数据库

在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('数据库备份命令执行成功,但未检测到备份文件');
            }
        });
    });

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值