【问题标题】:Restoring the database dump of an older version of mongo to a new version of mongo将旧版本 mongo 的数据库转储恢复到新版本 mongo
【发布时间】:2016-06-15 11:02:03
【问题描述】:

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

所以,我的问题是 mongo v3.2 的 mongorestore 是否适用于 v2.6 的数据转储?或者,它是否会产生问题?

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

【问题讨论】:

    标签: mongodb database-backups mongodump mongorestore


    【解决方案1】:

    我问过这个same question on the official MongoDB mailing list。他们说一次不要升级超过 1 个主要版本。 (主要版本为:2.2、2.4、2.6、3.0、3.2、3.4)

    我不想遵循安装每个版本的正常升级过程只是为了启动 mongod 然后将其关闭。对我来说,这感觉就像它会留下杂乱无章的东西,我喜欢让我的基础架构构建脚本化和版本控制。因此,我决定使用最新的 Ubuntu(因为我的 Mongo v2.4 服务器也落后 2 个 LTS 版本)和最新的 MongoDB 启动新的 EC2 实例。我使用 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
    

    【讨论】:

    • 当我的答案得到支持而没有 cmets 时,我总是吓坏了。我的代码真的可以这么清楚吗?毕竟是 bash。
    • 只为布鲁诺的想法发表评论;)谢谢你,布鲁诺!你拯救了我的一天(或两天:)!它没有“开箱即用”,因为我无法远程获取“mongodump -h ”,由于“/”驱动器上所需的可用空间运气好,还不得不在亚马逊上安装新的单独 30GB EBS(并相应地在这里和那里改变路径)。同样在第一步(当您执行 mongorestore 时)出现错误:进入命名空间 [admin.system.users] 断言:17415 无法将具有架构版本 1 的用户还原到具有服务器版本 2.5.4 或更高版本的系统”,解决方法是删除 /data/db/dump/admin 文件夹。
    【解决方案2】:

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

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

    【讨论】:

    • 是的,我在 MongoDB 官方邮件列表上问过这个问题,他们说一次不要升级超过 1 个主要版本。 (主要版本为:2.2、2.4、2.6、3.0、3.2、3.4)groups.google.com/d/msg/mongodb-user/cbXeM283iHM/y0QbW1h4BQAJ
    • 只是添加一个说明以供将来参考:上面的链接指出,当它们是同一副本集的一部分时,只有相邻的主要版本才能相互兼容以进行升级。但是,它清楚地表明了将 2.4 的转储直接恢复到 3.2 的路径,唯一需要注意的是身份验证模式。所以要回答最初的问题 - 这应该在实践中起作用。
    【解决方案3】:

    Bruno's answer 为我工作到 3.4 版,但是每次更新都需要设置一个功能兼容版本,然后在 4.2 时你无法启动 mongo,如果你还在使用 MMAPv1,您需要切换到 WiredTiger。

    所以,非常感谢布鲁诺,你让我大部分时间到达那里。

    以下是我更新的脚本,希望对大家有所帮助!

    #!/bin/bash
    
    # Log commands to stdout
    set -o xtrace
    # Exit on error
    set -o errexit
    # Exit on use of unset variables
    set -o nounset
    # Exit and report on pipe failure
    set -o pipefail
    
    # 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
    # our docker host holding the database
    mongodump -h $PROD_MONGO_IP
    
    # Get major versions from https://hub.docker.com/r/library/mongo/tags/
    step=0
    prev_real_major=""
    for major_version in 2.6.12 3.0.15 3.2.21 3.4.24 3.6.23 4.0.27 4.2.17 4.4.10 5.0.3; do
        real_major=`echo $major_version | cut -f1,2 -d "."`
        sudo docker stop some-mongo || true
        sudo docker rm some-mongo || true
        docker run --rm -d --name some-mongo -v /data/db:/data/db mongo:$major_version
        set +o errexit
        false; while [[ $? > 0 ]]; do
            sleep 0.5
            docker exec -it some-mongo mongo --eval 'printjson((new Mongo()).getDBNames())'
            if [[ $real_major > 3.3 ]]; then
                docker exec -it some-mongo mongo --eval "db.adminCommand( { setFeatureCompatibilityVersion: \"$real_major\" } )"
            fi
        done
        set -o errexit
        if (( $step == 0 )); then
            docker exec -it some-mongo mongorestore /data/db/dump
        fi
        # upgrade to WiredTiger
        if [[ $real_major == 4.0 ]]; then
            # delete the database dump from earlier
            rm -rf /data/db/dump/
            # dump the database again
            docker exec -w /data/db -it some-mongo mongodump
            # stop the existing mongo container
            docker stop some-mongo
            # delete everything in /data/db except /data/db/dump
            find /data/db -mindepth 1 ! -regex '^/data/db/dump\(/.*\)?' -delete
            # run the 4.0 mongo container again
            docker run --rm -d --name some-mongo -v /data/db:/data/db mongo:$major_version
            # restore the database, which automatically makes it wiretiger.
            docker exec -it some-mongo mongorestore /data/db/dump
        fi
        ((step += 1))
    done
    
    # Finish up with docker
    sudo rm -rf /data/db/dump/*
    docker exec -it some-mongo bash -c 'cd /data/db; mongodump'
    docker stop some-mongo
    
    # Commented these out because I did them manually, you decide what you want to do here
    # Load upgraded data into latest version of MongoDB (WiredTiger storage engine will be used)
    # mongorestore /data/db/dump
    # sudo rm -rf /data
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-01
      • 2020-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多