更多优质内容
请关注公众号

深入学习mongodb(九)mongodb备份、锁定备份、mongodump命令-阿沛IT博客

正文内容

深入学习mongodb(九)mongodb备份、锁定备份、mongodump命令

栏目:数据库 系列:深入学习mongdb 发布时间:2022-12-10 11:15 浏览量:2523

备份有许多种方法。但无论采用哪种方法,备份操作都会增加系统的负担:备份通常需将所有数据读取到内存中。因此,通常情况下,应对副本集的非主节点(与主节点相对)进行备份,或在空闲时段对独立服务器进行备份。


法1:文件系统快照

生成文件系统快照(snapshot)是最简单的备份方法。然而,该方法的实现需要两点条件,即文件系统本身支持快照技术,以及在运行mongod时必须开启journal日记系统。如系统满足这两点条件,则该方法无需其他准备,只需生成快照即可,时间不限。


法2:手动复制数据文件

这个方法就是直接将/db/data下的所有文件都拷贝到目标目录。不过在此之前需要先锁定所有数据库,禁止任何写入,同时锁定的命令会将所有脏页刷新至磁盘,以确保数据目录中的文件是最新的。

一旦运行锁定命令,mongod会将之后的所有写入操作加入队列等待,且在解锁前不会对这些写入操作进行处理。此时mongod仍可以接受读写请求,不过写入的数据无法被执行,只有当解锁后才会从队列中取出并执行。

db.fsyncLock() // 该命令会锁住所有数据库
cp  -R  /data/db/*  /mnt/external-drive/backup // 备份数据
db.fsyncUnlock() // 解锁


注意,身份验证和fsynclock命令存在一些锁定问题。如果启用了身份验证,则在调用fsyncLock()和 fsyncUnlock()期间不要关闭shell。如果在这期间断开了连接,则可能无法进行重新连接,并不得不重启mongod。fsyncLock()的设定在重启后不会保持生效,mongod总是以非锁定模式启动。

其实也可以直接关闭mongod服务然后再备份,这样就可以不同上锁和解锁,但是这样的话,备份过程中就不能接受任何读写请求。


当恢复备份的时候,请保证mongod没有在运行,且所有待恢复的数据目录为空。将备份的数据文件复制到数据目录,然后启动mongod。


如果我只是想备份某一个数据库的数据而非所有数据库的数据,只需复制所有名为xxx.*(xxx是我要备份的数据库库名)的文件,包括后缀名为.ns的文件。

如使用了--directoryperdb选项,说明一个数据库单独存在一个目录下,此时只需复制该数据库对应的整个数据目录。


法3:使用mongodump命令

该方法备份和恢复的速度较慢,在处理副本集时存在一些问题。但是他的优点是可以备份指定的数据库,甚至是指定的集合。


mongodump命令脚本语法如下

mongodump  -h 127.0.0.1  -d test -c users -o /root/db


-d:

需要备份的数据库实例,例如:test


-o:

备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录


-c:

需要备份的集合名称


所有的参数都是可选的。如果需要权限验证,可以加上-u和-p参数使用用户名和密码。

要备份所有数据库,只需运行mongodump即可,可以指定mongod运行时占用的端口。

mongodump  --port=31000  -h  127.0.0.1


如果没有指定-o则mongodump会在当前目录建立一个转储(dump)目录,其中包含了一份所有数据的倾卸。转储目录中的目录和子目录由数据库和集合构成。真正的数据存放在扩展名为.bson的文件里。可使用MongoDB自带的bsondump工具查看.bson文件。


使用mongodump时甚至无需服务器处于运行状态:可使用--dbpath选项来指定数据目录,mongodump会使用指定的数据文件进行备份。

mongodump  --dbpath  /data/db

如果mongod正在运行,则不应使用--dbpath选项。


在备份的过程中,系统可能会继续进行写入操作。新的写入操作的数据不会备份起来。

为避免这种情况的发生,如果运行mongod时使用了--replSet选项,则可使用mongodump的--oplog选项。这会将转储过程中服务器进行的所有操作记录下来,这样在恢复备份时就会重新执行这些操作。


当然也可以备份指定的数据库如对于转储一个副本集,mongodump需要接一个副本集的连接字符串如

setName/seed1,seed2,seed3

此时mongodump会选择一台备份节点进行转储。



恢复mongodump产生的备份,可使用mongorestore工具

mongorestore -h <hostname><:port> -d dbname <path> -c collectionName


--host <:port>, -h <:port>:MongoDB所在服务器地址,默认为: localhost:27017

--db , -d :需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test。

--collection,-c: 需要恢复的集合名称。

--drop:恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!

<path>: mongorestore 最后的一个参数,设置备份数据所在位置,例如:c:\data\dump\test。你不能同时指定 <path> 和 --dir 选项,--dir也可以设置备份目录。

--dir:指定备份的目录你不能同时指定 <path> 和 --dir 选项。

以上所有参数都是可选的。


如果其中指定的备份path可以是一个目录或是一个文件,如果恢复的是一个数据库则path就是一个目录,如果恢复的是一个集合则path就是一个bson文件。

如果转储数据库时使用了--oplog参数,运行mongorestore时必须使用--oplogReplay选项才能回复备份过程中新执行的写操作的数据。

mongorestore 127.0.0.1:27017 --oplogReplay  dump/ // 恢复所有库的数据



如果在运行的服务器上进行数据替换,可使用--drop选项,以在恢复一个集合前先删除它(--drop会删除所有数据库的数据)。更多的参数可以使用 --help 查看。




对副本集进行备份

首先如果要对副本集进行备份应该是对备份节点进行备份以减轻主节点的负担。此时推荐使用复制数据文件的方式进行备份。

如果使用mongodump进行备份,必须在备份时使用--oplog选项,来得到一个基于某时间点的快照;恢复的时候,需要将该成员作为一个单独的服务器启动,此时要使用一个空的数据目录。首先,像上一节中提到过的那样,使用--oplogReplay选项运行mongorestore。现在它应该包含了一份完整的数据副本,但还需要一份oplog。运行createCollection命令来建立oplog:

use  local
db.createCollection("oplog.rs",  {"capped"  :  true,  "size"  :  10000000})



填充oplog:

mongorestore  -d  local  -c  oplog.rs  dump/oplog.bson

最后将服务器作为副本集成员重新启动



对分片集群进行备份

当集群很小或正在进行开发时,应先关闭平衡器,然后通过mongos运行mongodump。这会在mongodump所运行的机器上(当前机器上)建立所有分片的备份。

要恢复此种备份,需运行mongorestore并连接到一个mongos。

其实我的想法是可以对分片集群的mongos创建一个副本集,副本集中的另一个mongod服务只负责同步备份数据而不应用于处理读写请求。然后每周将这个mongod的数据备份1次到挂在的磁盘中。




更多内容请关注微信公众号
zbpblog微信公众号

如果您需要转载,可以点击下方按钮可以进行复制粘贴;本站博客文章为原创,请转载时注明以下信息

张柏沛IT技术博客 > 深入学习mongodb(九)mongodb备份、锁定备份、mongodump命令

热门推荐
推荐新闻