简单问题-Sequoiadb数据库脚本批量删除数据

来源:互联网 发布:python ftp上传文件 编辑:程序博客网 时间:2024/05/23 00:02

背景

开发中使用的是巨杉数据库,有一个日志集合是按天存储的,即表集合名称规则一致MyLogData_yyyyMMDD的格式,每天生成一张表。现在有一个问题就是服务器磁盘空间已经被撑满了,需要删掉一段时间的数据。由于涉及的类似结构的表有5张,手动一条条执行dropCL操作太麻烦。

解决办法

首先,sequoiadb数据库提供了执行js的工具脚本,可以将需要执行的一堆操作写入到一个脚本中,通过脚本来执行删除操作。完全用js的语法,内容很简单,就是定义一个数组,存储需要删除的集合的日期,然后for循环调用dropCL方法删表。

编写remove_data.js脚本如下,并将其上传到目标服务器home目录下。

var db=new Sdb('localhost',11810)//定义删除0524-0614日期区间的数据var removeDates = new Array();for(var i=24;i<32;i++){    var date = '201705'+i+'';    removeDates.push(date);}for(var i=1;i<15;i++){    var date = '201706';    if(i>9){        date=date+i+'';    }else{         date=date+'0'+i;    }    removeDates.push(date);}//循环调用sequoiadb的dropCL命令for(var i=0;i<removeDates.length;i++){    try{        db.MySpace.dropCL('MyLogData_'+removeDates[i]);    }catch(e){        println(e);    }       try{        db.MySpace.dropCL('MyLogData1_'+removeDates[i]);    }catch(e){        println(e);    }      }

其次,调用命令执行该脚本:

/opt/sequoiadb/bin/sdb -f /home/remove_data.js

延伸思考

首先,js脚本编写需要注意异常捕获问题,for循环中如果有一个集合不存在,脚本执行就会终结,所以将每个dropCL语句放在try-catch中就能保证所有循环都执行。

其次,其实我想能不能利用db.listCollections获取所有的集合,并用循环打印每条集合的记录的总数。这个遍历操作现在还没有实现。还需要研究下Sequoiadb是怎么跟js的语法联系起来综合运用的,官方说就是标准的js语法,但是从我实践的结果来看还是有差异的,比如这个catch(e)的属性跟js的异常对象就不一样。也没有alert和console.log方法,只找到一个println方法。

最后,这个用脚本执行批量sequoiadb命令的功能还是挺好用的,脚本可复用,而且又不用手动重复执行。

扩展运用

刚刚通过官网管理员的提示,终于知道了sequoiadb数据库的命令操作的返回值的类型了,db.listCollections返回的是游标,只能通过游标来遍历,那么我希望打印每个集合总记录数的脚本就能实现了,修正如下:

var db=new Sdb('localhost',11810)var cursor = db.listCollections();while (cursor.next ()){    var obj = cursor.current ().toObj();    var realName = obj['Name'];    var indexOf = realName.indexOf(".");    var space = realName.substring(0,indexOf);    var cl = realName.substring(indexOf+1);    var count = db.getCS(space).getCL(cl).count();    println(obj['Name']+",count:"+count);}

截取到space和collection的名称后,再调用函数先获取Space,再获取Collections就能直接获取每个集合的count值了。其实也不复杂,就是js语法的运用了。
结果如下:

这里写图片描述

原创粉丝点击