恢复至自建数据库

最近更新时间:2019-08-30 17:51:34

物理备份恢复至自建数据库

副本集实例只有一份数据,分片集群每个片会有一份数据,请您根据自身业务需要来选择性恢复数据。下文介绍的是单份数据的恢复方法。

恢复数据至单节点

  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 local
    db.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"}]})
    rs.initiate() 命令介绍请参见 MongoDB 官网文档
说明:

不支持恢复数据至分片集群,由于分片集群物理备份的路由缺失,所以即使将每个分片的数据恢复至自建副本集(分片集群的每一个片),mongos 也只能读取到主分片的数据。

逻辑备份恢复至自建数据库

  • 为不影响数据恢复到自建数据库之后的验证,需确保自建数据库为空。
  • 对于3.6版本,需手动删除 config 目录再依次使用 mongorestore 命令恢复每个片的数据。如下图所示:
  • 对于3.2版本,需手动将单个库表的文件合并后才能恢复数据。合并文件操作示例如下:
    数据库ycsb目录下有一个表格为c_10,该表格涉及的数据文件为c_10.bson.gz.chunk-64c_10.bson.gz.chunk-127,则合并命令为cat c_10.bson.gz.chunk-* > ./c_10.bson.gz

使用 mongorestore 命令恢复数据,-h 参数指定自建数据库地址,--dir 参数指定数据文件所在目录,必须指定 --gzip 参数来解压备份文件。命令如下:

./mongorestore  --gzip --drop -h127.0.0.1:27017 --dir ./1544517027220146694