物理备份恢复至自建数据库
副本集实例只有一份数据,分片集群每个片会有一份数据,请您根据自身业务需要来选择性恢复数据。下文介绍的是单份数据的恢复方法。
恢复数据至单节点
1. 将数据拷贝至自建数据库的数据目录(需保证该目录为空),例如目录为 /data/27017/。
cp -r * /data/27017/
2. 重启 mongod 并校验数据。命令示例如下:
./mongod --dbpath /data/27017 --port 27017 --logpath /var/log/mongodb/27017.log --fork
恢复数据至副本集
物理备份默认带有原实例的配置,因此需移除原有配置,否则可能导致数据无法访问。
1. 将数据恢复至单节点自建数据库,然后以副本集方式重启该节点。重启命令示例如下:
./mongod --replSet mymongo --dbpath /data/27017 --port 27017 --logpath /var/log/mongodb/27017.log --fork
2. 登录该节点清除原实例的副本集配置,命令如下:
rs.slaveOk()use localdb.system.replset.remove({})
3. 重启该节点,将新节点加入副本集进行初始化并校验数据,加入副本集的节点需已启动且无数据。命令示例如下:
rs.initiate({"_id":"mymongo","members":[{"_id":0,"host":"127.0.0.1:27017"},{"_id":1, "host":"127.0.0.1:27018"},{"_id":2, "host":"127.0.0.1:27019"}]})
说明:
不支持恢复数据至分片集群,由于分片集群物理备份的路由缺失,所以即使将每个分片的数据恢复至自建副本集(分片集群的每一个片),mongos 也只能读取到主分片的数据。
逻辑备份恢复至自建数据库
为不影响数据恢复到自建数据库之后的验证,需确保自建数据库为空。
对于3.6版本,需手动删除 config 目录再依次使用 mongorestore 命令恢复每个片的数据。如下图所示:
对于3.2版本,需手动将单个库表的文件合并后才能恢复数据。合并文件操作示例如下:
数据库
ycsb
目录下有一个表格为c_10
,该表格涉及的数据文件为c_10.bson.gz.chunk-64
至c_10.bson.gz.chunk-127
,则合并命令为cat c_10.bson.gz.chunk-* > ./c_10.bson.gz
。说明:
3.2版本部分场景下时会出现 chunk 区分。
使用 mongorestore 命令恢复数据,-h 参数指定自建数据库地址,--dir 参数指定数据文件所在目录,必须指定 --gzip 参数来解压备份文件。命令如下:
./mongorestore --gzip --drop -h127.0.0.1:27017 --dir ./1544517027220146694