Monodb删除数据和磁盘空间释放

2022-06-07 09:03:15 浏览数 (1)

需求:

1、客户数据磁盘空间,剩余空间不足10%

2、mongodb数据库,可以清理数据表。存在问题,清理完成后,磁盘不会自动释放空间。

一、分批删除数据

1、执行命令,根据时间为条件判断。删除2019年之前的数据

代码语言:javascript复制
mongo -uroot -ptest --authenticationDatabase admin
> db.ApiLog.remove({"triggeringTime" : {$lte: ISODate("2019-08-31T16:00:00Z")}})
WriteResult({ "nRemoved" : 56447439 })

二、磁盘空间释放

方法1:使用 compact命令进行磁盘空间释放

compact命令,在WiredTiger存储引擎的MongoDB上,将重写集合和索引,且释放未使用的空间

命令:

代码语言:javascript复制
use testdb
db.runCommand({ compact : 'Log‘ });

日志:

代码语言:javascript复制
2020-04-08T23:22:32.338 0800 I COMMAND  [conn11513936] compact testdb.log begin, options: paddingMode: NONE validateDocuments: 1
2020-04-09T00:42:04.065 0800 I COMMAND  [conn11513936] compact testdb.log end
2020-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

说明:

代码语言:javascript复制
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。所以此命令主要是用于修复数据。

命令:

代码语言:javascript复制
use yourdatabase;
db.repairDatabase();

说明:

代码语言:javascript复制
1、db.repairDatabase()主要用于修复数据。若你拥有数据的完整副本,且有权限访问,请使用第三种方法“secondary节点重同步”
2、在执行命令前请保证你有比较新的备份
3、此命令会完全阻塞数据库的读写,谨慎操作
4、此命令执行需要数据文件所在位置有等同于所有数据文件大小总和的空闲空间再加上2G
5、在使用MMAPv1存储引擎的secondary节点上执行该命令可以压缩集合数据
6、在使用WiredTiger存储引擎的MongoDB库上执行不会有压缩的效果
7、再碰到特殊情况要停止运行该命令时,可通过db.currentOp()查询进程信息,然后通过db.killOp()干掉进程
8、非常消耗时间

三、总结

在删除数据过程,可能会出现死锁,导致程序卡主,建议删除数据尽量放到用户访问比较少的时间。

如果删除数据出现锁,可以使用如下命令,杀死正在进行进程。

1、当前正在连接请求显示db.currentOp()

代码语言:javascript复制
mongo -uroot -ptest --authenticationDatabase admin --eval "db.currentOp()" >1.txt

2、kill 连接

代码语言:javascript复制
db.killOp(<operation id>)

0 人点赞