2017-06-29 48 views
0

我有一个MongoDB服务器,我用mongodump命令来创建备份。我运行命令mongodump --out ./mongo-backup,然后tar -czf ./mongo-backup.tar.gz ./mongo-backup,然后gpg --encrypt ./mongo-backup.tar.gz > ./mongo-backup.tar.gz.gpg并将此文件发送到备份服务器。MongoDB备份 - > tar - > gz - > gpg

我的MongoDB数据库有20GB用MongoDB的show dbs命令,MongoDB的mongodump备份目录只有3.8GB,MongoDB的gzip压缩,压缩包只有118MBgpg文件只有119MB大小。

这怎么可能将20GB数据库减少到119MB文件?它容错吗?

我试图创建新的服务器(克隆生产),启用防火墙,以确保没有人可以连接和运行此备份过程。我创建全新的服务器和进口数据也有一些不同之处:

我跑从蒙戈相同的命令外壳use db1; db.db1_collection1.count();use db2; db.db2_collection1.count();和结果:

  • 807843与807831(db1.collection1源服务器db1.collection1恢复服务器
  • 3044401与3044284(db2.collection1源服务器db2.collection1恢复服务器
+0

您正在使用哪种特定版本的MongoDB服务器以及备份的部署类型(独立,副本集或分片群集)? – Stennie

+0

@Stennie我正在使用MongoDB 3.3独立。 – mimosvk

+0

3,3将是一个开发版本..你实际上意味着3.4.x?你可以在'mongo' shell中检查'db.version()'吗?您是否使用默认存储引擎(WiredTiger)? – Stennie

回答

0

如果您已验证恢复的数据中的文档/集合的数量和大小,则尽管所描述的比率不正常,但此方案是可能的。

我的MongoDB数据库有20GB用MongoDB的show dbs命令

这说明你磁盘上的文件,包括从以前的数据删除存在预分配的空间的大小。预分配的空间可供重用,但一些MongoDB存储引擎比其他存储引擎更高效。

MongoDB的mongodump备份目录只有3.8GB

mongodump工具(如v3.2.11,其中你提到使用),除非你指定--gzip选项导出数据的未压缩副本。这个总数应该代表您的实际数据大小,但不包括用于索引的存储空间。索引定义由mongodump导出,并且在通过mongorestore重新加载转储时索引将被重建。

使用WiredTiger时,未压缩的mongodump输出通常大于磁盘上的文件大小,默认情况下是压缩的。对于将来的备份,我会考虑使用mongodump的内置archiving and compression options来为您节省一个额外的步骤。

由于您的mongodump输出显着小于存储大小,因此您的数据文件要么高度碎片化,要么在数据库中存在一些其他未记录的数据,例如索引或数据。例如,如果您之前已将此服务器初始化为副本集成员,则数据库将包含大量预分配的replication oplog,该数据库不会被mongodump导出。

通过运行WiredTiger集合的compact命令,您可以回收过量的未使用空间。但是,有一个重要警告:在集合上运行compact将阻止正在运行的数据库的操作,因此只应在计划维护期间使用。

MongoDB的gzip压缩,压缩包只有118MBgpg文件只有119MB大小。

由于mongodump输出在默认情况下是未压缩的,压缩会根据您的数据产生显着差异。但是,3.8GB至119MB似乎不合理,除非您的数据有特别之处(大量小型馆藏?重复数据?)。我会再次检查您的还原数据是否与收集计数,文档计数,数据大小和索引相匹配。

+0

感谢您的答复。现在很清楚。我该如何“仔细检查”我的数据?我只使用了'show dbs;'输出和'db.collections.count();'。 – mimosvk

+0

我更喜欢在备份后使用gzip,因为在另一个Mongo服务器上它会减慢备份过程。当'mongodump'访问数据库时,我需要最小化时间,因为在备份时间,我停止了来自web服务器的所有写操作(进程)。当转储完成在磁盘上时,我不在乎时间为gzip + tar和gpg。我在'mongodump'结束之后立即开始所有进程。 – mimosvk

+0

@mimosvk没有规定的方法将恢复的数据与原始数据进行比较,但可以从数据库,集合和索引的before vs after计数开始。在你的描述中,你提到一些收集数量在源和还原的服务器上略有不同。如果您针对活动的MongoDB部署运行'mongodump',则会出现这种情况;在'mongodump'运行时发生的更新可能不会被捕获到输出中。使用副本集的部署,您可以运行'mongodump --oplog'来捕获在'mongodump'操作过程中发生的写入。 – Stennie

相关问题