目录算法
MongoDB 备份的几种方式:mongodb
mongodump 是 MongoDB 官方提供的备份工具,它能够从 MongoDB 数据库读取数据,并生成 BSON 文件,mongodump 适合用于备份和恢复数据量较小的 MongoDB 数据库,不适用于大数据量备份。shell
默认状况下 mongodump 不获取 local 数据库里面的内容。数据库
mongodump 仅备份数据库中的文档,不备份索引,因此咱们还原后,须要从新生成索引。json
mongodump 备份过程当中会对 mongod 服务的性能产生影响,咱们建议在业务低峰期进行操做。若是咱们备份的数据,大于系统内存,咱们备份的时候容易出现错误。并发
在执行 mongodump 的时候,mongod 服务仍是能够提供服务的,能够进行修改数据,若是咱们在备份的时候加上参数 --oplog 的话,那么 oplog 是会记录这一次操做的,若是咱们想在 restore 的时候也有日志记录,咱们可使用 mongorestore --oplogReplay 进行恢复工具
官方文档:mongodump性能
mongodump 默认输出的目录名为 dump ,若是输出路径包含 dump 目录,会直接覆盖的。 默认备份是没有压缩的。大数据
参数:ui
--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
当咱们的删除一个集合的数据,这个集合有10000条数据,那么在 Oplog 里面也是会有 10000条删除记录。
这样的操做就会致使 Oplog 里面的以前的操做记录会被快速覆盖。
因此咱们在备份的时候,须要注意 备份的间隔时间 和 Oplog 记录被覆盖的时间(也就是 Oplog 记录了多长时间的日志 )。要后者大于前者。
示例:
咱们的备份计划是,天天备份一次数据,Oplog 记录的保持时间要大于1天。
Oplog 的开启是须要开启副本集才能开启的,因此以上备份策略是针对副本集。
咱们能够直接复制数据文件,可是咱们必须在复制文件前中止对 MongoDB 的操做,不然咱们复制的文件是无效的。
注意如下操做是针对单节点。
在乎外关闭节点后,咱们进行从新节点,发现有以下的日志错误:
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
文件。而是,使用上述过程来恢复数据库。在严峻的状况下,您能够删除文件,使用可能损坏的文件启动数据库,并尝试从数据库中恢复数据,但这存在风险。
咱们部分的数据都是二进制的,咱们直接查看是查看不到的,那么咱们能够经过工具 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"}}
mongorestore
能够建立新的数据库或将数据添加到现有的数据库,可是 mongorestore
仅仅执行insert
操做,不执行 update
操做。这就意味着若是将文档还原到现有的数据库,现有的数据库中的文档的_id
的值和要还原的文档中的_id
值是同样的,是不会将数据库原有的值覆盖的。mongorestore
会重建索引。mongorestore
不恢复 system.profile
的数据--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 # 指定还原数据储存目录。
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