MongoDB 备份与还原 mongodump、mongorestore
MongoDB 备份与还原 一、 MongoDB 备份 MongoDB 备份的几种方式: mongodump 系统快照(这里不做详细介绍,具体内容见官网:Back Up with Filesystem Snapshots) cp 或者 rsync 1、mongodump mongodump 是 Mongo
MongoDB 备份与还原
一、 MongoDB 备份
MongoDB 备份的几种方式:
mongodump 系统快照(这里不做详细介绍,具体内容见官网:Back Up with Filesystem Snapshots) cp 或者 rsync 1、mongodump
mongodump 是 MongoDB 官方提供的备份工具,它可以从 MongoDB 数据库读取数据,并生成 BSON 文件,mongodump 适合用于备份和恢复数据量较小的 MongoDB 数据库,不适用于大数据量备份。
默认情况下 mongodump 不获取 local 数据库里面的内容。
mongodump 仅备份数据库中的文档,不备份索引,所以我们还原后,需要重新生成索引。
mongodump 备份过程中会对 mongod 服务的性能产生影响,我们建议在业务低峰期进行操作。如果我们备份的数据,大于系统内存,我们备份的时候容易出现错误。
在执行 mongodump 的时候,mongod 服务还是可以提供服务的,可以进行修改数据,如果我们在备份的时候加上参数 --oplog 的话,那么 oplog 是会记录这一次操作的,如果我们想在 restore 的时候也有日志记录,我们可以使用 mongorestore --oplogReplay 进行恢复
1.1、mongodump常用命令和参数
官方文档:mongodump
mongodump 默认输出的目录名为 dump ,如果输出路径包含 dump 目录,会直接覆盖的。 默认备份是没有压缩的。
参数:
--host
--username
--repir # 修复数据时使用 下面有详细介绍
--oplog # mongodump 会将 mongodump 执行期间的 oplog 日志 输出到文件 oplog.bson,这就意味着从备份开始到备份结束的数据操作我们都可以记录下来。
--archive
--dumpDbUsersAndRoles # 只有在 使用 --db 时才适用,备份数据库的包含的用户和角色。 --excludeCollection string # 排除指定的集合,如果要排除多个,使用多个--excludeCollection --numParallelCollections int, -j int # 并行导出的集合数,默认为4
--ssl # 指定 TLS/SSL 协议
--sslCAFile filename # 指定认证文件名
--sslPEMKeyFile
示例:
排除指定的集合
mongodump --db test --excludeCollection=users --excludeCollection=salaries
指定ip,端口,用户名,认证,压缩,输出目录
mongodump --host mongodb1.example.net --port 37017 --username user --password "pass" --gzip --out /opt/backup/mongodump-2019-04-17
1.2 、注意
当我们的删除一个集合的数据,这个集合有10000条数据,那么在 Oplog 里面也是会有 10000条删除记录。
这样的操作就会导致 Oplog 里面的之前的操作记录会被快速覆盖。
所以我们在备份的时候,需要注意 备份的间隔时间 和 Oplog 记录被覆盖的时间(也就是 Oplog 记录了多长时间的日志 )。要后者大于前者。
示例:
我们的备份计划是,每天备份一次数据,Oplog 记录的保持时间要大于1天。
Oplog 的开启是需要开启副本集才能开启的,所以以上备份策略是针对副本集。
2 、cp 或者rsync
我们可以直接复制数据文件,但是我们必须在复制文件前停止对 MongoDB 的操作,否则我们复制的文件是无效的。
3、单节点意外关闭后,如何恢复数据
注意以下操作是针对单节点。
在意外关闭节点后,我们进行重新节点,发现有如下的日志错误:
2018-10-24T18:05:18.248-0400 W STORAGE [initandlisten] Detected unclean shutdown - mongod.lock is not empty.
...
2018-10-24T17:24:53.122-0400 E STORAGE [initandlisten] Failed to get the cursor for uri: table:collection-2-6854866147293273505 2018-10-24T17:24:53.122-0400 E STORAGE [initandlisten] This may be due to missing data files. ...
...
***aborting after fassert() failure
并且在 数据储存路径中有一个 mongod.lock 文件。
我们可以使用 mongod --repair 来恢复数据。
在MongoDB中4.0.3,对 WiredTiger 引擎,使用该命令会进行以下操作
重建所有索引 丢弃损坏的数据 为残缺的元数据创建存根文件。对于MMAPv1 引擎
重建所有索引 丢弃损坏的数据
数据恢复流程:
先备份现有的数据
我们可以用 cp 命令将现有的数据的整个目录的所有文件都备份一份。
使用 mongod --repair
- 针对 所有数据库 mongod --repair
- 针对 单个数据库 mongod --dbpath /opt/mongodb/data/djx --repair
一般情况下,你不应该手动删除该mongod.lock文件。而是,使用上述过程来恢复数据库。在严峻的情况下,您可以删除文件,使用可能损坏的文件启动数据库,并尝试从数据库中恢复数据,但这存在风险。
4、查看备份数据
我们部分的数据都是二进制的,我们直接查看是查看不到的,那么我们可以通过工具 bsondump(安装 MongoDB 自带了) 来进行查看。
[root@djx uu_dev]# bsondump order_detail.bson 2019-04-17T16:14:51.430+0800 549 objects found {"_id":{"$oid":"5cae98d0f23d932dscdfc2ff"}} {"_id":{"$oid":"5cae98d0f23d932dscdfca00"}} {"_id":{"$oid":"5cae98d1f23d932dscdfca31"}} {"_id":{"$oid":"5cae98d1f23d932dscdfca32"}}
二、MongoDB 还原
1、mongorestore特点 mongorestore 可以创建新的数据库或将数据添加到现有的数据库,但是 mongorestore 仅仅执行insert 操作,不执行 update操作。这就意味着如果将文档还原到现有的数据库,现有的数据库中的文档的_id的值和要还原的文档中的_id 值是一样的,是不会将数据库原有的值覆盖的。 重建索引,mongorestore 会重建索引。 mongorestore 不恢复 system.profile 的数据 2、mongorestore 常用参数 --help # 查看帮助 --quiet # 通过抑制 MongoDB的复制,连接等活动,来实现数据恢复。
--host
--username