赞
踩
需求:
1、客户数据磁盘空间,剩余空间不足10%
2、mongodb数据库,可以清理数据表。存在问题,清理完成后,磁盘不会自动释放空间。
一、分批删除数据
1、执行命令,根据时间为条件判断。删除2019年之前的数据
mongo -uroot -ptest --authenticationDatabase admin> db.ApiLog.remove({"triggeringTime" : {$lte: ISODate("2019-08-31T16:00:00Z")}})WriteResult({ "nRemoved" : 56447439 })
二、磁盘空间释放
方法1:使用 compact命令进行磁盘空间释放
compact命令,在WiredTiger存储引擎的MongoDB上,将重写集合和索引,且释放未使用的空间
命令:
use testdbdb.runCommand({ compact : 'Log‘ });
日志:
2020-04-08T23:22:32.338+0800 I COMMAND [conn11513936] compact testdb.log begin, options: paddingMode: NONE validateDocuments: 12020-04-09T00:42:04.065+0800 I COMMAND [conn11513936] compact testdb.log end2020-04-09T00:42:04.066+0800 I COMMAND [conn11513936] command testdb.log appName: "MongoDB Shell" command: compact { compact: "ApiLog" } numYields:0 reslen:22 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, Database: { acquireCount: { W: 1 }, acquireWaitCount: { W: 1 }, timeAcquiringMicros: { W: 37 } } } protocol:op_command 4771728ms
说明:
1、在执行命令前请保证你有比较新的备份2、在使用MMAPv1存储引擎的MongoDB上compact需要数据文件所在分区至少有2G的空闲空间3、在使用WiredTiger存储引擎的MongoDB上,compact命令将重写集合和索引,且释放未使用的空间,但使用MMAPv1存储引擎的MongoDB上,该命令只对集合的数据文件进行碎片整理并重新创建其索引。不会释放空间,在使用MMAPv1存储引擎的MongoDB上回收空间,建议使用第三种方法“secondary节点重同步”4、使用MMAPv1存储引擎的MongoDB中的Capped Collections,是无法被压缩的,但使用WiredTiger存储引擎的MongoDB在执行compact时会进行压缩。5、在副本集上运行该命令时,要分别在每个节点执行6、该命令只能在mongod实例上执行,不能再mongos实例上运行。也就是说针对分片集群的compact操作要分别在每个分片节点上执行。7、一般该命令运行在secondary节点上,在执行时,会强制节点进入RECOVERING状态,RECOVERING状态的实例读写操作将被阻塞8、再碰到特殊情况要停止运行该命令时,可通过db.currentOp()查询进程信息,然后通过db.killOp()干掉进程9、compact可能会增加数据文件的总大小和数量,尤其是第一次运行时。但这不会增加总集合使用的磁盘空间,因为存储大小是数据库文件中分配的数据量,而不是文件系统上文件的大小/数量10、使用MMAPv1存储引擎的MongoDB中的Capped Collections,是无法被压缩的,但使用WiredTiger存储引擎的MongoDB在执行compact时会进行压缩。
方法2:使用repairDatabase命令
官网该命令的定义:通过丢无效或损坏的数据老重建数据库和索引。类似于文件系统修复命令fsck。所以此命令主要是用于修复数据。
命令:
use yourdatabase;db.repairDatabase();
说明:
1、db.repairDatabase()主要用于修复数据。若你拥有数据的完整副本,且有权限访问,请使用第三种方法“secondary节点重同步”2、在执行命令前请保证你有比较新的备份3、此命令会完全阻塞数据库的读写,谨慎操作4、此命令执行需要数据文件所在位置有等同于所有数据文件大小总和的空闲空间再加上2G5、在使用MMAPv1存储引擎的secondary节点上执行该命令可以压缩集合数据6、在使用WiredTiger存储引擎的MongoDB库上执行不会有压缩的效果7、再碰到特殊情况要停止运行该命令时,可通过db.currentOp()查询进程信息,然后通过db.killOp()干掉进程8、非常消耗时间
三、总结
在删除数据过程,可能会出现死锁,导致程序卡主,建议删除数据尽量放到用户访问比较少的时间。
如果删除数据出现锁,可以使用如下命令,杀死正在进行进程。
1、当前正在连接请求显示db.currentOp()
mongo -uroot -ptest --authenticationDatabase admin --eval "db.currentOp()" >1.txt
2、kill 连接
db.killOp()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。