我有一个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数据库有20GB,MongoDBshow dbs
命令,MongoDBmongodump
备份目录只有3.8GB,MongoDB gzip tarball只有118MB,我的gpg
文件只有119MB。
如何将20GB数据库减少到119MB文件?它是容错的吗?
我尝试创建新的服务器(生产的克隆),启用防火墙以确保没有人可以连接并运行此备份过程。我创建新的服务器并导入数据,这有一些不同:
我从mongo shelluse db1; db.db1_collection1.count();
和use db2; db.db2_collection1.count();
运行了相同的命令,结果是:
807843与807831(db1.collection1源服务器与db1.collection1还原服务器)
3044401与3044284(db2.collection1源服务器与db2.collection1还原服务器)
最佳答案
如果已验证还原数据中文档/集合的计数和大小,则可能出现这种情况,尽管所述比率不典型。
我的MongoDB数据库有20GB,使用MongoDBshow dbs
命令
这显示了磁盘上文件的大小,包括从以前的数据删除中存在的预先分配的空间。预先分配的空间可供重用,但某些MongoDB存储引擎比其他引擎效率更高。
MongoDBmongodump
备份目录只有3.8GB
除非指定了mongodump
选项,否则--gzip
工具(在v3.2.11中,您提到了使用该工具)将导出数据的未压缩副本。此总数应表示实际数据大小,但不包括用于索引的存储。索引定义由mongodump
导出,并在通过mongorestore
重新加载转储时重建索引。
使用WiredTiger,未压缩的mongodump
输出通常大于磁盘上默认压缩的文件大小。对于将来的备份,我会考虑使用mongodump
的内置archiving and compression options来节省额外的步骤。
由于您的mongodump
输出明显小于存储大小,因此您的数据文件要么是高度碎片化的,要么是您尚未考虑的一些其他数据,例如local
数据库中的索引或数据。例如,如果您先前已将此服务器初始化为副本集成员,local
数据库将包含一个预先分配的大型replication oplog,它不会由mongodump
导出。
您可以通过为WiredTiger集合运行compact
命令来回收多余的未使用空间。但是,有一个重要的警告:在集合上运行compact
将阻止正在操作的数据库的操作,因此这只应在计划的维护期间使用。
MongoDB gzipped tarball只有118MB,而我的gpg
文件只有119MB。
由于默认情况下,mongodump
输出是未压缩的,因此压缩可能会根据您的数据产生显著差异。但是,3.8GB到119MB似乎不合理,除非您的数据有一些特殊之处(大量的小集合?重复数据?)。我将再次检查还原的数据在收集计数、文档计数、数据大小和索引方面是否与原始数据匹配。
关于linux - MongoDB备份-> tar-> gz-> gpg,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44829727/