刚在cms系统上添加了一个数据备份的功能,也是自己随性瞎写的,没有规划,率性而为,鼓捣了大半天,功能基本上实现了,主要作用是手动对数据库进行备份并生成压缩文件,当然也包含管理功能,比如删除备份。下面通过介绍改功能介绍一下nodejs的archiver组件。

   其实原生的nodejs 已经自带了gzip (zlib)压缩,开始也尝试过,比较简单,实现方式如下:


var zlib = require("zlib");
var gzip = zlib.createGzip();
var fs = require("fs");
var inp = fs.createReadStream("test.txt");
var out = fs.createWriteStream("test.txt.gz");
// 压缩管道
 inp.pipe(gzip).pipe(out);

   基本和官网上代码一致,创建读文件流 —— 创建压缩文件流 , 通过压缩管道生成压缩文件   但是尝试后发现gzip只对单个文件有效,对于文件夹是没有效果的,当然,通过进一步的处理可能也可以达到效果,没有尝试。google了一下,找到了一个比较合适的组件archiver,实现方法也比较简单。

 

    archiver是一个在nodejs中能跨平台实现打包功能的模块,可以打zip和tar包,是一个比较好用的三方模块。

使用前先安装archiver模块。

npm install archiver


实现数据库备份代码:

var fs = require('fs');
var child = require('child_process');
var archiver = require('archiver');
backUpData : function(res,req){  // 数据备份
        var date = new Date();
//        var ms = Date.parse(date);
        var ms = moment(date).format('YYYYMMDDHHmmss').toString();
        var dataPath = Settings.DATABACKFORDER + ms;
        var cmdstr = 'mongodump -o "'+dataPath+'"';
//        var cmdstr = 'mongodump -u '+Settings.USERNAME+' -p '+Settings.PASSWORD+' -d '+Settings.DB+' -o "'+dataPath+'"';

        var batPath = Settings.DATAOPERATION + '/backupData.bat';
        if(!fs.existsSync(Settings.DATABACKFORDER)){
            fs.mkdirSync(Settings.DATABACKFORDER);
        }
        if (fs.existsSync(dataPath)) {

            console.log('已经创建过备份了');

        } else {

            fs.mkdir(dataPath,0777,function(err1){
                if (err1) throw err1;
                if( fs.existsSync(batPath) ) {
                    //写入文件
                    fs.writeFile(batPath,cmdstr,function (err2) {
                        if(err2){
                            console.log(err2)
                        }
                        else{
                            console.log("----文件写入成功-----")
                            var exec = child.exec;
                            exec('call "'+batPath,
                                function (error, stdout, stderr) {
                                    if (error !== null) {
                                        //console.log('exec error: ' + error);
                                    }else{
                                        console.log('备份成功');
//                                    生成压缩文件
                                     var output = fs.createWriteStream(Settings.DATABACKFORDER + ms +'.zip');
                                     var archive = archiver('zip');

                                     archive.on('error', function(err){
                                         throw err;
                                     });

                                     archive.pipe(output);
                                     archive.bulk([
                                         { src: [dataPath+'/**']}
                                     ]);
                                     archive.finalize();


//                                     操作记录入库
                                        var optLog = new DataOptionLog();
                                        optLog.logs = "数据备份";
                                        optLog.path = dataPath;
                                        optLog.fileName = ms +'.zip';
                                        optLog.save(function(err3){
                                            if (err3) throw err3;
                                            res.end("success");
                                        })
                                    }

                                });
                        }

                    }) ;
                }
            })
        }



    }



实现文件夹压缩代码:

//                                    生成压缩文件
                                     var output = fs.createWriteStream(Settings.DATABACKFORDER + ms +'.zip');
                                     var archive = archiver('zip');

                                     archive.on('error', function(err){
                                         throw err;
                                     });

                                     archive.pipe(output);
                                     archive.bulk([
                                         { src: [dataPath+'/**']}
                                     ]);
                                     archive.finalize();

实现思路: 1、通过nodeJs的子进程 require('child_process') 的exec 方法执行 bat文件

      2、bat动态写入执行脚本,脚本中动态定义数据表备份文件夹(按照备份时间生成时间为文件夹名称)

      3、执行脚本 mongodump -o "E:/mongodata/20150624082952" ,即mongodb自带的备份脚本

      4、数据备份

      5、将备份文件夹压缩到指定目录下。


QQ截图20150624101342.jpg


后台执行备份后的效果:

QQ截图20150624101636.jpg