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 默认输出的目录名为 dump , 如果输出路径包含 dump 目录, 会直接覆盖的. 默认备份是没有压缩的.
参数:
- --host <hostname><:port>, -h <hostname><:port> # 指定备份的主机 ip 和端口号, 默认值 localhost:27017
- --port # 指定端口号 默认 27017
- --username <username>, -u <username> # 指定用户名
- --password <password>, -p <password> # 指定密码
- --authenticationDatabase <dbname> # 指定认证的数据库
- --authenticationMechanism <name> # 指定认证的算法 , 默认值 SCRAM-SHA-1
- --db <database>, -d <database> # 指定备份的数据库, 未指定的话, 备份所有的数据库, 但不包含 local 库
- --collection <collection>, -c <collection> # 指定备份的集合, 未指定则备份指定库中的所有集合.
- --query <JSON>, -q <JSON> # 指定 JSON 作为查询条件. 来备份我们过滤后的数据.
- --queryFile <path> # 指定 JSON 文档路径, 以该文档的内容作为查询条件, 来备份我们过滤后的数据.
- --quit # 通过抑制 MongoDB 的复制, 连接等活动, 来实现备份.
- --gzip # 开启压缩, 3.2 版本后可以使用, 输出为文件的话会带有后缀. gz
- --out <path>, -o <path> # 输出的目录路径
- --repir # 修复数据时使用 下面有详细介绍
- --oplog # mongodump 会将 mongodump 执行期间的 oplog 日志 输出到文件 oplog.bson, 这就意味着从备份开始到备份结束的数据操作我们都可以记录下来.
- --archive <file> # 输出到单个存档文件或者是直接输出.
- --dumpDbUsersAndRoles # 只有在 使用 --db 时才适用, 备份数据库的包含的用户和角色.
- --excludeCollection string # 排除指定的集合, 如果要排除多个, 使用多个 --excludeCollection
- --numParallelCollections int, -j int # 并行导出的集合数, 默认为 4
- --ssl # 指定 TLS/SSL 协议
- --sslCAFile filename # 指定认证文件名
- --sslPEMKeyFile <filename>
- --sslPEMKeyPassword <value>
- --sslCRLFile <filename>
- --sslAllowInvalidCertificates
- --sslAllowInvalidHostnames
- --sslFIPSMode
示例:
排除指定的集合
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 <hostname><:port>, -h <hostname><:port> # 指定恢复的主机 ip 和端口号, 默认值 localhost:27017
- --port # 指定端口号 默认 27017
- --username <username>, -u <username> # 指定用户名
- --password <password>, -p <password> # 指定密码
- --authenticationDatabase <dbname> # 指定认证的数据库
- --authenticationMechanism <name> # 指定认证的算法 , 默认值 SCRAM-SHA-1
- --objcheck # 开启验证, 验证还原操作, 确保没有无效的文档插入数据库. 会有较小的性能影响
- --oplogReplay # 恢复备份数据并将 mongodump 执行期间的操作 (记录在导出的日志) 恢复.
- --oplogLimit # 指定恢复
- --oplogFile # 指定 Oplog 路径
- --keepIndexVersion # 阻止 mongorestore 在还原过程中将索引升级到最新版本.
- --restoreDbUsersAndRoles # 还原指定的数据库用户和角色.
- --maintainInsertionOrder # 默认值为 False, 如果为 True,mongorestore 将按照输入源的文档顺序插入, 否则是 随机执行插入.
- --numParallelCollections int, -j int # 指定并行恢复的集合数.
- --numInsertionWorkersPerCollection int # 默认值为 1, 指定每个集合恢复的并发数, 大数据量导入增加该值可提高 恢复速度.
- --gzip # 从压缩文档中 恢复.
- --archive # 从归档文件中恢复.
- --dir # 指定还原数据储存目录.
3, 还原示例
- mongorestore --collection people --db accounts dump/
- mongorestore --host mongodb1.example.NET --port 37017 --username user --password "pass" /opt/backup/mongodump-2011-10-24
- mongorestore --gzip --archive=test.20150715.gz --db test
- mongorestore --archive=test.20150715.archive --db test
来源: http://www.linuxidc.com/Linux/2019-05/158612.htm