将旧版mongo的数据库转储还原到新版本的mongo

sp4*_*497 7 database-backups mongodb mongorestore mongodump

目前,我有一个旧版本的mongo,即2.6在我的系统上运行.我已经将我的网站投入生产并拥有大量客户数据.我计划升级到mongo 3.2.

所以,我的问题是mongo v3.2的 mongorestore是否与v2.6的数据转储一起工作?或者,它是否会产生问题?

任何答案都是无价的!谢谢

Bru*_*sky 15

在MongoDB官方邮件列表上问了同样的问题.他们说不要一次升级超过1个主要版本.(主要版本为:2.2,2.4,2.6,3.0,3.2,3.4)

我不想按照安装每个版本的正常升级过程来启动mongod然后关闭它.这对我来说就像它会留下瑕疵,我喜欢让我的基础设施建立脚本和版本控制.因此,我决定使用最新的Ubuntu启动新的EC2实例(因为我的Mongo v2.4服务器也支持2个LTS版本)和最新的MongoDB.我使用了MongoDB中间版本的docker镜像来进行数据升级.

https://gist.github.com/RichardBronosky/2d04c7c2e9a5bea67cd9760a35415a3f#file-uat_mongodb_upgrade_from_prod-sh

大部分解决方案是这样的:

# mongo.conf is using the default dbPath: /var/lib/mongodb
# this path is for temporary use by the mongo docker container
mkdir -p /data/db/dump
# see: https://hub.docker.com/_/mongo/ (search for /data/db)
# see: https://github.com/docker-library/mongo/blob/30d09dbd6343d3cbd1bbea2d6afde49f5d9a9295/3.4/Dockerfile#L59
cd /data/db
mongodump -h prodmongo.int

# Get major versions from https://hub.docker.com/r/library/mongo/tags/
step=0
for major_version in 2.6.12 3.0.14 3.2.11 3.4.1; do
    sudo docker stop some-mongo || true
    sudo docker rm   some-mongo || true
    sudo docker run --name some-mongo -v /data/db:/data/db -d mongo:$major_version
    false; while [[ $? > 0 ]]; do
        sleep 0.5
        sudo docker exec -it some-mongo mongo --eval 'printjson((new Mongo()).getDBNames())'
    done
    if (( $step == 0 )); then
        sudo docker exec -it some-mongo mongorestore /data/db/dump
    fi
    ((step += 1))
done

# Finish up with docker
sudo rm -rf /data/db/dump/*
sudo docker exec -it some-mongo bash -c 'cd /data/db; mongodump'
sudo docker stop some-mongo
sudo docker rm   some-mongo

# Load upgraded data into latest version of MongoDB (WiredTiger storage engine will be used)
mongorestore /data/db/dump
sudo rm -rf /data
Run Code Online (Sandbox Code Playgroud)

  • 当我的回答得到提升并且没有评论时,它总是吓坏我.我的代码真的可以清楚吗?毕竟是bash. (2认同)
  • 只评论布鲁诺的想法;)谢谢你,布鲁诺!你救了我的一天(或两个:)!它并没有"开箱即用",因为我无法远程获得"mongodump -h <host>",因为"/"驱动器上需要的可用空间,所以还必须在亚马逊上安装新的独立30GB EBS(并因此改变路径.同样在第1步(当你做mongorestore时)出现错误:进入命名空间[admin.system.users]断言:17415无法将具有模式版本1的用户恢复到服务器版本为2.5.4或更高版本的系统",解决方法是remove/data/db/dump/admin文件夹. (2认同)

pro*_*r79 6

由于您拥有来自mongo 2.6的数据,因此已经满足索引字段限制.Mongo 3.2将毫无问题地恢复此备份.

你可以升级你的数据库的另一种方式(如果你有副本集)是用3.2替换一个2.6成员并等待同步,然后另一个......这将为你提供业务连续性:-)