压缩 MongoDB 的数据文件

MongoDB采用了磁盘空间预分配的机制,为了避免磁盘碎片以及使用mmap后造成的近一步的内存碎片,但是随着数据的增删除改操作,数据文件不可避免的会产生空洞,造成磁盘空间和内存的浪费。本文说的是这方面的压缩,数据使用某些压缩算法进行压缩的讨论不在此范围。

在MongoDB 中,大概有两种方法可以解决这种问题,但是都不是无痛方式,所以并不推荐使用。

1.通过 repairDatabase 整理数据文件

repairDatabase 是MongoDB 内置的一个db 上的方法,调用这个方法,MongoDB
会扫描db中的所有数据,并将通过重新插入来重新整理数据集合。

这种方法的代价是对这个 db 的读写操作会变得非常之慢,甚至会出现写操作丢失的情况。所以这个时候最好直接停掉客户端的写操作。

可以创建 bar.js 文件,写入如下代码:

// Get a the current collection size.
var storage = db.foo.storageSize();
var total = db.foo.totalSize();

print(‘Storage Size: ‘ + tojson(storage));

print(‘TotalSize: ‘ + tojson(total));

print(‘-----------------------‘);
print(‘Running db.repairDatabase()‘);
print(‘-----------------------‘);

// Run repair
db.repairDatabase()

// Get new collection sizes.
var storage_a = db.foo.storageSize();
var total_a = db.foo.totalSize();

print(‘Storage Size: ‘ + tojson(storage_a));
print(‘TotalSize: ‘ + tojson(total_a));


然后运行:

$ mongo foo bar.js

运行结果:

MongoDB shell version: 1.6.4
connecting to: foo
Storage Size: 51351
TotalSize: 79152
-----------------------
Running db.repairDatabase()
-----------------------
Storage Size: 40960
TotalSize: 65153

2.如果应用可以接受,可以考虑使用capped collection

capped collection 是 MongoDB
中的一种特殊collection,它的大小可以限定,数据在这个限定大小内循环写入,在数据集合达到上限后,新数据会覆盖老的数据。这样磁盘上的空洞在一段时间后会自动消除。

参考资料:http://learnmongo.com/posts/compacting-mongodb-data-files/

事实上使用 replication 相关的功能也可以实现以上说的数据压缩,具体过程比较麻烦,还会涉及到客户端的切换等操作。有兴趣的同学可以自己研究一下。同时欢迎有更好的方法提供。

文章转自:http://blog.nosqlfan.com/html/1062.html

压缩 MongoDB 的数据文件,码迷,mamicode.com

时间: 2024-08-07 04:10:08

压缩 MongoDB 的数据文件的相关文章

MongoDB数据文件内部结构

有人在Quora上提问:MongoDB数据文件内部的组织结构是什么样的.随后10gen的工程师Jared Rosoff出来做了简短的回答. 每一个数据库都有自己独立的文件.如果你开启了directoryperdb选项,那你每个库的文件会单独放在一个文件夹里. 数据库文件在内部会被切分成单个的块,每个块只保存一个名字空间的数据.在MongoDB中,名字空间用于区分不同的存储类别.比如每个collection有一个独立的名字空间,每个索引也有自己的名字空间. 在一个块中,会保存多条记录,每条记录是B

mongodb预先分配数据文件

mongodb预先分配数据文件,避免出现客户端超时 #!/bin/bash for i in {1..5} do echo $i head -c 120000000 /dev/zero > test.$i done

MongoDB 数据文件备份与恢复

备份与恢复数据对于管理任何数据存储系统来说都是非常重要的. 1.冷备份与恢复——创建数据文件的副本(前提是要停止MongoDB服务器),也就是直接copy MongoDB将所有数据都存储在数据目录下,默认是/data/db/(Windows下是C:\data\db\),启动MongoDB时也可以用--dbpath指定我们自己设置的数据存储目录. 备份MongoDB数据:只要简单的创建数据存储目录的副本就可以了,直接copy一份. 恢复MongoDB数据:在MongoDB启动时用--dbpath指

python里读写excel等数据文件的几种常用方式

python处理数据文件第一步是要读取数据,文件类型主要包括文本文件(csv.txt等).excel文件.数据库文件.api等. 下面整理下python有哪些方式可以读取数据文件. 1. python内置方法(read.readline.readlines) read() : 一次性读取整个文件内容.推荐使用read(size)方法,size越大运行时间越长 readline() :每次读取一行内容.内存不够时使用,一般不太用 readlines() :一次性读取整个文件内容,并按行返回到lis

MongoDB存储数据

想要深入了解MongoDB如何存储数据之前,有一个概念必须清楚,那就是Memeory-Mapped Files. Memeory-Mapped Files 下图展示了数据库是如何跟底层系统打交道的. 内存映射文件是OS通过mmap在内存中创建一个数据文件,这样就把文件映射到一个虚拟内存的区域: 虚拟内存对于进程来说,是一个物理内存的抽象,寻址空间大小为2^64: 操作系统通过mmap来把进程所需的所有数据映射到这个地址空间(红线),然后再把当前需要处理的数据映射到物理内存(灰线): (这可以理解

ORACLE RMAN备份及还原 RMAN可以进行增量备份:数据库,表空间,数据文件

ORACLE RMAN备份及还原 RMAN可以进行增量备份:数据库,表空间,数据文件 只有使用过的block可以被备份成backup set 表空间与数据文件对应关系:dba_data_files / v$datafile_header 在noarchivelog模式下,可以使用RMAN备份read-only和offline的表空间 ORACLE RMAN停机备份: 备份 RMAN连接上ORACLE,WINDOWS下在命令模式下 RMAN TARGET / 连接本地数据库用的是本地认证模式.RM

MongoDB丢数据问题的分析

坊间有很多传说MongoDB会丢数据.特别是最近有一个InfoQ翻译的Sven的一篇水文(为什么叫做水文?因为里面并没有他自己的原创,只是搜罗了一些网上的博客,炒了些冷饭吃),其中又提到了丢数据的事情.大家知道作为一个数据库来说,数据的持久性基本上是数据库的最低要求了.如果MongoDB真的有那么糟糕的数据安全问题,它早就在技术选择众多的今天被无情地淘汰掉了.那么真相到底如何呢? 实事求是地来说,MongoDB确实在其发展的过程中,有一些数据持久化的问题没有处理好,特别是一些默认值的选定上.大部

MongoDB的数据复制和数据切片

MongoDB简介 MongoDB由C++开发,是NoSQL中比较接近关系型数据库的一种.MongoDB中的数据以类似于json的格式存储,性能非常优越,且支持大量的数据存储.但是MongoDB不支持事务性的操作,使得其适用场景受到限制. MongoDB副本集 MongoDB的数据复制有两种类型: 1)master/slave 2)replica set 第一种为类似于MySQL的主从复制模型,第二种为副本集复制方式.现在主要应用的为副本集复制模型.结构图如下: 一个副本集即为服务于同一数据集的

关于MongoDB数据库中文件唯一性的问题

※重要※——介绍一下我的环境:MongoDB的“win32-x86_64-2008plus-ssl-3.0.5”,MongoVUE版本是1.6.9,VS2010,dll是1.10版本. MongoDB中文件的上传 试验①:使用VUE上传,{本地文件名相同,但文件内容不同},在VUE中直接点击“Add Files”上传文件,此时VUE会检查你的文件名是否重复,若重复就会给出提示“是改名?or还是跳过?”:这里咱们点击‘重命名’完成文件的上传,在VUE中可以看到如图所示:{前三个是我用VUE上传的}