MongoDB的备份和还原
生产环境中需要考虑的一个重要因素是备份,当出现故障时,备份可以用来快速恢复数据。所以,无论应用的大小,都要提前做好周全的备份。一般来说,MongoDB提供了如下几种备份方式:
- 使用
Ops Manager
(早期叫MMS)
- 使用
mongodump
和mongorestore
工具 - 直接备份原始数据文件
- 使用
Compass
备份
Ops Manager
Ops Manager
是一个集部署、监控、备份、报警和扩展
功能于一身的强大平台,它能轻松管理成百上千个
MongoDB 主机,特别适合中大型应用
的场景,它很吃电脑配置,需要至少15G
的内存,具体的硬件要求可以查阅相如下文档:https://www.mongodb.com/docs/ops-manager/v4.4/core/requirements/#hardware-requirements,如果你只是一个小型的应用,就没必要使用这种重武器了,这里就不详细说明了。使用mongodump和mongorestore
MongoDB Database Tools
,其中包含了mongodump和mongorestore,这些工具是使用go语言
编写的,是轻量级的工具,一个大小才20多M,mongodump会将数据库中的内容写为BSON文件,mongorestore用于读取这些备份的BSON文件并将其恢复到数据库中。它们可以用来备份实时运行的数据库(无需锁住或关闭数据库)。在早期,这个工具并不能备份索引,所以,如果索引很多的情况下,使用起来并不是很方便,好在MongoDB在不断改进(在版本4.4中,经过我实际的检测,索引已经能被一起备份了),所以,现在来看,这是一个非常好用的备份工具。./mongodump -u=name -p=password --authenticationDatabase=admin -d=cars --uri=mongodb://127.0.0.1:27017
上面会将数据库cars中的所有集合备份到当前目录dump里面,其中,-u表示用户名,-p表示密码,-d表示需要备份的数据库,你可以用-c指定只需要备份的集合,或者通过-o参数来指定输出的路径。这些参数的意义可以通过输入
./mongodump --help
来进行查询,或者进入MongoDB官方文档进行查询。
几个坑
可能需要注意下:- 不要下错版本,对于CentOS而言,有x86_64,ppc64le,s390x这三个版本,当时自己下载到了ppc64le这个版本,在自己的CentOS主机上自然无法使用。
- 可以使用
--config
参数来指定一个yaml
格式的配置文件,但是这个配置文件只能用三个参数(--password,--uri,--sslPEMKeyPassword),这是个大坑,当时自己还以为其他参数都支持,害得我跑了之后直接报错,unmarshal errors when using go
,自己又仔细阅读了一篇官方文档,确认了好几遍才发现,只支持这三个参数,😓,且版本必须为100.3.0及以上才支持--config参数。 backup需要角色权限,在admin数据库中添加用户,并给该用户
backup
角色,对应db为admin,不然,备份时会提示权限不够。同样,mongorestore也需要restore
角色权限。
直接备份原始数据文件
既然数据库中的文件都存放在硬盘
上,那可以将数据库的原始数据文件进行备份,这种方式需要锁住数据库来保障数据文件的一致性:
> use admin
> db.fsyncLock()
执行该命令需要hostManager
角色权限,如果执行成功,数据库将把storage layer
中的写操作数据更新到磁盘上,同时,整个mongod实例会被锁定来阻止额外的写入操作。接下来,就可以使用cp、scp
或者tar
等命令工具来进行备份了(比如,将整个数据库文件目录/var/mongo/data文件夹进行备份)。
这种方式的优点是速度比较快,因为不需要像mongodump那样进行数据格式的转换。但有一个缺点,在这整个备份期间,需要锁定数据库,会导致数据库无法被应用程序使用,它无法像mongodump那样进行热备份,所以使用上并不是很方便。
最后,当备份完成后, 记得解锁数据库:
> db.fsyncUnlock()
注意,这个命令将会发起解锁请求,数据库可能会无法正常解锁,可以运行db.currentOp()
来验证当前数据库是否正常解锁了。
Compass
最后,介绍一种傻瓜式
的备份方案,就是通过Compass,Compass是MongoDB提供的一种图形化工具,很适合对命令行恐惧的人士(老板或产品经理),当登陆到Compass后,选定需要备份的文档,点击Export Collection即可,如下图:
它提供了两种格式的文件,一种是JSON,一种是CSV。如果要导入,点击ADD DATA
中的Import File
即可,但这种方式无法备份索引,优点是操作很直观。
小结
可以看出,上面的各种备份方式都各有利弊
,在实际的使用过程中,需要根据自己的实际场景,来选择合适的备份方式。