mongodb中备份,有三种实现方式:
1.Filesystem Snapshot
2.直接复制data文件
3.mongodump
在进行备份之前,为了保证备份时没有新的数据写入。需要关闭balancer和加上instance级的写入锁(如果没有开启journal)。先备份config server,再备份shard set
首先,我们了解一下什么是fsyncLock()。再来细看3种backup方法。
db.fsyncLock()
db.adminCommand( { fsync: 1, lock: true } )
flush pending writes到硬盘,锁住整个mongod instance不再接受任何逻辑数据的写操作直到重启或者使用 ?db.fsyncUnlock()
fsynclock, fsynunclock都会对lockcount进行操作。 运行一次 fsynclock, 对 lockCount +1 。 运行一次 fsynUnclock, 对 lockCount – 1 。只有lockcount =0时。才是真正解锁。
Filesystem Snapshot
利用操作系统文件系统提供的snapshot功能对monogodb数据文件存放的 volume 创建snapshot的方式进行备份。
建立好的snapshot需要存储到其他硬盘上来保证安全。
恢复snapshot时,会产生一个mongod.lock 文件。如果不删除就启动mongod,会被当做上次关闭mongod非正常关闭。
优点:快速方便。可以备份 “粗略的”point-in-time数据
缺点:snapshot典型缺点,备份实际还是依靠原本数据文件完成的。同时不能针对某个数据库进行备份。
复制data file
简单明了,直接复制存储数据的文件到其他磁盘的方式来备份数据。
优点:拥有完整的数据备份
缺点:备份时间长短取决于数据大小。恢复时往往也是文件替换。
使用mongodump
输出文件以 .bson 文件格式存储。可以使用bsondump来validate。
优点:对于备份特定数据库,collection(或者其中一部分)很方便。不需要fssynclock。可以备份point-in-time数据
缺点: mongodump不会被备份Local 数据库 。不被备份index。 占用大量内存,使正常业务占用的内存被清空影响性能。
- –db //需要备份的数据库
- –collection //需要备份collection.不填为备份数据库
- –query //备份使用的查询query
- –queryFile //或者使用query file 方式指定文件路径
- –readPreference // 默认从primary 【shard】读。其他情况读nearest
- –forceTableScan //与–query冲突,强制不是用index
- –gzip //压缩。。。
- –out //输出文件的路径
- –archive //使用stdout方式输出数据
- –dumpDbUsersAndRoles //导出user ,role信息
- –excludeCollection //不导出某个collection
- –excludeCollectionsWithPrefix //导出某个前缀开头的collection, 这个参数可以使用多次,指定多个前缀
- –numParallelCollections //同时可以导出多少个collection,默认4个
- –oplog //创建一个 oplog.bson文件。保存备份期间mongod发生的数据变化(oplog entires)。这个方式不是dump oplog collection实现的。同时这个参数只能用于备份整个节点,不能指定对db,collection
mongorestore
恢复mongodump导出的备份文件,并重建索引。但只执行插入不进行更新操作,如有重复_id document不会进行修改document。
不会恢复system.profile。
- –db //指定导入的db
- –collection //指定导入的collection
- –nsExclud //不导入符合 ns pattern的name space
- –nsInclude //仅导入符合 ns pattern的name space
- –nsFrom //导出符合 符合 ns pattern的name space 到 nsto
- –nsTo //从nsFrom ns pattern的name space 以nsTO 的pattern导入
- –drop //如果有存在对象,则删除
- –dryRun //不真正导入数据,进获取summary 信息
- –oplogReplay //导入之后,使用oplog.bson恢复到point-in-time
-
--oplogLimit?<timestamp>//replay时候的 point-in-time选择 - –oplogFile //oplog 的路径
- –noIndexRestore //不恢复索引
- –restoreDbUsersAndRoles //恢复user role设定
- –writeConcern //默认是majority
- –maintainInsertionOrder //默认false,按导入文件里的数据顺序导入。
- –numParallelCollections //同时导入多少个collection
- –numInsertionWorkersPerCollection //导入一个collection 使用多少个worker
- –stopOnError //遇到错误停止
- –gzip // 压缩文件作为输入
- –archive // 接收stdin 为输入