第四篇:mongoDB 服务器空间满 清理不需要的数据

第一步:删除集合数据

mongo
use wssb
db.auth('wssb_user','wssb_user_2019')
db.file.count()  //获取总条数
db.file.getIndexes()  //查询所有索引
db.file.createIndex({
     "uploadDate":-1})  //创建索引
db.getCollection('file').find({
     "_id" : ObjectId("5ccd002153c24112d01c0dfa")})
db.getCollection('file').find({
     "uploadDate" : ISODate("2019-08-27 05:44:19.402Z")})   //查询uploadDate为这个的数据
db.file.find({
     "uploadDate":{
     "$gt":ISODate("2019-08-27 05:44:19.402Z")}}) // 大于某个时间
db.file.find({
     "uploadDate":{
     "$lt":ISODate("2019-08-27 05:44:19.402Z")}}) // 小于某个时间
db.file.find({
     "uploadDate":{
     "$gt":ISODate("2019-08-27 05:44:19.402Z")}}).count() // 大于某个时间的条数
db.file.find({
     "uploadDate":{
     "$lt":ISODate("2019-08-27 05:44:19.402Z")}}).count()  //小于某个时间的条数
db.file.deleteMany({
     "uploadDate":{
     "$lt":ISODate("2019-08-27 05:44:19.402Z")}})  //删除小于某个时间的数据
db.file.deleteMany({
     "uploadDate":{
     "$lt":ISODate("2019-08-27 05:44:19.402Z")}})  //删除大于某个时间的数据

第二步:释放磁盘空间

当我们从MongoDB中删除文档或集合时,MongoDB并不会将已经占用了的磁盘空间释放,它会一直维护已经占用了磁盘空间的数据文件,
尽管数据文件中可能存在大大小小的空记录列表(empty record list)。当客户端程序再次插入文档时,MongoDB会从空记录列表中分配存储空间给新文档。
那么为了更加有效的使用磁盘空间,我们需要对mongodb的数据文件做碎片整理以及未使用空间的回收。思想无非两种:
1、对原数据进行重组
2、仅将数据复制出来,形成仅数据的完整备份
参考这篇文章中的第三种方案,这种方案不会阻塞副本集的读写,不用暂停应用

删除数据后,mongo使用的磁盘空间不会重新分配,删除secondary节点中指定数据,使之与primary重新开始数据同步。
当副本集成员数据太过陈旧,也可以使用重新同步。数据的重新同步与直接复制数据文件不同,MongoDB会只同步数据,
因此重同步完成后的数据文件是没有空集合的,以此实现了磁盘空间的回收。

1、若是primary节点,先强制将之变为secondary节点,否则跳过此步骤(只有释放primary节点的数据时才需要此步骤,否则跳过此步骤):
    rs.stepDown(120);  
	注意:执行此命令是让仲裁节点重新选举,将原来的secondary节点选举为primary节点,此时原来的primary已经变成了secondary,下面的操作需要在新的primary节点上进行,
		可以使用rs.status() 或 rs.config()查看主从信息 
2、然后在primary上删除secondary节点:
    rs.remove("IP:port");
3、删除secondary节点dbpath下的所有文件。
4、将节点重新加入集群,然后使之自动进行数据的同步:
    rs.add("IP:port");
5、等数据同步完成后(可以查看secondary节点的日志来查看同步进度),循环1-4的步骤可以将集群中所有节点的磁盘空间释放

重启时 撤销正在创建的索引 启动时增加参数 --noIndexBuildRetry

你可能感兴趣的:(mongoDB学习总结)